文章
· 五月 26, 2021 阅读大约需 6 分钟

第七章 从POP3服务器提取电子邮件

第七章 从POP3服务器提取电子邮件

将附件另存为文件

Content-Disposition标头可以指定附件,可以带文件名,也可以不带文件名。例如:

Content-Disposition: attachment; filename=genome.jpeg;

如果Content-Disposition标头确实指定了附件,则%Net.POP3实例可以将邮件中的所有附件保存到文件。要实现这一点,请执行以下操作:

  1. 指定%Net.POP3实例的以下属性:
  • StoreAttachToFile指定为%1
  • StoreInlineToFile指定为%1
  • AttachDir指定有效目录。根据操作系统的不同,确保使用斜杠(/)或反斜杠(\)结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  1. 调用%Net.POP3实例的Fetch()FetchMessage()

每个文件名的确定方式如下:

  1. 如果Content-Disposition标头指定了文件名,则使用该文件名。
  2. 否则,如果Content-Type标头指定了文件名,则使用该文件名。
  3. 否则,系统将创建格式为ATTxxxxx.dat的名称。

请注意以下几点:

  • 如果该文件已存在,则不会下载附件。
  • AttachDir没有默认值。
  • 附件的大小不受IRIS的限制,但可能受文件系统的限制。
  • 这里不使用DirFileName属性。它们仅在将附件上载到邮件时才相关,如向邮件添加附件中所述。

示例: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服务器的StoreAttachToFileStoreInlineToFileAttachDir属性,则在调用此方法时,这些附件将保存到给定目录。

获取附加电子邮件

当连接到邮箱时,可以下载附加到收件箱中电子邮件的任何电子邮件。为此,请使用%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()回滚更改。

讨论 (0)1
登录或注册以继续