如何使用InterSystems IRIS发送和接收电子邮件

2022-04-12 00:00:00 消息 指定 邮件 属性 电子邮件

本主题描述如何使用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
的超类。下图显示了这些类之间的关系:


  • 要表示普通的、由一部分组成的消息,请使用%Net.MailMessage

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

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

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

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

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

  1. 设置实例的To
    From
    Subject
    属性。

  • 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
    的实例,并将其To
    From
    Subject
    属性设置为。可以选择设置其他属性以指定其他邮件标头。

  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")

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

来源 https://www.modb.pro/db/96076

相关文章