##
11.12.1 SMTP オブジェクト

`SMTP`クラスインスタンスは次のメソッドを提供します:

`set_debuglevel`( | level)

  コネクション間でやりとりされるメッセージ出力のレベルをセットします。 メッセージの冗長さはlevelに応じて決まります。

`connect`( | [host[, port]])

  ホスト名とポート番号をもとに接続します。デフォルトはlocalhostの 標準的なSMTPポート(25番)に接続します。 もしホスト名の末尾がコロン("`:`")で、後に番号がついている場合は、 「ホスト名:ポート番号」として扱われます。 このメソッドはコンストラクタにホスト名及びポート番号が指定されている場合、 自動的に呼び出されます。

`docmd`( | cmd, [, argstring])

  サーバへコマンドcmdを送信します。 オプション引数argstringはスペース文字でコマンドに連結します。 戻り値は、整数値のレスポンスコードと、サーバからの応答の値をタプルで返します。 (サーバからの応答が数行に渡る場合でも一つの大きな文字列で返します。)

  通常、この命令を明示的に使う必要はありませんが、 自分で拡張するする時に使用するときに役立つかもしれません。

  応答待ちのときに、サーバへのコネクションが失われると、 `SMTPServerDisconnected`が上がります。

`helo`( | [hostname])

  SMTPサーバに"`HELO`"コマンドで身元を示します。 デフォルトではhostname引数はローカルホストを指します。

  通常は`sendmail()`が呼びだすため、 これを明示的に呼び出す必要はありません。

`ehlo`( | [hostname])

  "`EHLO`"を利用し、ESMTPサーバに身元を明かします。 デフォルトではhostname引数はローカルホストを指します。

  また、ESMTPオプションのために応答を調べたものは、 `has_extn()`に備えて保存されます。

  `has_extn()`をメールを送信する前に使わない限り、 明示的にこのメソッドを呼び出す必要があるべきではなく、 `sendmail()`が必要とした場合に呼ばれます。、

`has_extn`( | name)

  nameが拡張SMTPサービス可能な場合には`1`を返し、 そうでなければ`0`を返します。

`verify`( | address)

  "`VRFY`"を利用してSMTPサーバにアドレスの妥当性をチェックします。 妥当である場合はコード250と完全なRFC 822アドレス(人名)のタプルを返します。 それ以外の場合は、400以上のエラーコードとエラー文字列を返します。

  注意: ほとんどのサイトはスパマーの裏をかくためにSMTPの"`VRFY`"は 使用不可になっています。

`login`( | user, password)

  認証が必要なSMTPサーバにログインします。 認証に使用する引数はユーザ名とパスワードです。 まだセッションが無い場合は、"`EHLO`"または"`HELO`"コマンドで セッションを作ります。ESMTPの場合は"`EHLO`"が先に試されます。 認証が成功した場合は通常このメソッドは戻りますが、 例外が起こった場合は以下の例外が上がります:

  `SMTPHeloError`
    サーバが"`HELO`"に返答できなかった。
  `SMTPAuthenticationError`
    サーバがユーザ名/パスワードでの認証に失敗した。
  `SMTPError`
    どんな認証方法も見付からなかった。

`starttls`( | [keyfile[, certfile]])

  TLS(Transport Layer Security)モードでSMTPコネクションを出し、 全てのSMTPコマンドは暗号化されます。 これは`ehlo()`をもう一度呼びだすときにするべきです。

  keyfileとcertfileが提供された場合に、 `socket`モジュールの`ssl()`関数が通るようになります。

`sendmail`( | from_addr, to_addrs, msg[, mail_options, rcpt_options])

  メールを送信します。必要な引数はRFC 822のfromアドレス文字列、 RFC 822のtoアドレス文字列のリスト、メッセージ文字列です。 送信側は"`MAIL FROM`"コマンドで使用されるmail_optionsの ESMTPオプション("`8bitmime`"のような)のリストを得るかもしれません。

  全ての"`RCPT`"コマンドで使われるべきESMTPオプション (例えば"`DSN`"コマンド)は、rcpt_optionsを通して 利用することができます。(もし送信先別にESMTPオプションを使う必要があれば、 メッセージを送るために`mail`、`rcpt`、`data` といった下位レベルのメソッドを使う必要があります。)

  注意: 配送エージェントはfrom_addr、to_addrs引数を使い、 メッセージのエンベロープを構成します。 `SMTP`はメッセージヘッダを修正しません。

  まだセッションが無い場合は、"`EHLO`"または"`HELO`"コマンドで セッションを作ります。ESMTPの場合は"`EHLO`"が先に試されます。 また、サーバがESMTP対応ならば、メッセージサイズとそれぞれ指定された オプションも渡します。(featureオプションがあればサーバの広告をセットします) "`EHLO`"が失敗した場合は、ESMTPオプションの無い"`HELO`"が試されます。

  このメソッドはメールが受け入れられたときは普通に戻りますが、 そうでない場合は例外を投げます。このメソッドが例外を投げられなければ、 誰かが送信したメールを得るべきです。また、例外を投げれなかった場合は、 拒絶された受取人ごとへの1つのエントリーと共に、辞書を返します。 各エントリーは、サーバーによって送られたSMTPエラーコードおよび エラーメッセージのタプルを含んでいます。

  このメソッドは次の例外を上げることがあります:

  `SMTPRecipientsRefused`
    全ての受信を拒否され、誰にもメールが届けられませんでした。 例外オブジェクトの`recipients`属性は、 受信拒否についての情報の入った辞書オブジェクトです。 (辞書は少なくとも一つは受信されたときに似ています)。

  `SMTPHeloError`
    サーバが"`HELP`"に返答しませんでした。

  `SMTPSenderRefused`
    サーバがfrom_addrを弾きました。

  `SMTPDataError`
    サーバが予期しないエラーコードを返しました。(受信拒否以外)

  また、この他の注意として、例外が上がった後も コネクションは開いたままになっています。

`quit`( | )

  SMTPセッションを終了し、コネクションを閉じます。

下位レベルのメソッドは標準SMTP/ESMTPコマンド"`HELP`"、 "`RSET`"、 "`NOOP`"、"`MAIL`"、"`RCPT`"、"`DATA`"に対応しています。 通常これらは直接呼ぶ必要はなく、また、ドキュメントもありません。 詳細はモジュールのコードを調べてください。