SMTP を介した電子メールの送信
ここでは、%Net.SMTPOpens in a new tab を使用して MIME 電子メール・メッセージを送信する方法について説明します。
概要
SMTP サーバにアクセスできる場合、電子メール・メッセージを送信できます。SMTP サーバが稼動しており、それを使用するために必要な権限を持っている必要があります。電子メールを送信するには、以下の手順を実行します。
-
%Net.SMTPOpens in a new tab のインスタンスを作成し、必要に応じてそのプロパティを設定します。特に、以下のプロパティを設定します。
-
smtpserver は、使用している SMTP サーバの名前です。
-
port は、SMTP サーバで使用しているポートです。既定値は、25 です。
-
timezone では、RFC 822Opens in a new tab によって指定されたとおりに、サーバのタイム・ゾーンを指定します。例えば、"EST"、"-0400"、"LOCAL" などです。これを設定しない場合、メッセージは協定世界時を使用します。
このオブジェクトは、使用する SMTP サーバを記述します。
-
-
SMTP サーバが認証を必要とする場合、必要な資格情報を指定します。そのためには、以下の操作を実行します。
-
%Net.AuthenticatorOpens in a new tab のインスタンスを作成します。
-
このオブジェクトの UserName プロパティおよび Password プロパティを設定します。
-
%Net.SMTPOpens in a new tab インスタンスの authenticator プロパティをこのオブジェクトと等しくなるように設定します。
-
メッセージ自体に許可されたセンダがある場合、%Net.SMTPOpens in a new tab インスタンスの AuthFrom プロパティを設定します。
-
MechanismList を設定します。ここでは、試行する認証方法を指定します。メール・サーバには使用できる認証メカニズムのリストが保持されていて、MechanismList にある最初のメカニズムがメール・サーバとの接続に使用されます。アプリケーションの要件とサーバの設定に適した MechanismList を定義します。
-
-
SMTP サーバへの SSL/TLS 接続を使用するには
-
SSLConfiguration プロパティを使用する有効化した SSL/TLS 構成の名前に設定します。
SSL/TLS 構成の作成と管理の詳細は、インターシステムズの "TLS ガイド" を参照してください。SSL/TLS 構成には、[構成名] と呼ばれるオプションが含まれています。これは、この設定で使用する文字列です。
-
UseSTARTTLS プロパティを 0 か 1 に設定します。
ほとんどの場合、0 の値を使用します。通常の TCP ソケットでサーバのやり取りが開始した後、通常のソケットとして同じポートの TLS に切り替わる場合、1 の値を使用します。詳細は、"RFC 3207Opens in a new tab" を参照してください。
-
必要に応じて、SSLCheckServerIdentity プロパティを 1 に設定します。これは、証明書のホスト・サーバ名を確認する場合に設定します。
-
-
送信する電子メール・メッセージを作成します (手順については、"シングルパートの電子メール・メッセージの作成" および "マルチパートの電子メール・メッセージの作成" を参照)。
-
SMTP インスタンスの Send() メソッドを呼び出します。このメソッドはステータスを返すので、それを確認する必要があります。
-
返されたステータスがエラーを示している場合、エラー・メッセージを含んでいる Error プロパティを確認します。
-
送信アクションに失敗した電子メールのアドレスのリストを含んでいる FailedSend プロパティを確認します。
以下のセクションの例は、このドキュメント執筆時点で使用可能な 2 つの異なる無料 SMTP サービスを使用しています。これらのサービスの選択は、特に推奨を意味しているわけではありません。また、例で示しているのは、実際のパスワードではありません。
%Net.SMTPOpens in a new tab は、メッセージ本文を一時ファイル・ストリームに書き込みます。既定では、このファイルはネームスペースのディレクトリに書き込まれますが、ディレクトリで特別な書き込み許可が必要な場合、ファイルは作成されずに空のメッセージ本文を取得することになります。
これらの一時ファイルに新規のパスを定義して、書き込みアクセスを制限しないパスを選択することができます (/tmp など)。そのためには、グローバル・ノード %SYS("StreamLocation",namespace) を設定します。ここで、namespace はお使いのコードが実行されているネームスペースです。以下はその例です。
Set ^%SYS("StreamLocation","SAMPLES")="/tmp"
%SYS("StreamLocation",namespace) が NULL の場合は、InterSystems IRIS では %SYS("TempDir",namespace) で指定されたディレクトリが使用されます。%SYS("TempDir",namespace) が設定されていない場合は、InterSystems IRIS では %SYS("TempDir") で指定されたディレクトリが使用されます。
XOAUTH2 認証の有効化
%Net.SMTPOpens in a new tab では、認証方法として XOAUTH2 をサポートしています。
%Net.AuthenticatorOpens in a new tab にはアクセス・トークン・プロパティがあるので、それを XOAUTH2 によってメカニズムのリストに追加できます。XOAUTH2 を追加すると、それが %Net.AuthenticatorOpens in a new tab で認証方法として使用されます。追加しない場合は使用されません。%Net.SMTPOpens in a new tab で XOAUTH2 の使用を望まない場合は、何もする必要はありません。
例 1 : HotPOPAsSMTP() および SendSimpleMessage()
この例は、一緒に使用する 2 つのメソッドで構成されます。最初のメソッドは、HotPOP SMTP サーバで既に設定されているテスト・アカウントを使用する %Net.SMTPOpens in a new tab のインスタンスを作成します。
ClassMethod HotPOPAsSMTP() As %Net.SMTP
{
Set server=##class(%Net.SMTP).%New()
Set server.smtpserver="smtp.hotpop.com"
//HotPOP SMTP server uses the default port (25)
Set server.port=25
//Create object to carry authentication
Set auth=##class(%Net.Authenticator).%New()
Set auth.UserName="isctest@hotpop.com"
Set auth.Password="123pass"
Set server.authenticator=auth
Set server.AuthFrom=auth.UserName
Quit server
}
次のメソッドは、引数として指定する SMTP サーバを使用して、簡単な一意のメッセージを送信します。
ClassMethod SendSimpleMessage(server As %Net.SMTP) As %List
{
Set msg = ##class(%Net.MailMessage).%New()
Set From=server.authenticator.UserName
Set:From="" From="xxx@xxx.com"
Set msg.From = From
Do msg.To.Insert("xxx@xxx.com")
//Do msg.Cc.Insert("yyy@yyy.com")
//Do msg.Bcc.Insert("zzz@zzz.com")
Set msg.Subject="Unique subject line here "_$H
Set msg.IsBinary=0
Set msg.IsHTML=0
Do msg.TextData.Write("This is the message.")
Set status=server.Send(msg)
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Write server.Error
Quit ""
}
Quit server.FailedSend
}
例 2 : YPOPsAsSMTP()
この例は、Yahoo 電子メール・アカウントへの SMTP および POP3 アクセスを提供するクライアント・ソフトウェアである YPOP を使用する %Net.SMTPOpens in a new tab のインスタンスを作成します。これは、この目的で既に設定されているテスト・アカウントを使用します。
ClassMethod YPOPsAsSMTP() As %Net.SMTP
{
Set server=##class(%Net.SMTP).%New()
//local host acts as the server
Set server.smtpserver="127.0.0.1"
//YPOPs uses default port, apparently
Set server.port=25
//Create object to carry authentication
Set auth=##class(%Net.Authenticator).%New()
//YPOPs works with a Yahoo email account
Set auth.UserName="isc.test@yahoo.com"
Set auth.Password="123pass"
Set server.authenticator=auth
Set server.AuthFrom=auth.UserName
Quit server
}
前の例で示した SendSimpleMessage メソッドでこれを使用できます。
例 3 : SendMessage()
以下の、より柔軟なメソッドは、SMTP サーバと電子メール・メッセージの両方を受け入れます。電子メール・メッセージには、既に件名の行が含まれている必要があります (SMTP サーバで必要な場合) が、アドレスを含める必要はありません。このメソッドは、その後、電子メール・メッセージをハードコードされたテストの宛先一式に送信します。
ClassMethod SendMessage(server As %Net.SMTP, msg as %Net.MailMessage) as %Status
{
Set From=server.authenticator.UserName
//make sure From: user is same as used in authentication
Set msg.From = From
//finish addressing the message
Do msg.To.Insert("xxx@xxx.com")
//send the message to various test email addresses
Do msg.To.Insert("isctest@hotpop.com")
Do msg.To.Insert("isc_test@hotmail.com")
Do msg.To.Insert("isctest001@gmail.com")
Do msg.To.Insert("isc.test@yahoo.com")
Set status=server.Send(msg)
If $$$ISERR(status) {
Do $System.Status.DisplayError(status)
Write server.Error
Quit $$$ERROR($$$GeneralError,"Failed to send message")
}
Quit $$$OK
}
この例は、"メッセージへの添付の追加" で説明されている SimpleMessage メソッド例および MessageWithAttachment メソッド例と共に使用するためのものです。
%Net.SMTP のその他のプロパティ
%Net.SMTPOpens in a new tab クラスには、使用している SMTP サーバによっては必要な場合がある以下のプロパティもあります。
-
AllowHeaderEncoding は、Send() メソッドが非 ASCII ヘッダ・テキストをエンコードするかどうかを指定します。既定値は 1 で、これは、非 ASCII ヘッダ・テキストが RFC 2047Opens in a new tab によって指定されたとおりにエンコードされることを意味します。
-
ContinueAfterBadSend は、送信に失敗した電子メール・アドレスを検出した後、メッセージの送信を継続して試行するかどうかを指定します。ContinueAfterBadSend が 1 の場合、システムは、送信に失敗した電子メール・アドレスを FailedSend プロパティのリストに追加します。既定値は 0 です。
-
ShowBcc は、Bcc ヘッダを電子メール・メッセージに記述するかどうかを指定します。これらは通常、SMTP サーバによって、フィルタで除外されます。