電子メール・メッセージの作成
ここでは、InterSystems IRIS® データ・プラットフォームで電子メール・メッセージを作成する方法について説明します。
シングルパートの電子メール・メッセージの作成
シングルパート電子メール・メッセージを作成するには、%Net.MailMessageOpens in a new tab クラスを使用します。メール・メッセージを作成する手順は以下のとおりです。
-
%Net.MailMessageOpens in a new tab のインスタンスを作成します。
Tip:%New() への引数として文字セットを指定できます。文字セットを指定した場合は、メッセージに Charset プロパティが設定されます。このメッセージへの影響については、"自動エンコードと文字変換" を参照してください。
-
インスタンスの To プロパティ、From プロパティ、および Subject プロパティを設定します。
-
To — このメッセージの送信先となる電子メール・アドレスのリスト。このプロパティは、標準の InterSystems IRIS リスト・クラスです。これを使用するには、標準のリスト・メソッドである Insert()、GetAt()、RemoveAt()、Count()、および Clear() を使用します。
-
From — このメッセージの送信元の電子メール・アドレス。
-
Subject — 使用している SMTP サーバで必要な場合、メッセージの件名。
-
-
必要に応じて、Date、Cc、Bcc およびその他のプロパティを設定します。詳細は、"基本的な電子メール・ヘッダの指定" を参照してください。
-
メッセージがプレーン・テキストでない場合、以下のプロパティを設定して、作成するメッセージの種類を指定します。
-
これが HTML メッセージの場合は、IsHTML プロパティを 1 に設定します。
-
これがバイナリ・メッセージの場合は、IsBinary プロパティを 1 に設定します。
-
-
メッセージおよびそのヘッダの文字セットを指定するには、必要に応じて、Charset プロパティを設定します (このメッセージへの影響については、"自動エンコードと文字変換" を参照してください)。
Important:メッセージのコンテンツを追加する前に文字セットを指定することが重要です。
-
メッセージのコンテンツを追加します。
-
プレーン・テキストまたは HTML の場合は、TextData プロパティを使用します。これは %FileCharacterStreamOpens in a new tab のインスタンスです。このストリームの TranslateTable プロパティを指定する必要はありません。電子メール・メッセージの文字セットを指定すると自動的に発生します。
-
バイナリ・データの場合は、BinaryData プロパティを使用します。これは %FileBinaryStreamOpens in a new tab のインスタンスです。
%FileCharacterStreamOpens in a new tab および %FileBinaryStreamOpens in a new tab は非推奨になっていますが、このような使用法は引き続きサポートされています。このユース・ケースで別のストリーム・クラスに置き換えることはお勧めできません。
Tip:ストリームの Filename プロパティを指定するときは、ユーザが書き込み権限を持っているディレクトリを使用してください。
これらのプロパティを操作するには、標準ストリーム・メソッドの Write()、WriteLine()、Read()、ReadLine()、Rewind()、MoveToEnd()、および Clear() を使用します。また、ストリームの Size プロパティを使用して、メッセージ・コンテンツのサイズを指定することもできます。
-
使用している SMTP サーバの要件を理解しておく必要があります。例えば、SMTP サーバの中には、Subject ヘッダを含める必要があるものがあります。同様に、SMTP サーバの中には、任意の From ヘッダを許可しないものもあります。
同様に、SMTP サーバの中には、Priority ヘッダを認識するものもあれば、代わりに 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()
実際にメッセージを送信するときにアドレスを指定したい場合もあります ("SMTP サーバを使用した電子メールの送信" にある "例 3 : SendMessage()" を参照)。前の例の以下のバリエーションでは、アドレスのないテキスト・メッセージが生成されます。
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
}
マルチパートの電子メール・メッセージの作成
マルチパートの電子メール・メッセージを作成する手順は以下のとおりです。
-
%Net.MailMessageOpens in a new tab のインスタンスを作成し、その To プロパティ、From プロパティ、および Subject プロパティを設定します。オプションで、その他のプロパティを設定し、その他のメッセージ・ヘッダを指定します。
-
IsMultiPart プロパティを 1 に設定します。
-
MultiPartType プロパティを、"related"、"alternative"、または "mixed" のいずれかに設定します。これは、メッセージ全体の Content-Type ヘッダに影響します。
-
メッセージに含まれる各部分について、%Net.MailMessagePartOpens in a new tab のインスタンスを作成し、"シングルパートの電子メール・メッセージの作成" の説明のとおり (手順 4 から開始)、そのプロパティを指定します。
-
親電子メール・メッセージに対して Parts プロパティを設定します。これは配列です。この配列に、各子メッセージ・パートを挿入します。
メッセージを送信するときに、%Net.SMTPOpens in a new tab クラスは、必要に応じて (MultiPartType プロパティの値がある場合) 自動的にメッセージに対して Content-Type ヘッダを設定します。
電子メール・メッセージ・ヘッダの指定
前述したとおり、メッセージ自体およびメッセージの各パートの両方には、一連のヘッダがあります。
%Net.MailMessageOpens in a new tab クラスおよび %Net.MailMessagePartOpens in a new tab クラスは、最も一般的に使用されるヘッダに簡単にアクセスできるようにするプロパティを提供しますが、必要なヘッダを追加することができます。この節では、すべてのヘッダに関する情報を提供すると共に、カスタム・ヘッダの作成方法についても説明します。
指定されたメッセージ・パートのヘッダは、そのパートの Charset プロパティで指定された文字セットで記述されます。
使用している SMTP サーバの要件を理解しておく必要があります。例えば、SMTP サーバの中には、Subject ヘッダを含める必要があるものがあります。同様に、SMTP サーバの中には、任意の From ヘッダを許可しないものもあります。
同様に、SMTP サーバの中には、Priority ヘッダを認識するものもあれば、代わりに X-Priority を認識するものもあります。
基本的な電子メール・ヘッダの指定
以下のプロパティを設定して (%Net.MailMessageOpens in a new tab 内のみ)、メッセージ自体の最も一般的に使用されるヘッダを設定します。
-
To — (必須) このメッセージの送信先となる電子メール・アドレスのリスト。このプロパティは、標準の InterSystems IRIS リストです。これを使用するには、標準のリスト・メソッドである Insert()、GetAt()、RemoveAt()、Count()、および Clear() を使用します。
-
From — (必須) このメッセージの送信元の電子メール・アドレス。
-
Date — このメッセージの日付。
-
Subject — (必須) このメッセージの件名を含む文字列。
-
Sender — メッセージの実際の送信者。
-
Cc — このメッセージの送信先となるカーボン・コピー・アドレスのリスト。
-
Bcc — このメッセージの送信先となるブラインド・カーボン・コピー・アドレスのリスト。
Content-Type ヘッダ
メッセージを送信する場合、メッセージおよび各メッセージ・パートの Content-Type ヘッダは、自動的に以下のように設定されます。
-
メッセージがプレーン・テキストの場合 (IsHTML が 0 で IsBinary が 0 の場合)、Content-Type ヘッダは "text/plain" に設定されます。
-
メッセージが HTML の場合 (IsHTML が 1 で IsBinary が 0 の場合)、Content-Type ヘッダは "text/html" に設定されます。
-
メッセージがバイナリの場合 (IsBinary が 1 の場合)、Content-Type ヘッダは "application/octet-stream" に設定されます。
-
メッセージがマルチパートの場合、Content-Type ヘッダは MultiPartType プロパティの値に対して適切に設定されます。
%Net.MailMessageOpens in a new tab および %Net.MailMessagePartOpens in a new tab は共に、ContentType プロパティを提供します。このプロパティは、Content-Type ヘッダへのアクセスを提供します。
Content-Transfer-Encoding ヘッダ
%Net.MailMessageOpens in a new tab および %Net.MailMessagePartOpens in a new tab は共に、ContentTransferEncoding プロパティを提供します。このプロパティは、メッセージまたはメッセージ・パートの Content-Transfer-Encoding ヘッダを簡単に指定する方法を提供します。
このプロパティは、"base64"、"quoted-printable"、"7bit"、"8bit" のいずれかです。
既定は以下のとおりです。
-
バイナリのメッセージまたはメッセージ・パートには、"base64" を使用します。
Important:コンテンツを "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.MailMessageOpens in a new tab および %Net.MailMessagePartOpens in a new tab の両方を使用して、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")
各種の電子メール・クライアントおよびサーバでは認識するヘッダも異なるので、複数の類似ヘッダを設定して、確実に認識できるヘッダの付いたメッセージを受信した方が便利となります。
メッセージへの添付の追加
添付を電子メール・メッセージまたはメッセージの部分 (具体的には、%Net.MailMessagePartOpens in a new tab または %Net.MailMessageOpens in a new tab のインスタンス) に追加できます。この操作には、以下のメソッドを使用します。
これらの各メソッドは、元のメッセージ (またはメッセージ・パート) の Parts 配列に添付を追加し、自動的に IsMultiPart プロパティを 1 に設定します。
method AttachFile(Dir As %String,
File As %String,
isBinary As %Boolean = 1,
charset As %String = "",
ByRef count As %Integer) as %Status {}
指定されたファイルを電子メール・メッセージに添付します。デフォルトでは、ファイルはバイナリ添付として送信されますが、代わりにテキストとして指定することができます。また、このファイルがテキストの場合、ファイルが使用する文字セットを指定することもできます。
具体的には、このメソッドは %Net.MailMessagePartOpens in a new tab のインスタンスを作成し、BinaryData または TextData プロパティ内のファイルのコンテンツを適切に配置し、Charset プロパティおよび TextData.TranslateTable プロパティを必要に応じて設定します。このメソッドは、Parts 配列内のこの新しいメッセージ・パートの位置を示す整数を、参照渡しで返します。
このメソッドは、メッセージまたはメッセージ・パートの Dir プロパティおよび FileName プロパティも設定します。
method AttachStream(stream As %Stream.Object,
Filename As %String,
isBinary As %Boolean = 1,
charset As %String = "",
ByRef count As %Integer) as %Status {}
指定したストリームを電子メール・メッセージに添付します。Filename が指定されている場合、この添付はファイル添付と見なされます。指定されていない場合、インライン添付と見なされます。AttachFile() に関するコメントを参照してください。
method AttachNewMessage() as %Net.MailMessagePart {}
%Net.MailMessageOpens in a new tab の新しいインスタンスを作成し、メッセージに追加して、新しく修正された親のメッセージまたはメッセージ・パートを返します。
method AttachEmail(mailmsg As %Net.MailMessage) {}
電子メール・メッセージ (%Net.MailMessageOpens in a new tab のインスタンス) を指定すると、このメソッドは、それをメッセージに追加します。このメソッドは、メッセージまたはメッセージ・パートの Dir プロパティおよび FileName プロパティも設定します。
このメソッドは、ContentType を "message/rfc822" に設定します。この場合、他の添付を追加することはできません。
例 : MessageWithAttachment()
以下の例は、ハードコードされた添付が 1 つある簡単な電子メール・メッセージを生成します。メッセージのアドレスは提供しません。実際にメッセージを送信するときにこの情報を設定できます ("SMTP サーバを使用した電子メールの送信" の "例 3 : SendMessage()" を参照)。
ClassMethod MessageWithAttachment() As %Net.MailMessage
{
Set msg = ##class(%Net.MailMessage).%New()
Set msg.Subject="Message with attachment "_$h
Set msg.IsBinary=0
Set msg.IsHTML=0
Do msg.TextData.Write("This is the main message body.")
//add an attachment
Set status=msg.AttachFile("c:\", "GNET.pdf")
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Quit $$$NULLOREF
}
Quit msg
}
その他の例については、%Net.MailMessagePartOpens in a new tab クラスのクラス・リファレンスを参照してください。
エンコードと文字変換
電子メールのメッセージ部分には、使用されている文字セットおよび使用されている Content-Transfer-Encoding (存在する場合) の両方についての情報が含まれています。参照のため、このセクションでは、この情報の使用方法について説明します。
文字セットおよび変換テーブルの詳細は、"変換テーブル" を参照してください。
%Net.SMTPOpens in a new tab は、各部分の Charset プロパティを確認し、適切な変換テーブルを適用します。
指定した部分に対して Charset プロパティを指定しない場合、InterSystems IRIS では UTF-8 が使用されます。
%Net.SMTPOpens in a new tab も ContentTransferEncoding プロパティを確認します。このプロパティが "base64" または "quoted-printable" の場合、メッセージを作成するときに、%Net.SMTPOpens in a new tab が、必要に応じて本文をエンコードします。(コンテンツ転送エンコードが "7bit" または "8bit" の場合、エンコードは必要ありません。)
コンテンツを "base64" でエンコードする場合、Unicode 文字を含めることはできません。送信するコンテンツに Unicode 文字が含まれている場合は必ず、$ZCONVERT を使用してコンテンツを UTF-8 に変換してください。