import "smtp"

RFC 5321で定義されているSimple Mail Transfer Protocolを実装しています。また、下の拡張も実装されています。

8BITMIME  RFC 1652
AUTH      RFC 2554
STARTTLS  RFC 3207

これ以外の拡張も、クライアント側で処理しても構いません。

パッケージファイル

auth.go smtp.go

SendMail関数

func SendMail(addr string, a Auth, from string, to []string, msg []byte) os.Error

SendMailは、addrのサーバへ接続し、可能であればTLSに切り替え、さらに可能であればaの機構を使って認証したあと、emailをfromアドレス(from)から、toアドレス(to)へメッセージ(msg)とともに送信します。

Auth型

Authは、SMTP認証機構を実装しています。

type Auth interface {
    // Startは、サーバとの認証を開始します。この関数は認証
    // プロトコルの名前と、オプションとしてサーバへ送信され
    // る最初のAUTHメッセージに含むべきデータを返します。この関
    // 数は、認証をスキップしなければならないことを示すため、
    // proto == ""を返すことができます。この関数が、
    // os.Errorとしてnil以外を返したときは、SMTPクライアント
    // は、認証の試みを取りやめ、接続をクローズします。
    Start(server *ServerInfo) (proto string, toServer []byte, err os.Error)

    // Nextは、認証を続けます。fromServerは、今、サーバから送られて
    // きたデータです。moreがtrueのとき、NextからtoServerとして返さ
    // れる応答をサーバは期待しています。falseのときは、Nextは
    // toServer == nilを返さなくてはなりません。この関数が、os.Error
    // としてnil以外を返したときは、SMTPクライアントは、認証の試みを取り
    // やめ、接続をクローズします。
    Next(fromServer []byte, more bool) (toServer []byte, err os.Error)
}

PlainAuth関数

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

PlainAuthは、RFC 4616で定義されているPLAIN認証機構を実装したAuthを返します。返されるAuthは、hostへのTLS接続上で認証を行うために、与えられたusernameとpasswordを使い、認証後はidentityとして振る舞います。通常は、usernameとして振る舞わせるために、identityはブランクのままにしておきます。

Client型

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

type Client struct {
    // Textは、Clientで使用されるtextproto.Connです。これは、クライアントで
    // 拡張を加えられるようエクスポートされています。
    Text *textproto.Conn
    // contains unexported fields
}

Dial関数

func Dial(addr string) (*Client, os.Error)

Dialは、addrのSMTPサーバへ接続した、新しいClientを返します。

NewClient関数

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

NewClientは、既存の接続と、認証時に使用したサーバ名であるhostを使う新しいClientを返します。

(*Client) Auth関数

func (c *Client) Auth(a Auth) os.Error

Authは、与えられた認証メカニズムを使い、クライアントを認証します。認証に失敗すると接続はクローズされます。AUTH拡張を明言しているサーバだけが、この機能をサポートしています。

(*Client) Data関数

func (c *Client) Data() (io.WriteCloser, os.Error)

Dataは、サーバにDATAコマンドを発行し、データの書き込みに使用できるWriterを返します。呼び出し側は、cが持つメソッドのどれかを再び呼び出す前に、このWriterをクローズしなくてはなりません。Dataの呼び出しは、Rcptを一回以上呼び出した後でなければなりません。

(*Client) Extension関数

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

Extensionは、このサーバが、指定した拡張をサポートしているかどうかを返します。拡張名は大文字・小文字を区別しません。拡張がサポートされているときは、サーバがこの拡張に設定しているパラメータを格納した文字列を返します。

(*Client) Mail関数

func (c *Client) Mail(from string) os.Error

Mailは、指定したemailアドレスを使用してサーバへMAILコマンドを発行します。このサーバが、8BITMIME拡張をサポートするとき、Mailは、BODY=8BITMIMEパラメータを付け加えます。これによってメールのトランザクションが開始され、そのあとに一回以上のRcptの呼び出しが続きます。

(*Client) Quit関数

func (c *Client) Quit() os.Error

Quitは、サーバへQUITコマンドを送信し、接続をクローズします。

(*Client) Rcpt関数

func (c *Client) Rcpt(to string) os.Error

Rcptは、指定されたemailアドレスを使用してサーバにRCPTコマンドを発行します。Rcptの呼び出しは、Mailを呼び出した後でなければならず、そのあとにDataの呼び出し、もしくは再度Rcptの呼び出しが続きます。

(*Client) Reset関数

func (c *Client) Reset() os.Error

Resetは、サーバにRSETコマンドを送信し、カレントのメールトランザクションを中断します。

(*Client) StartTLS関数

func (c *Client) StartTLS() os.Error

StartTLSは、STARTTLSコマンドを送信し、以降のすべての通信を暗号化します。STARTTLS拡張を明言しているサーバだけが、この機能をサポートしています。

(*Client) Verify関数

func (c *Client) Verify(addr string) os.Error

Verifyは、サーバ上のemailアドレスの有効性をチェックします。Verifyがnilを返したとき、アドレスは有効です。nil以外が返されたときも、必ずしもアドレスが無効であることを示すわけではありません。多くのサーバでは、セキュリティの理由からアドレスの確認は行いません。

ServerInfo型

ServerInfoは、SMTPサーバについての情報を記録します。

type ServerInfo struct {
    Name string   // SMTPサーバ名
    TLS  bool     // Nameの証明書が有効なTLSが使われているか
    Auth []string // 公示されている認証機構
}