文章
姚 鑫 · 五月 25 阅读大约需 7 分钟

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

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

从POP3服务器提取电子邮件

与POP3服务器通信

如果拥有所需的权限,并且邮件服务器正在运行,则可以使用POP3协议从该服务器下载和处理电子邮件。通常,要与POP3服务器通信,请登录,执行一系列影响邮箱的操作,然后提交或回滚任何更改。要在系统间IRIS中执行此操作,请执行以下操作:

  1. 创建%Net.POP3的实例。此对象描述将使用的POP3服务器。
  2. 可以选择指定%Net.POP3实例的以下属性:
  • port -指定要使用的端口;默认值为110
  • timeout 超时-指定读取超时(以秒为单位);默认值为30秒。
  • StoreAttachToFile-指定在读取邮件时(当邮件包含Content-Disposition;附件标题时)是否将每个附件保存到文件。默认值为False。请注意,除非还设置了AttachDir,否则此设置不起任何作用。
  • StoreInlineToFile-指定在读取邮件时(当邮件包含Content-Disposition;内联标题时)是否将每个内联附件保存到文件中。默认值为False。请注意,除非还设置了AttachDir,否则此设置不起任何作用。
  • AttachDir-指定将附件保存到的目录。没有违约。根据操作系统的不同,确保使用斜杠(/)或反斜杠(\)结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  • IgnoreInvalidBase64Chars-指定是否忽略在base-64解码期间发现的无效字符。默认值为FALSE(无效字符会导致错误)。请注意,RFC 2045对于应忽略意外字符还是应在Base-64解码期间导致错误的问题含糊不清。
  1. 要使用SSL/TLS连接到POP3服务器,请执行以下操作:

a. 将SSLConfiguration属性设置为要使用的已激活SSL/TLS配置的名称。

b. 将UseSTARTTLS属性设置为0或1。

在大多数情况下,使用值0。如果服务器交互在普通TCP套接字上开始,然后在与普通套接字相同的端口上切换到TLS,则使用值1。

c. 或者,将SSLCheckServerIdentity属性设置为1。如果要验证证书中的主机服务器名称,请执行此操作。

  1. 调用实例的Connect()方法。此方法按顺序接受三个参数:

a. POP3服务器的名称

b. 用户名

c. 密码

  1. 使用实例的方法检查邮箱、检索邮件和删除邮件。以下各节提供了详细信息。
  2. 或者,要防止连接超时,请调用%Net.POP3实例的Ping()方法。
  3. 或者,如果已将邮件标记为要删除,但现在选择不删除它们,请调用%Net.POP3实例的RollbackDeletes()方法。
  4. 完成对邮箱的更改后,请调用以下方法之一:
  • QuitAndCommit()-提交更改并从邮件服务器注销。
  • QuitAndRollback()-回滚更改并从邮件服务器注销。

这些方法中的每一个都返回一个状态,应该在继续之前检查该状态。另请参阅%Net.POP3的类引用以获取完整的方法签名。

以下各节中的示例使用了本手册编写时可用的两种不同的免费POP3服务。选择这些服务并不意味着特别认可。还要注意的是,这些示例并没有显示实际的密码。

示例1:HotPOPAsPOP3()

以下方法使用以前为此设置的帐户登录到HotPOP POP3服务器:

ClassMethod HotPOPAsPOP3() As %Net.POP3
{
    Set server=##class(%Net.POP3).%New()

    //HotPOP POP3服务器使用默认端口,
    Set server.port=110

    //以防我们计划获取任何带有附件的邮件
    Set server.StoreAttachToFile=1
    Set server.StoreInlineToFile=1
    Set server.AttachDir="c:\DOWNLOADS\"

    Set servername="pop.hotpop.com"
    Set user="isctest@hotpop.com"
    Set pass="123pass"

    Set status=server.Connect(servername,user,pass)
    If $$$ISERR(status) {
        Do $System.Status.DisplayError(status) 
        Quit $$$NULLOREF
    }
    Quit server
}

此方法返回%Net.POP3服务器实例。本主题后面的许多示例都接受%Net.POP3实例作为参数。

示例2:YPOPsAsPOP3()

以下方法还返回%Net.POP3服务器实例。在本例中,我们使用的是YPOPS,这是一个客户端软件,提供对Yahoo电子邮件帐户的SMTPPOP3访问。它使用已为此目的设置的测试帐户:

ClassMethod YPOPsAsPOP3() As %Net.POP3
{
    Set server=##class(%Net.POP3).%New()

    //YPOPs uses the default port 
    //but let's set it anyway
    Set server.port=110

    //just in case we plan to fetch any messages
    //that have attachments
    Set server.StoreAttachToFile=1
    Set server.StoreInlineToFile=1
    Set server.AttachDir="c:\DOWNLOADS\"

    //local host acts as the server
    Set servername="127.0.0.1"
    //YPOPs works with a Yahoo email account
    Set user="isc.test@yahoo.com"
    Set pass="123pass"

    Set status=server.Connect(servername,user,pass)
    If $$$ISERR(status) {
        Do $System.Status.DisplayError(status) 
        Quit $$$NULLOREF
    }
    Quit server
}

获取有关邮箱的信息

当连接到POP3服务器时,将登录到一个用户帐户,并有权访问该用户帐户的邮箱。使用以下方法查找邮箱包含的内容:

GetMailBoxStatus()

通过引用返回邮箱中的邮件数和邮箱使用的字节数。

GetMessageUIDArray()

如果给定空字符串作为第一个参数,此方法将通过引用返回有关邮箱中邮件的信息数组(不包括当前标记为删除的任何邮件)。此数组中的每个元素都包含有关一条消息的以下信息:

Array Key Array Item
邮箱中当前状态的邮件编号。第一条消息是数字1,依此类推。给定消息的消息编号不能保证在所有会话中都相同。 唯一消息标识符(UID),它是此消息在所有会话中可用的永久标识符。UID对于每个邮箱都是唯一的。

GetSizeOfMessages()

如果给定空字符串作为第一个参数,此方法将通过引用返回有关邮箱中邮件的信息数组(不包括当前标记为删除的任何邮件)。此数组中的每个元素都包含有关一条消息的以下信息:

Array Key Array Item
邮箱中当前状态的邮件编号。 此消息的大小(以字节为单位)。

这些方法中的每一个都返回一个状态,应该在继续之前检查该状态。

示例:ShowMailbox()

例如,以下方法写入有关我们当前访问的邮箱的信息:

ClassMethod ShowMailbox(server as %Net.POP3) 
{
    Set status=server.GetMailBoxStatus(.count,.size)
    If $$$ISERR(status) {
       Do $System.Status.DisplayError(status) 
       Quit 
    }
    Write "Mailbox information *****",!
    Write "Number of messages in mailbox: ",count,!
    Write "Size of messages: ",size,!

    Set status=server.GetMessageUIDArray(,.uids)
    Set status=server.GetSizeOfMessages(,.sizes)

    //iterate through messages, get info, and write it
    For i=1:1:count {
        Set uid=uids.GetAt(i)
        Set size=sizes.GetAt(i)
        Write "Msg number:", i,"   UID:",uid, "   size:",size,!
    }

}

此方法会生成类似于以下内容的输出:

Mailbox information *****
Number of messages in mailbox: 4
Size of messages: 18634
Msg number:1   UID:6ef78df6fd660391   size:7245
Msg number:2   UID:7410041a6faf4a87   size:5409
Msg number:3   UID:5555af7fa489e406   size:5121
Msg number:4   UID:299ad2b54c01a6be   size:859

从邮箱提取邮件

要简单地获取消息,请使用%Net.POP3类的以下方法之一:

Fetch()

给定消息编号作为第一个参数,此方法返回(通过引用,作为第二个参数)包含该消息的%Net.MailMessage实例。

FetchMessage()

给定消息编号作为第一个参数,此方法返回(通过引用)诸如FromTo和其他公共标头等信息、包含所有标头(包括公共标头)的数组以及消息内容本身

这些方法中的每一个都返回一个状态,您应该在继续之前检查该状态。请注意,如果邮件当前被标记为删除,则这些方法将返回错误状态。

示例:FetchMailbox()

下面的示例是“获取有关邮箱的信息”中描述的ShowMailbox示例的变体。此方法使用fetch()方法,检查每封邮件,并写入每封邮件的主题行:

ClassMethod FetchMailbox(server As %Net.POP3)
{
    Set status=server.GetMailBoxStatus(.count,.size)
    If $$$ISERR(status) {
        Do $System.Status.DisplayError(status) 
        Quit $$$NULLOREF
    }
    Write "Mailbox information *****",!
    Write "Number of messages in mailbox: ",count,!
    Write "Size of messages: ",size,!

    Set status=server.GetMessageUIDArray(,.uids)
    Set status=server.GetSizeOfMessages(,.sizes)

    //iterate through messages, get info, and write it
    For i=1:1:count {
        Set uid=uids.GetAt(i)
        Set size=sizes.GetAt(i)
        Set status=server.Fetch(i,.msg)
        If $$$ISERR(status) {
            Set subj="***error***"
        } else{
            Set subj=msg.Subject
        }
        Write "Msg number:", i,"  UID:",uid, "  Size:",size
        Write "  Subject: ",subj,!
    }
}
00
1 0 0 6
Log in or sign up to continue