github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/smtp/smtp.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // smtp パッケージは RFC 5321 で定義されている Simple Mail Transfer Protocol を実装しています。 6 // さらに、以下の拡張も実装しています: 7 // 8 // 8BITMIME RFC 1652 9 // AUTH RFC 2554 10 // STARTTLS RFC 3207 11 // 12 // クライアント側で追加の拡張も扱うことができます。 13 // 14 // smtp パッケージは凍結されており、新しい機能の追加は受け付けていません。 15 // いくつかの外部パッケージがより多機能を提供しています。以下を参照してください: 16 // 17 // https://godoc.org/?q=smtp 18 package smtp 19 20 import ( 21 "github.com/shogo82148/std/crypto/tls" 22 "github.com/shogo82148/std/io" 23 "github.com/shogo82148/std/net" 24 "github.com/shogo82148/std/net/textproto" 25 ) 26 27 // ClientはSMTPサーバーへのクライアント接続を表します。 28 type Client struct { 29 30 // TextはClientによって使用されるtextproto.Connです。拡張機能を追加できるように、公開されています。 31 Text *textproto.Conn 32 33 // 後でTLS接続を作成するために接続への参照を保持する 34 conn net.Conn 35 // クライアントがTLSを使用しているかどうか 36 tls bool 37 serverName string 38 // サポートされる拡張子のマップ 39 ext map[string]string 40 // サポートされている認証メカニズム 41 auth []string 42 localName string 43 didHello bool 44 helloError error 45 } 46 47 // Dialはaddrに指定されたポート付きのSMTPサーバーに接続された新しい [Client] を返します。 48 // addrは"mail.example.com:smtp"のような形式である必要があります。 49 func Dial(addr string) (*Client, error) 50 51 // NewClient は既存の接続とホストを使用して新しい [Client] を返します。認証時に使用するサーバー名です。 52 func NewClient(conn net.Conn, host string) (*Client, error) 53 54 // Closeは接続をクローズします。 55 func (c *Client) Close() error 56 57 // Helloメソッドは、指定されたホスト名としてサーバーにHELOまたはEHLOを送信します。 58 // クライアントが使用するホスト名を制御する必要がある場合にのみ、このメソッドを呼び出す必要があります。 59 // それ以外の場合は、クライアントは自動的に「localhost」として自己紹介します。 60 // Helloメソッドを呼び出す場合は、他のメソッドのいずれかを呼び出す前に呼び出す必要があります。 61 func (c *Client) Hello(localName string) error 62 63 // StartTLSはSTARTTLSコマンドを送信し、以降のすべての通信を暗号化します。 64 // この機能をサポートするのは、STARTTLS拡張機能を広告するサーバーのみです。 65 func (c *Client) StartTLS(config *tls.Config) error 66 67 // TLSConnectionState はクライアントのTLS接続状態を返します。 68 // [Client.StartTLS] が成功しなかった場合、返り値はゼロ値になります。 69 func (c *Client) TLSConnectionState() (state tls.ConnectionState, ok bool) 70 71 // Verifyはサーバー上でメールアドレスの妥当性をチェックします。 72 // Verifyがnilを返す場合、アドレスは有効です。非nilの返り値は 73 // 必ずしも無効なアドレスを示すわけではありません。セキュリティ上の理由から、 74 // 多くのサーバーはアドレスの検証を行わない場合があります。 75 func (c *Client) Verify(addr string) error 76 77 // Authは提供された認証メカニズムを使用してクライアントを認証します。 78 // 認証に失敗した場合、接続は閉じられます。 79 // この機能は、AUTH拡張機能をサポートしているサーバーのみが広告しています。 80 func (c *Client) Auth(a Auth) error 81 82 // Mailは提供されたメールアドレスを使用してサーバーにMAILコマンドを発行します。 83 // サーバーが8BITMIME拡張をサポートしている場合、MailはBODY=8BITMIMEパラメータを追加します。 84 // サーバーがSMTPUTF8拡張をサポートしている場合、MailはSMTPUTF8パラメータを追加します。 85 // これにより、メールのトランザクションが開始され、その後に1つ以上の [Client.Rcpt] 呼び出しが続きます。 86 func (c *Client) Mail(from string) error 87 88 // Rcptは提供されたメールアドレスを使用してサーバーにRCPTコマンドを発行します。 89 // Rcptの呼び出しは、[Client.Mail] の呼び出しの前に行われなければならず、[Client.Data] の呼び出しまたは別のRcptの呼び出しの後に続く場合があります。 90 func (c *Client) Rcpt(to string) error 91 92 // DataはサーバーにDATAコマンドを送信し、メールのヘッダーと本文を書き込むために使用できるライターを返します。呼び出し元は、cの他のメソッドを呼び出す前にライターを閉じる必要があります。Dataの呼び出しは、一つ以上の [Client.Rcpt] の呼び出しに先行する必要があります。 93 func (c *Client) Data() (io.WriteCloser, error) 94 95 // SendMailはaddrで指定されたサーバに接続し、可能な場合はTLSに切り替え、必要に応じてオプションのメカニズムaで認証し、fromからのアドレス、toへのアドレス、メッセージmsgを送信します。 96 // addrにはポートを含める必要があります。例:"mail.example.com:smtp" 97 // 98 // toパラメータのアドレスは、SMTPのRCPTアドレスです。 99 // 100 // msgパラメータは、ヘッダ、空行、メッセージ本文の順になったRFC 822スタイルの電子メールである必要があります。msgの各行はCRLFで終端する必要があります。msgのヘッダには通常、"From"、"To"、"Subject"、"Cc"などのフィールドが含まれるべきです。"Bcc"メッセージを送信するには、toパラメータにメールアドレスを含め、msgのヘッダには含めません。 101 // 102 // SendMail関数とnet/smtpパッケージは低レベルのメカニズムであり、DKIM署名、MIME添付ファイル(mime/multipartパッケージを参照)、その他のメール機能をサポートしていません。高レベルのパッケージは標準ライブラリの外部に存在します。 103 func SendMail(addr string, a Auth, from string, to []string, msg []byte) error 104 105 // Extensionはサーバーが対応している拡張機能かどうかを報告します。 106 // 拡張機能名は大文字小文字を区別しません。もし拡張機能が対応されている場合、 107 // Extensionは拡張機能に対してサーバーが指定する任意のパラメータを含む文字列も返します。 108 func (c *Client) Extension(ext string) (bool, string) 109 110 // Resetは、現在のメールトランザクションを中止し、サーバーにRSETコマンドを送信します。 111 func (c *Client) Reset() error 112 113 // NoopはサーバーにNOOPコマンドを送信します。これによってサーバーとの接続が正常であることを確認します。 114 func (c *Client) Noop() error 115 116 // QuitはQUITコマンドを送信し、サーバーへの接続を閉じます。 117 func (c *Client) Quit() error