创建、编写和阅读MIME邮件

2022-07-04 15:58:40 浏览数 (2)

创建、编写和阅读MIME邮件

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

MIME消息概述

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

在该示例中,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编码。例如:

代码语言:javascript复制
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,如下所示:

  1. 创建%Net.MIMEWriter类的实例。
  2. (可选)指定输出目标。为此,请使用编写器实例的以下方法之一:OutputToDevice()(默认值)、OutputToFile()OutputToStream()
  3. 调用编写器的方法,根据需要编写输出:
  • 给定标头名称和值后,WriteHeader()将写入该标头。
  • 给定%Net.MIMEPart的实例,WriteMIMEBody()写入消息正文,消息正文可以有多个部分。

如果消息是多部分的,则此方法不写入任何标头;编写它们是责任。但是,如果消息不是多部分的,则该方法会写入标头。

  • 给定%Net.MIMEPart的实例,WriteMIMEMessage()写入MIME消息,包括所有标头。

对于单部分消息,WriteMIMEBody()WriteMIMEMessage()产生相同的输出。

示例:WriteMIMEMessage()

下面的示例演示WriteMIMEMessage()的用法:

代码语言:javascript复制
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,如下所示:

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

0 人点赞