第七章 从POP3服务器提取电子邮件
将附件另存为文件
Content-Disposition
标头可以指定附件,可以带文件名,也可以不带文件名。例如:
Content-Disposition: attachment; filename=genome.jpeg;
如果Content-Disposition
标头确实指定了附件,则%Net.POP3
实例可以将邮件中的所有附件保存到文件。要实现这一点,请执行以下操作:
- 指定
%Net.POP3
实例的以下属性:
- 将
StoreAttachToFile
指定为%1
。 - 将
StoreInlineToFile
指定为%1
。 - 为
AttachDir
指定有效目录。根据操作系统的不同,确保使用斜杠(/
)或反斜杠(\
)结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
- 调用
%Net.POP3
实例的Fetch()
或FetchMessage()
。
每个文件名的确定方式如下:
- 如果
Content-Disposition
标头指定了文件名,则使用该文件名。 - 否则,如果
Content-Type
标头指定了文件名,则使用该文件名。 - 否则,系统将创建格式为
ATTxxxxx.dat
的名称。
请注意以下几点:
- 如果该文件已存在,则不会下载附件。
AttachDir
没有默认值。- 附件的大小不受IRIS的限制,但可能受文件系统的限制。
- 这里不使用
Dir
和FileName
属性。它们仅在将附件上载到邮件时才相关,如向邮件添加附件中所述。
示例:GetMsg()
下面的示例方法在给定%Net.POP3
实例和邮件编号的情况下检索整个邮件:
ClassMethod GetMsg(server as %Net.POP3,msgno as %Integer) as %Net.MailMessage
{
Set status=server.Fetch(msgno,.msg)
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Quit $$$NULLOREF
}
Quit msg
}
如果邮件有附件,并且指定了%Net.POP3
服务器的StoreAttachToFile
、StoreInlineToFile
和AttachDir
属性,则在调用此方法时,这些附件将保存到给定目录。
获取附加电子邮件
当连接到邮箱时,可以下载附加到收件箱中电子邮件的任何电子邮件。为此,请使用%Net.POP3
实例的GetAttachedEmail()
方法检索附带的电子邮件的内容。
在给定%Net.MailMessagePart
实例的情况下,此方法返回包含该消息部分内容的单部分消息。具体地说,它返回(作为输出参数)%Net.MailMessage
的实例,该实例使用从附加电子邮件中获取的数据进行初始化。
其他消息检索方法
本节列出了%Net.POP3
可用于检查和检索邮件的所有方法。
Fetch()
method Fetch(MessageNumber As %Integer, ByRef MailMsg As %Net.MailMessage, Delete As %Boolean = 0, messageStream As %BinaryStream) as %Status
返回(通过引用)由MessageNumber
指示的消息,并选择性地将该消息标记为删除。请注意,如果邮件已标记为删除,则此方法将返回错误状态。
如果指定了messageStream
,则原始消息将写入此二进制流。
FetchFromStream()
method FetchFromStream(messageStream As %BinaryStream, ByRef Msg As %Net.MailMessage) as %Status
此方法在为FETCH()
指定messageStream
参数时使用。
从给定的二进制流中检索单个电子邮件。MessageStream
必须是包含消息的二进制流。消息在MSG中通过引用返回。这可能是一条由多部分组成的消息。
FetchMessageInfo()
method FetchMessageInfo(MessageNumber As %Integer, Lines As %Integer, ByRef From As %String, ByRef To As %String, ByRef Date As %String, ByRef Subject As %String, ByRef MessageSize As %Integer, ByRef MsgHeaders As %ArrayOfDataTypes, ByRef MessageText As %String) as %Status
在给定消息编号的情况下,此方法返回(通过引用)该消息的特定消息头、消息大小、消息头数组和给定的文本行数。如果邮件当前标记为删除,则此方法返回错误状态。
GetAttachedEmail()
method GetAttachedEmail(msgpart As %Net.MailMessagePart, Output mailmsg As %Net.MailMessage) as %Status
在给定消息部分的情况下,此方法返回(作为输出参数)使用消息部分的数据初始化的单部分电子邮件消息。
GetMessageUID()
method GetMessageUID(MessageNumber As %Integer, ByRef UniqueID As %String) as %Status
在给定消息编号的情况下,通过引用返回消息的UID。有关消息编号和UID的详细信息,请参阅上一节。如果邮件当前标记为删除,则此方法返回错误状态。
GetMessageUIDArray()
method GetMessageUIDArray(MessageNumber As %String = "", ByRef ListOfUniqueIDs As %ArrayOfDataTypes) as %Status
如果给定空字符串作为第一个参数,此方法将通过引用返回有关邮箱中邮件的信息数组(不包括当前标记为删除的任何邮件)。此数组中的每个元素都包含有关一条消息的以下信息:
Array Key | Array Item |
---|---|
邮箱中当前状态的邮件编号。第一条消息是数字1,依此类推。给定消息的消息编号不能保证在所有会话中都相同。 | 唯一消息标识符(UID),它是此消息在所有会话中可用的永久标识符。UID对于每个邮箱都是唯一的。 |
或者,在给定消息编号的情况下,此方法返回一个包含该消息的UID的单元素数组。在这种情况下,如果邮件当前被标记为删除,则该方法返回错误状态。
GetSizeOfMessages()
method GetSizeOfMessages(MessageNumber As %String = "", ByRef ListOfSizes As %ArrayOfDataTypes) as %Status
如果给定空字符串作为第一个参数,此方法将通过引用返回有关邮箱中邮件的信息数组(不包括当前标记为删除的任何邮件)。此数组中的每个元素都包含有关一条消息的以下信息:
Array Key | Array Item |
---|---|
邮箱中当前状态的邮件编号。 | 此消息的大小(以字节为单位)。 |
或者,在给定消息编号的情况下,此方法返回一个包含该消息大小(以字节为单位)的单元素数组。在这种情况下,如果邮件当前标记为删除,此方法将返回错误状态。
删除邮件
当连接到邮箱时,可以在登录的邮箱中标记要删除的邮件。可以通过几种方式来实现这一点。
- 可以使用
DeleteMessage()
方法。此方法接受一个参数,即要删除的消息编号。 - 当使用
Fetch()
或FetchMessage()
方法检索邮件时,可以指定一个可选参数,告知POP3
服务器在检索邮件后将其标记为删除。
请记住以下几点:
- 这些方法不会删除邮件;它们会将其标记为删除。在使用
QuitAndCommit()
完成POP3
事务之前,邮件不会被删除。如果只是断开与服务器的连接,所做的更改将被丢弃。 - 可以调用
RollbackDeletes()
方法来更改消息,以便不再将它们标记为删除。 - 这些方法中的每一个都返回一个状态,您应该检查该状态。
示例:GetMsgAndDelete()
和CommitteeChanges()
下面的示例检索一封邮件并将其标记为删除:
ClassMethod GetMsgAndDelete(ByRef server As %Net.POP3, msgno As %Integer) As %Net.MailMessage
{
//third argument to Fetch says whether to
//mark for deletion
Set status=server.Fetch(msgno,.msg,1)
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Quit $$$NULLOREF
}
Quit msg
}
请注意,此消息返回(通过引用)%Net.POP3
的更改版本;更改后的版本包含有关哪条消息被标记为删除的信息。
可以将上述方法与如下所示的方法一起使用:
ClassMethod CommitChanges(server As %Net.POP3) As %Status
{
//commit all changes and log out
Set status=server.QuitAndCommit()
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Quit $$$ERROR($$$GeneralError,"Failed to commit changes")
}
Quit $$$OK
}
或者,可以使用RollbackDeletes()
或QuitAndRollback()
回滚更改。
今天的文章第七章 从POP3服务器提取电子邮件分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21928.html