Skip to main content

SMTP を介した電子メールの送信

ここでは、%Net.SMTPOpens in a new tab を使用して MIME 電子メール・メッセージを送信する方法について説明します。

概要

SMTP サーバにアクセスできる場合、電子メール・メッセージを送信できます。SMTP サーバが稼動しており、それを使用するために必要な権限を持っている必要があります。電子メールを送信するには、以下の手順を実行します。

  1. %Net.SMTPOpens in a new tab のインスタンスを作成し、必要に応じてそのプロパティを設定します。特に、以下のプロパティを設定します。

    • smtpserver は、使用している SMTP サーバの名前です。

    • port は、SMTP サーバで使用しているポートです。既定値は、25 です。

    • timezone では、RFC 822Opens in a new tab によって指定されたとおりに、サーバのタイム・ゾーンを指定します。例えば、"EST""-0400""LOCAL" などです。これを設定しない場合、メッセージは協定世界時を使用します。

    このオブジェクトは、使用する SMTP サーバを記述します。

  2. SMTP サーバが認証を必要とする場合、必要な資格情報を指定します。そのためには、以下の操作を実行します。

    1. %Net.AuthenticatorOpens in a new tab のインスタンスを作成します。

    2. このオブジェクトの UserName プロパティおよび Password プロパティを設定します。

    3. %Net.SMTPOpens in a new tab インスタンスの authenticator プロパティをこのオブジェクトと等しくなるように設定します。

    4. メッセージ自体に許可されたセンダがある場合、%Net.SMTPOpens in a new tab インスタンスの AuthFrom プロパティを設定します。

    5. MechanismList を設定します。ここでは、試行する認証方法を指定します。メール・サーバには使用できる認証メカニズムのリストが保持されていて、MechanismList にある最初のメカニズムがメール・サーバとの接続に使用されます。アプリケーションの要件とサーバの設定に適した MechanismList を定義します。

  3. SMTP サーバへの SSL/TLS 接続を使用するには

    1. SSLConfiguration プロパティを使用する有効化した SSL/TLS 構成の名前に設定します。

      SSL/TLS 構成の作成と管理の詳細は、インターシステムズの "TLS ガイド" を参照してください。SSL/TLS 構成には、[構成名] と呼ばれるオプションが含まれています。これは、この設定で使用する文字列です。

    2. UseSTARTTLS プロパティを 0 か 1 に設定します。

      ほとんどの場合、0 の値を使用します。通常の TCP ソケットでサーバのやり取りが開始した後、通常のソケットとして同じポートの TLS に切り替わる場合、1 の値を使用します。詳細は、"RFC 3207Opens in a new tab" を参照してください。

    3. 必要に応じて、SSLCheckServerIdentity プロパティを 1 に設定します。これは、証明書のホスト・サーバ名を確認する場合に設定します。

  4. 送信する電子メール・メッセージを作成します (手順については、"シングルパートの電子メール・メッセージの作成" および "マルチパートの電子メール・メッセージの作成" を参照)。

  5. SMTP インスタンスの Send() メソッドを呼び出します。このメソッドはステータスを返すので、それを確認する必要があります。

  6. 返されたステータスがエラーを示している場合、エラー・メッセージを含んでいる Error プロパティを確認します。

  7. 送信アクションに失敗した電子メールのアドレスのリストを含んでいる FailedSend プロパティを確認します。

以下のセクションの例は、このドキュメント執筆時点で使用可能な 2 つの異なる無料 SMTP サービスを使用しています。これらのサービスの選択は、特に推奨を意味しているわけではありません。また、例で示しているのは、実際のパスワードではありません。

Important:

%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 サーバによって、フィルタで除外されます。

関連項目

FeedbackOpens in a new tab