文章
· 五月 23, 2021 阅读大约需 7 分钟

第四章 收发电子邮件

第四章 收发电子邮件

本主题描述如何使用InterSystems IRIS发送和接收MIME电子邮件消息。

注意:本主题中的示例是经过组织的,因此管理电子邮件的方法可以用于不同的电子邮件服务器,这在测试和演示期间非常有用。这不一定是最适合生产需要的代码组织。

支持电子邮件协议

电子邮件使用标准协议通过Internet发送消息。
InterSystems IRIS支持以下三种协议:

  • InterSystems IRIS提供MIME电子邮件的对象表示形式。它支持文本和非文本附件、单部分或多部分邮件正文,以及ASCII和非ASCII字符集的标题。
  • 可以通过SMTP服务器发送电子邮件。SMTP(简单邮件传输协议)是发送电子邮件的Internet标准。
  • 还可以通过POP3从电子邮件服务器检索电子邮件,POP3是从远程服务器检索电子邮件的最常用标准。

注意:InterSystems IRIS不提供邮件服务器。相反,它提供了连接到邮件服务器并与之交互的功能。

InterSystems IRIS如何表示MIME电子邮件

首先,了解InterSystems IRIS如何表示MIME电子邮件非常有用。

通常,多部分MIME邮件由以下部分组成:

  • 一组邮件标头,每个标头都包含邮件发送到的地址等信息。这还包括整个消息的Mime-Type标头和Content-Type标头。

对于多部分消息,Content-Type头必须是多部分/混合或多部分的其他子类型;MIME标准有许多变体。

  • 多个消息部分,每个消息部分由以下部分组成:
    • 一组内容标头,包括Content-Type标头和特定于此部件的其他标头。
    • 一种正文,它可以是文本或二进制,并且可以使用与其它部分的正文不同的字符集。

InterSystems IRIS使用两个类来表示电子邮件:%Net.MailMessage%Net.MailMessagePart,即%Net.MailMessage的超类。下图显示了这些类之间的关系:

image

  • 要表示普通的、由一部分组成的消息,请使用%Net.MailMessage
  • 要表示多部分消息,请使用%Net.MailMessage作为父消息,并使用%Net.MailMessagePart的多个实例作为其部分。

创建由单个部分组成的电子邮件

要创建由单个部分组成的电子邮件,请使用%Net.MailMessage类。要创建邮件,请执行以下操作:

  1. 创建%Net.MailMessage的实例。

提示:可以将字符集指定为%New();的参数,如果这样做,则会设置消息的CharSet属性。

  1. 设置实例的ToFromSubject属性。
  • To收件人-此邮件将发送到的电子邮件地址列表。此属性是标准的InterSystems IRIS列表类;要使用它,需要使用标准列表方法:Insert()GetAt()RemoveAt()Count()Clear()
  • From发件人-此邮件的发件人电子邮件地址。
  • Subject主题-邮件的主题(如果您使用的SMTP服务器需要该主题)。
  1. 可以选择设置日期、抄送、密件抄送和其他属性。
  2. 如果邮件不是纯文本,请设置以下属性以指示您要创建的邮件的类型:
  • 如果这是一封HTML邮件,请将IsHTML属性设置为1。
  • 如果这是二进制消息,请将IsBinary属性设置为1。
  1. 若要指定消息及其标头的字符集,请根据需要设置CharSet属性。

重要提示:在添加消息内容之前指定字符集非常重要。

  1. 添加消息内容:
  • 对于纯文本或HTML,请使用TextData属性,该属性是%FileCharacterStream的实例。不需要指定此流的TranslateTable属性;当指定邮件的字符集时,该属性会自动发生。

  • 对于二进制数据,请使用BinaryData属性,该属性是%FileBinaryStream的实例。

提示:指定流的Filename属性时,请确保使用用户有权写入的目录。

要使用这些属性,请使用标准流方法:Write()WriteLine()Read()ReadLine()Rewind()MoveToEnd()Clear()。还可以使用流的Size属性,该属性提供消息内容的大小。

注意:应该了解正在使用的SMTP服务器的要求。例如,某些SMTP服务器要求包含主题标头。同样,某些SMTP服务器不允许任意FROM标头。
类似地,一些SMTP服务器识别优先级报头,而其他服务器则识别X-Priority

示例1:CreateTextMessage()

以下方法创建一条简单消息并为其指定地址:

ClassMethod CreateTextMessage() As %Net.MailMessage
{
    Set msg = ##class(%Net.MailMessage).%New()
    set msg.From = "test@test.com"
    Do msg.To.Insert("xxx@xxx.com")
    Do msg.Cc.Insert("yyy@yyy.com")
    Do msg.Bcc.Insert("zzz@zzz.com")
    Set msg.Subject="subject line here"
    Set msg.IsBinary=0
    Set msg.IsHTML=0
    Do msg.TextData.Write("This is the message.")

    Quit msg
}

示例2:SimpleMessage()

在实际发送邮件时指定地。上例的以下变体生成一条没有地址的文本消息:

ClassMethod SimpleMessage() As %Net.MailMessage
{
  Set msg = ##class(%Net.MailMessage).%New()
  Set msg.Subject="Simple message "_$h
  Set msg.IsBinary=0
  Set msg.IsHTML=0
  Do msg.TextData.Write("This is the message.")
  Quit msg
}

Samples命名空间中还有其他示例。要查找它们,请在该命名空间中搜索%Net.MailMessage

创建多部分电子邮件

要创建由多部分组成的电子邮件,请执行以下操作:

  1. 创建%Net.MailMessage的实例,并将其ToFromSubject属性设置为。可以选择设置其他属性以指定其他邮件标头。
  2. IsMultiPart属性设置为1。
  3. MultiPartType属性设置为以下值之一: "related", "alternative", 或 "mixed"。这会影响整个消息的Content-Type标头。
  4. 对于邮件应包含的每个部分,创建%Net.MailMessagePart的实例并指定其属性,如从步骤4开始的“创建由单个部分组成的电子邮件”中所述。
  5. 对于父电子邮件,设置Parts属性,该属性是一个数组。将每个子消息部分插入到此数组中。

发送邮件时,%Net.SMTP类会根据需要自动设置邮件的Content-Type标头(给定MultiPartType属性值)。

指定电子邮件标题

如前所述,消息本身和消息的每个部分都有一组标头。

%Net.MailMessage%Net.MailMessagePart类提供的属性使可以轻松访问最常用的标头,但可以添加所需的任何标头。本节提供有关所有标头以及如何创建自定义标头的信息。

给定消息部分的标头使用由该部分的CharSet属性指定的字符集。

注意:应该了解正在使用的SMTP服务器的要求。例如,某些SMTP服务器要求包含主题标头。同样,某些SMTP服务器不允许任意FROM标头。
类似地,一些SMTP服务器识别优先级报头,而其他服务器则识别X-Priority

指定基本电子邮件标题

设置以下属性(仅在%Net.MailMessage中)以设置邮件本身最常用的标头:
- To-(必填)此邮件将发送到的电子邮件地址列表。此属性是标准的InterSystems IRIS列表;要使用它,请使用标准列表方法:Insert()GetAt()RemoveAt()Count()Clear()
- From-(必填)发送此邮件的电子邮件地址。
- Date-此消息的日期。
- Subject-(必选)包含此邮件主题的字符串。
- Sender-邮件的实际发件人。
- Cc-此邮件将发送到的抄送地址列表。
- Bcc-此邮件将被发送到的密件副本地址列表。

内容类型标题

发送邮件时,邮件和每个邮件部分的Content-Type标头会自动设置如下:
- 如果消息是纯文本(IsHTML等于0,IsBinary等于0),则Content-Type标头被设置为 "text/plain
- 如果消息是HTML(IsHTML等于1,IsBinary等于0),则Content-Type标头设置为“text/html”
- 如果消息是二进制的(IsBinary等于1),则Content-Type报头设置为如果消息是二进制的(IsBinary等于1),则Content-Type报头设置为"application/octet-stream".
- 如果邮件是多部分邮件,则会为MultiPartType属性的值适当设置Content-Type标头。

%Net.MailMessage%Net.MailMessagePart都提供了contentType属性,使可以访问Content-Type标头。

内容传输编码标头

%Net.MailMessage%Net.MailMessagePart都提供了ContentTransferEncoding属性,该属性提供了一种指定消息或消息部分的Content-Transfer-Encoding头的简单方法。

此属性可以是以下属性之一:"base64" "quoted-printable" "7bit" "8bit"

默认值如下:

对于二进制消息或消息部分:"base64"

重要提示:请注意,如果内容为“Base64”编码,则不能包含任何Unicode字符。如果要发送的内容包括Unicode字符,请确保使用$ZCONVERT将内容转换为UTF-8,然后对其进行base-64编码。例如:

set BinaryText=$ZCONVERT(UnicodeText,"O","UTF8")
set Base64Encoded=$system.Encryption.Base64Encode(BinaryText)

收件人必须使用相反的过程来解码文本:

set BinaryText=$system.Encryption.Base64Decode(Base64Encoded)
set UnicodeText=$ZCONVERT(BinaryText,"I","UTF8")

对于文本消息或消息部分:"quoted-printable"

自定义标题

使用%Net.MailMessage%Net.MailMessagePart,可以通过访问Headers属性设置或获取自定义标题,该属性是一个具有以下结构的数组:

数组键 数组值
标头的名称,如“Priority” 标头的值

此属性用于包含其他标头,如X-Priority和其他标头。例如:

 do msg.Headers.SetAt(1,"X-Priority")
 do msg.Headers.SetAt("High","X-MSMail-Priority")
 do msg.Headers.SetAt("High","Importance")

不同的电子邮件服务器和客户端可以识别不同的标头,因此设置多个相似的标头以确保服务器或客户端接收到的邮件具有它可以识别的标头是很有用的。

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