从POP3服务器提取电子邮件
与POP3服务器通信
如果拥有所需的权限,并且邮件服务器正在运行,则可以使用POP3
协议从该服务器下载和处理电子邮件。通常,要与POP3
服务器通信,请登录,执行一系列影响邮箱的操作,然后提交或回滚任何更改。要在系统间IRIS中执行此操作,请执行以下操作:
- 创建
%Net.POP3
的实例。此对象描述将使用的POP3
服务器。 - 可以选择指定
%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
解码期间导致错误的问题含糊不清。
- 要使用
SSL/TLS
连接到POP3
服务器,请执行以下操作:
a. 将SSLConfiguration
属性设置为要使用的已激活SSL/TLS
配置的名称。
b. 将UseSTARTTLS
属性设置为0或1。
在大多数情况下,使用值0。如果服务器交互在普通TCP套接字上开始,然后在与普通套接字相同的端口上切换到TLS,则使用值1。
c. 或者,将SSLCheckServerIdentity
属性设置为1。如果要验证证书中的主机服务器名称,请执行此操作。
- 调用实例的
Connect()
方法。此方法按顺序接受三个参数:
a. POP3
服务器的名称
b. 用户名
c. 密码
- 使用实例的方法检查邮箱、检索邮件和删除邮件。以下各节提供了详细信息。
- 或者,要防止连接超时,请调用
%Net.POP3
实例的Ping()
方法。 - 或者,如果已将邮件标记为要删除,但现在选择不删除它们,请调用
%Net.POP3
实例的RollbackDeletes()
方法。 - 完成对邮箱的更改后,请调用以下方法之一:
-
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电子邮件帐户的SMTP
和POP3
访问。它使用已为此目的设置的测试帐户:
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()
例如,以下方法写入有关我们当前访问的邮箱的信息:
代码语言:javascript复制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,!
}
}
此方法会生成类似于以下内容的输出:
代码语言:javascript复制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()
给定消息编号作为第一个参数,此方法返回(通过引用)诸如From
、To
和其他公共标头等信息、包含所有标头(包括公共标头)的数组以及消息内容本身
这些方法中的每一个都返回一个状态,您应该在继续之前检查该状态。请注意,如果邮件当前被标记为删除,则这些方法将返回错误状态。
示例: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,!
}
}