...

パッケージ smtp

import "net/smtp"
概要
目次

概要 ▾

smtp パッケージは, RFC 532 で定義される Simple Mail Transfer Protocol を実装します。 また,次の拡張も実装します。

8BITMIME  RFC 1652
AUTH      RFC 2554
STARTTLS  RFC 3207

その他の拡張は,クライアントによって処理可能です。

smtp パッケージは凍結されており,新しい機能を受け付けていません。 いくつかの外部パッケージはより多くの機能を提供します。 これをご覧ください:

https://godoc.org/?q=smtp

コード:

// リモートの SMTP サーバーに接続します。
c, err := smtp.Dial("mail.example.com:25")
if err != nil {
    log.Fatal(err)
}

// 送信者と受信者を最初に設定
if err := c.Mail("sender@example.org"); err != nil {
    log.Fatal(err)
}
if err := c.Rcpt("recipient@example.net"); err != nil {
    log.Fatal(err)
}

// メールボディを送信します。
wc, err := c.Data()
if err != nil {
    log.Fatal(err)
}
_, err = fmt.Fprintf(wc, "This is the email body")
if err != nil {
    log.Fatal(err)
}
err = wc.Close()
if err != nil {
    log.Fatal(err)
}

// QUIT コマンドを送信して接続を閉じます。
err = c.Quit()
if err != nil {
    log.Fatal(err)
}

func SendMail

func SendMail(addr string, a Auth, from string, to []string, msg []byte) error

SendMail は addr でサーバーに接続し,可能であれば TLS に切り替え,可能であればオプションのメカニズム a で認証してから,メッセージ msg を使用してアドレス from からアドレス to に電子メールを送信します。 "mail.example.com:smtp" のように, addr にはポートを含める必要があります。

to パラメータのアドレスは, SMTP RCPT アドレスです。

msg パラメータは,最初にヘッダ,空行,そして次にメッセージボディを含む RFC 822 スタイルの E メールであるべきです。 msg の行は CRLF で終わっているべきです。 msg ヘッダーには通常, "From" , "To" , "Subject" , "Cc" などのフィールドを含める必要があります。 "Bcc" メッセージの送信は, to パラメータに電子メールアドレスを含め, msg ヘッダには含まないことで実現されます。

SendMail 関数と net/smtp パッケージは低レベルのメカニズムであり, DKIM 署名, MIME 添付ファイル (mime/multipart パッケージを参照) ,またはその他のメール機能をサポートしていません。 より高レベルのパッケージは標準ライブラリの外に存在します。

コード:

// 認証情報を設定します。
auth := smtp.PlainAuth("", "user@example.com", "password", "mail.example.com")

// サーバーに接続し,認証を行い,送信者と受信者を設定し,電子メールをすべて 1 つのステップで送信します。
to := []string{"recipient@example.net"}
msg := []byte("To: recipient@example.net\r\n" +
    "Subject: discount Gophers!\r\n" +
    "\r\n" +
    "This is the email body.\r\n")
err := smtp.SendMail("mail.example.com:25", auth, "sender@example.org", to, msg)
if err != nil {
    log.Fatal(err)
}

type Auth

Auth は SMTP 認証メカニズムによって実装されています。

type Auth interface {
    // Start はサーバーとの認証を開始します。
    // 認証プロトコルの名前と,オプションでサーバーに送信された最初の AUTH メッセージに含めるデータを返します。
    // 認証をスキップする必要があることを示すために proto == "" を返すことができます。
    // nil 以外のエラーが返された場合, SMTP クライアントは認証の試行を中止して接続を閉じます。
    Start(server *ServerInfo) (proto string, toServer []byte, err error)

    // Next は,認証を続行します。
    // サーバーは, fromServer データを送信したばかりです。
    // もし more が真であれば,サーバーはレスポンスを期待します。
    // NEXT は toServer として返すべきです。
    // そうでなければ Next は toServer == nil を返すべきです。
    // Next が nil 以外のエラーを返した場合, SMTP クライアントは認証の試行を中止して接続を閉じます。
    Next(fromServer []byte, more bool) (toServer []byte, err error)
}

func CRAMMD5Auth

func CRAMMD5Auth(username, secret string) Auth

CRAMMD5Auth は, RFC 2195 で定義されている CRAM-MD5 認証メカニズムを実装する認証を返します。 返された認証は,指定されたユーザー名とシークレットを使用して,チャレンジ / レスポンスメカニズムを使用してサーバーを認証します。

func PlainAuth

func PlainAuth(identity, username, password, host string) Auth

PlainAuth は, RFC 4616 で定義されている PLAIN 認証メカニズムを実装する認証を返します。 返された認証は,指定されたユーザー名とパスワードを使用してホストへの認証を行い, ID として機能します。 通常, identity は,ユーザー名として機能するための空の文字列です。

PlainAuth は,接続が TLS を使用している場合,または localhost に接続されている場合にのみ資格情報を送信します。 それ以外の場合,認証情報を送信せずに認証がエラーで失敗します。

コード:

// hostname は, TLS 証明書を検証するために PlainAuth によって使用されます。
hostname := "mail.example.com"
auth := smtp.PlainAuth("", "user@example.com", "password", hostname)

err := smtp.SendMail(hostname+":25", auth, from, recipients, msg)
if err != nil {
    log.Fatal(err)
}

type Client

Client は, SMTP サーバーへのクライアント接続を表します。

type Client struct {
    // Text は,クライアントによって使用される textproto.Conn です。
    // クライアントが拡張機能を追加できるようにエクスポートされます。
    Text *textproto.Conn
    // エクスポートされていないフィールドがあります
}

func Dial

func Dial(addr string) (*Client, error)

Dial は, addr の SMTP サーバーに接続された新しいクライアントを返します。 "mail.example.com:smtp" のように, addr にはポートを含める必要があります。

func NewClient

func NewClient(conn net.Conn, host string) (*Client, error)

NewClient は,認証時に使用されるサーバー名として既存の接続とホストを使用して,新しい Client を返します。

func (*Client) Auth

func (c *Client) Auth(a Auth) error

Auth は,渡された認証メカニズムを使用してクライアントを認証します。 認証に失敗すると,接続が切断されます。 AUTH 拡張をアドバタイズするサーバーだけがこの機能をサポートします。

func (*Client) Close 1.2

func (c *Client) Close() error

Close は接続を閉じます。

func (*Client) Data

func (c *Client) Data() (io.WriteCloser, error)

Data はサーバーに DATA コマンドを発行し,メールヘッダーとボディの書き込みに使用できるライターを返します。 呼び出し側は, c で他のメソッドを呼び出す前にライターを閉じる必要があります。 Data への呼び出しの前には, Rcpt への 1 つ以上の呼び出しが必要です。

func (*Client) Extension

func (c *Client) Extension(ext string) (bool, string)

Extension は,拡張機能がサーバーによってサポートされているかどうかを報告します。 拡張子名は大文字と小文字を区別しません。 拡張機能がサポートされている場合, Extension はサーバーが拡張機能に対して指定したパラメータを含む文字列も返します。

func (*Client) Hello 1.1

func (c *Client) Hello(localName string) error

Hello は,指定されたホスト名として HELO または EHLO をサーバーに送信します。 このメソッドを呼び出す必要があるのは,クライアントが使用されているホスト名を制御する必要がある場合だけです。 それ以外の場合,クライアントは自動的に自分自身を "localhost" として紹介します。 Hello を呼ぶ場合,他のどのメソッドよりも先に呼ばれる必要があります。

func (*Client) Mail

func (c *Client) Mail(from string) error

Mail は渡された E メールアドレスを使ってサーバーに MAIL コマンドを発行します。 サーバーが 8BITMIME 拡張子をサポートしている場合, Mail は BODY=8BITMIME パラメータを追加します。 これによりメールトランザクションが開始され,その後に 1 つ以上の Rcpt 呼び出しが続きます。

func (*Client) Noop 1.10

func (c *Client) Noop() error

Noop は NOOP コマンドをサーバーに送信します。 サーバーへの接続が問題ないことを確認するだけです。

func (*Client) Quit

func (c *Client) Quit() error

Quit は QUIT コマンドを送り,サーバーへの接続を閉じます。

func (*Client) Rcpt

func (c *Client) Rcpt(to string) error

Rcpt は渡された E メールアドレスを使用してサーバーに RCPT コマンドを発行します。 Rcpt への呼び出しは, Mail への呼び出しに先行しなければならず,その後に Data 呼び出しまたは別の Rcpt 呼び出しが続く可能性があります。

func (*Client) Reset

func (c *Client) Reset() error

Reset はサーバーに RSET コマンドを送信し,現在のメールトランザクションを中止します。

func (*Client) StartTLS

func (c *Client) StartTLS(config *tls.Config) error

StartTLS は STARTTLS コマンドを送信し,それ以降のすべての通信を暗号化します。 STARTTLS 拡張をアドバタイズするサーバーだけがこの関数をサポートします。

func (*Client) TLSConnectionState 1.5

func (c *Client) TLSConnectionState() (state tls.ConnectionState, ok bool)

TLSConnectionState は,クライアントの TLS 接続状態を返します。 StartTLS が成功しなかった場合,戻り値はそれらのゼロ値です。

func (*Client) Verify

func (c *Client) Verify(addr string) error

Verify は,サーバー上の電子メールアドレスの有効性を確認します。 Verify が nil を返す場合,アドレスは有効です。 nil 以外のリターンが必ずしも無効なアドレスを示すわけではありません。 セキュリティ上の理由から,多くのサーバーはアドレスを検証しません。

type ServerInfo

ServerInfo は, SMTP サーバーに関する情報を記録します。

type ServerInfo struct {
    Name string   // SMTP サーバー名
    TLS  bool     // TLS を使用し, Name に有効な証明書を付けます
    Auth []string // 公認認証メカニズム
}