文章
姚 鑫 · 五月 28 阅读大约需 4 分钟

第九章 创建、编写和阅读MIME邮件

第九章 创建、编写和阅读MIME邮件

Iris提供了一个可以用于创建MultiPart Mime消息(%Net.MimePart)的类。创建要添加到SOAP消息的附件时,请使用此类;请参阅创建Web服务和Web客户端。因为MIME是一个常见的标准,所以有许多其他可能的应用程序,例如电子邮件处理和HTTP Multipart Post。

# MIME消息概述

MIME格式的文档被称为MIME部分。每个MIME部件都有标题,包含邮件正文(文本或二进制)或包含额外的MIME部件。具有MIME版本标题的MIME部分可以用作顶级文档,称为MIME消息。下图显示了示例:

image

在该示例中,EF具有未显示的附加子部分。

要表示MIME部件,请使用 %Net.MIMEPart类,该类提供用于设置零件的标题和内容的属性。

# 创建MIME部分

要创建一个MIME部件,执行以下步骤:

  1. 创建%Net.MIMEPart的实例。
  2. 做以下其中一项:
    • 添加文本或二进制正文。为此,请创建流(文本或二进制)的实例,并将MIME部分的Body属性设置为等于该流。使用标准流接口将数据写入此流。不要为Parts属性指定值。
    • 添加MIME部件列表。为此,请按此处所述创建MIME部件,并将Parts属性设置为等于这些部件的列表。不要为Body属性指定值。
    1. 可以选择按照“设置和获取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)

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

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

%Net.MIMEPart类提供可用于管理MIME标头的常规方法:
- GetHeader()返回头的值。
- NextHeader()获取下一个标头。
- SetHeader()设置标题的值。通常,可以使用它来设置非标准标头。
- RemoveHeader()删除标题。

指定可选的消息边界值

默认情况下,邮件边界是自动生成的。如果需要,可以指定消息边界。要执行此操作,请指定边界属性的值。请确保使用极不可能在任何消息部分中使用的字符串。

编写MIME邮件

要编写MIME邮件,请使用%Net.MIMEWriter,如下所示:
1. 创建%Net.MIMEWriter类的实例。
2. (可选)指定输出目标。为此,请使用编写器实例的以下方法之一:OutputToDevice()(默认值)、OutputToFile()OutputToStream()
3. 调用编写器的方法,根据需要编写输出:

  • 给定标头名称和值后,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

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,如下所示:

  1. 创建%Net.MIMEReader类的实例。
  2. 指定输入源。为此,请使用读取器实例的以下方法之一:OpenFile()OpenStream()
  3. 调用读取器实例的ReadMIMEMessage()方法。此方法通过引用返回%Net.MIMEPart的实例作为第一个参数。它返回一个状态,应该检查该状态。
00
1 0 0 10
Log in or sign up to continue