创建、编写和阅读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的实例作为第一个参数。它返回一个状态,应该检查该状态。


