创建、编写和阅读MIME邮件
Iris提供了一个可以用于创建MultiPart Mime
消息(%Net.MimePart
)的类。创建要添加到SOAP
消息的附件时,请使用此类;请参阅创建Web服务和Web客户端。因为MIME
是一个常见的标准,所以有许多其他可能的应用程序,例如电子邮件处理和HTTP Multipart Post。
MIME消息概述
MIME格式的文档被称为MIME部分。每个MIME部件都有标题,包含邮件正文(文本或二进制)或包含额外的MIME部件。具有MIME版本标题的MIME部分可以用作顶级文档,称为MIME消息。下图显示了示例:
在该示例中,E
和F
具有未显示的附加子部分。
要表示MIME部件,请使用 %Net.MIMEPart
类,该类提供用于设置零件的标题和内容的属性。
创建MIME部分
要创建一个MIME部件,执行以下步骤:
- 创建
%Net.MIMEPart
的实例。 - 做以下其中一项:
- 添加文本或二进制正文。为此,请创建流(文本或二进制)的实例,并将MIME部分的
Body
属性设置为等于该流。使用标准流接口将数据写入此流。不要为Parts
属性指定值。 - 添加MIME部件列表。为此,请按此处所述创建MIME部件,并将
Parts
属性设置为等于这些部件的列表。不要为Body
属性指定值。
- 可以选择按照“设置和获取MIME部件标头”中的说明设置标头。
设置和获取MIME部件标头
可以设置和获取HTTP
标头的值。%Net.MIMEPart
的以下属性会影响MIME标头:
-
ContentType
-Content-Type
标头的Internet媒体类型(MIME类型)。这指定正文数据的Internet媒体类型。例如:"text/plain"
,"text/html"
,"image/jpeg",
"multipart/mixed"
等。 -
ContentCharset
-Content-Type
标题的字符集部分。如果设置此属性,则必须首先设置ContentType
属性。对于包含文本正文的每个MIME
部分,请确保适当设置ContentCharset
属性以指示正文中使用的字符集。此属性应声明已使用的字符集,因为%Net.MIMEPart
不执行任何转换。 -
ContentId
-规范化的Content-ID
头,不带尖括号(<>
)以及任何前导空格和尾随空格。 -
ContentLocation
-标准化的Content-Location
标头,没有任何前导空格和尾随空格。 -
ContentTransferEncoding
-Content-Transfer-Encoding
标头。此属性可以是以下属性之一:"base64"
"quoted-printable"
"7bit" "8bit"
重要提示:请注意,如果内容为“Base64”
编码,则不能包含任何Unicode字符。如果要发送的内容包括Unicode字符,请确保使用$ZCONVERT
将内容转换为UTF-8
,然后对其进行base-64
编码。例如:
set BinaryText=$ZCONVERT(UnicodeText,"O","UTF8")
set Base64Encoded=$system.Encryption.Base64Encode(BinaryText)
收件人必须使用相反的过程来解码文本:
代码语言:javascript复制set BinaryText=$system.Encryption.Base64Decode(Base64Encoded)
set UnicodeText=$ZCONVERT(BinaryText,"I","UTF8")
%Net.MIMEPart
类提供可用于管理MIME标头的常规方法:
-
GetHeader()
返回头的值。 -
NextHeader()
获取下一个标头。 -
SetHeader()
设置标题的值。通常,可以使用它来设置非标准标头。 -
RemoveHeader()
删除标题。
指定可选的消息边界值
默认情况下,邮件边界是自动生成的。如果需要,可以指定消息边界。要执行此操作,请指定边界属性的值。请确保使用极不可能在任何消息部分中使用的字符串。
编写MIME邮件
要编写MIME邮件,请使用%Net.MIMEWriter
,如下所示:
- 创建
%Net.MIMEWriter
类的实例。 - (可选)指定输出目标。为此,请使用编写器实例的以下方法之一:
OutputToDevice()
(默认值)、OutputToFile()
或OutputToStream()
。 - 调用编写器的方法,根据需要编写输出:
- 给定标头名称和值后,
WriteHeader()
将写入该标头。 - 给定
%Net.MIMEPart
的实例,WriteMIMEBody()
写入消息正文,消息正文可以有多个部分。
如果消息是多部分的,则此方法不写入任何标头;编写它们是责任。但是,如果消息不是多部分的,则该方法会写入标头。
- 给定
%Net.MIMEPart
的实例,WriteMIMEMessage()
写入MIME消息,包括所有标头。
对于单部分消息,WriteMIMEBody()
和WriteMIMEMessage()
产生相同的输出。
示例:WriteMIMEMessage()
下面的示例演示WriteMIMEMessage()
的用法:
ClassMethod WriteMIMEMessage(text As %String, header As %String) As %Status
{
Set msg=##class(%Net.MIMEPart).%New()
Set msg.Body=##class(%GlobalCharacterStream).%New()
Do msg.Body.Write(text)
//specify some headers
Set msg.ContentType="text/html"
Set msg.ContentCharset="us-ascii"
Do msg.SetHeader("Custom-header",header)
//create MIME writer; write MIME message
Set writer=##class(%Net.MIMEWriter).%New()
Set status=writer.WriteMIMEMessage(msg)
If $$$ISERR(status) do $system.Status.DisplayError(status)
Quit $$$OK
}
以下终端会话显示了此方法的使用情况: java
代码语言:javascript复制DHC-APP>w ##class(PHA.TEST.HTTP).WriteMIMEMessage("message text","my header value") CONTENT-TYPE: text/html; charset=us-ascii
Custom-header: my header value
message text
1
阅读MIME邮件
要读取MIME
邮件,请使用%Net.MIMEReader
,如下所示:
- 创建
%Net.MIMEReader
类的实例。 - 指定输入源。为此,请使用读取器实例的以下方法之一:
OpenFile()
或OpenStream()
。 - 调用读取器实例的
ReadMIMEMessage()
方法。此方法通过引用返回%Net.MIMEPart
的实例作为第一个参数。它返回一个状态,应该检查该状态。