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