SMTP(簡易メール転送プロトコル)は、TCP / IPネットワークを介して電子メールを送信するように設計されたネットワークプロトコルです。
ESMTP(拡張SMTP)は、SMTPプロトコルのスケーラブルな拡張機能です。 現在、「SMTPプロトコル」とは、原則として、ESMTPとその拡張機能を意味します。
現在、純粋な形式のSMTPは実際には使用されていないことにすぐに気付きます。 基本認証もサポートしていません... ESMTPが使用されています。 メールクライアント(Outlook、Thunderbird、Evolution、TheBat)でメールを送信する場合、このプロトコルは正確に機能します。
このプロトコルで作業するには、特定のポートでメールサーバーに接続し、ESMTPコマンドのシーケンスを送信する必要があります。
コマンドは次の形式の行です
TEAM [スペース]
パラメーター (オプション)
コマンドへの応答として、サーバーは次の形式の文字列を返します
XXX [スペース]
追加。 情報この場合、サーバー応答のXXX番号は以下を示します。
2XX-コマンドは正常に完了しました
3XX-クライアントから追加データが期待されます
4XX-一時的なエラー。クライアントはしばらくしてから次の試行を行う必要があります
5XX-致命的なエラー
それでは、ポイントに行きましょう-コンソールからメールサーバーを介して電子メールを送信してみましょう(LinuxでもWindowsでも構いません)。 そのため、このプロトコルを簡単に知ることができます-実際にすぐに。 コマンドを引用し、同時にその意味を説明します。
この実験では、Yandexメールサーバーを使用します。 すでにアカウントが存在していることがわかります...
すべてのコマンドを接続した後、できるだけ早く入力する必要があるため、すぐに警告します。 約15秒の遅延で、接続は自動的に切断されます。 最初にテキストエディターですべてのコマンドを事前に入力してから、コマンドラインに貼り付けることをお勧めします。
telnet smtp.yandex.ru 2025 #smtpメールサーバーに接続します。 SMTPサーバーのアドレスとポートは、メーラーサイトの指示に記載されています。
答えは:
213.180.204.38を試す...
smtp.yandex.ruに接続しました。
エスケープ文字は「^]」です。
220 Yandex ESMTP(NO UCE)(NO UBE)サーバー準備完了、月、2009年2月2日13:47:22 +0300
コード
220は正常な接続を示します
EHLO [91.198.212.5] #サーバーを歓迎し、外部IPを送信します(IPは送信する必要はありません
。EHLOだけを実行できますが、サーバーはおそらくそれを誓います)
UPD: IP
ではなく
EHLO you.provider.domainのようなこのIPのドメイン名を角括弧なしで送信することをお勧めします
答えは:
250-smtp18.yandex.ru Hello 91.198.212.5
250サイズ20971520
250-8BITMIME
250-パイプライン
250チャンキング
250の強化されたステータスコード
250-DSN
250-X-RCPTLIMIT 25
250-AUTH =ログイン
250-AUTHログイン
250-STARTTLS
250ヘルプ
サーバーはグリーティングを受け入れ、サポートされているコマンドのリストを送信しました。 このリストから、AUTH LOGINに興味があります。 これは、base64でエンコードされたログインとパスワードを使用してサーバーで認証するためのコマンドです。 そのため、base64でエンコードされたパスワードを準備し、メールから事前にログインする必要があります。 これは、たとえばここで
seriyps.ru/cryptまたはLinuxのコマンド
echo [your password / login] |で実行できます。 base64AUTH LOGIN #認証の意図をサーバーに通知します
答えは:
334 VXNlcm5hbWU6
このVXNlcm5hbWU6はbase64でエンコードされた単語「Username:」であり、応答番号3XXはサーバーが追加情報を待っていることを意味します。 彼を動揺させないようにしましょう。
YOUR MAIL_LOGIN_B__BASE_64 #メールユーザー名をbase64で送信します。たとえば、dmFzaWFwdXBraW4 =
答えは:
334 UGFzc3dvcmQ6
ご想像のとおり、これはbase64の「パスワード:」です
YOUR_MAIL_PASSWORD_ IN_BASE_64 #base64でメールパスワードを送信します(例:MTIzNDU2)
答えは:
235認証に成功しました。
つまり 認証が成功しました。 メールを送信できるようになりました)
MAIL FROM:vasiapupkin@ya.ru#アドレスvasiapupkin@ya.ruからメールを送信したいことを通知します(アドレスは任意です(存在しないドメインからのものを含みますが、スパムのチェック時に確認できます))
答えは:
250 2.1.0送信者構文OK;
RCPT TO:billy@microsoft.com #billy@microsoft.comにメールを送信したいことをお知らせします
答えは:
250 2.1.5受信者のアドレス構文OK。 rcpt = <billy@microsoft.com>
データ #ここで、データ転送を開始していることをお知らせします。
答えは:
354メール入力を開始します。 <CRLF>で終わります。
つまり サーバーは、Enterを押すまでコンソールに入力されたデータを読み取ります。Enterを押します(この組み合わせの後、メッセージはすぐに送信されます)
電子メールは次の部分で構成されています。
- SMTPプロトコルヘッダー(MAIL FROM:およびRCPT TO:で入力するものと、いくつかのオーバーヘッド情報)
- ヘッダー文字。 (送信者、返信先、宛先、スパムチェックに関するメモ、件名、 MIMEタイプ 、エンコードなど)
- 手紙の本文。 (空行、プレーンASCIIテキスト、またはMIMEタイプに対応するデータセットによって見出しから分離されています)
手紙の見出しを入力し始めます。 base64でエンコードされたファイルを挿入することもできますが、これはすでに記事の範囲外です。
From:Vasia Pupkin <vasiapupkin@ya.ru>#Fromフィールドのタイトル
To:Billy G <billy@microsoft.com>#Toフィールドのタイトル
件名:Hello Billy #メッセージの件名のタイトル
(ところで、MAIL FROM:vasiapupkin@ya.ruおよびFrom:Vasya Pupkin <vasiapupkin@ya.ru>はまったく一致する必要はありません!つまり、Yandexからメールを送信し、メールから送信されたふりをすることができます。 ruたとえば...対処方法-プロトコルはほぼ30年前です。計算するのはそれほど難しくありませんが...)
2回入力してから、文字自体のテキストを入力します。
こんにちはビリー! 明日死ぬ!入力してください。 入力 #メッセージの送信が完了したことを通知します
答えは:
250 2.0.0が受け入れられました。 S10436885AbZBBKvs
つまり 送信のために受信したメッセージ
これで、さらにいくつかのレターを送信(MAIL FROM:RCPT TO :)またはセッションを終了できます
QUIT #セッションを終了
答えは:
221 2.0.0 smtp18.yandex.ruアウト
外部ホストによって接続が閉じられました。
以上です。 ご覧のとおり、プロトコルは非常にシンプルで、主な問題は文字の本文の形成です。
要約すると:
telnet smtp.yandex.ru 2025
EHLO 91.198.212.5
AUTH LOGIN
____BASE_64
____BASE_64
MAIL FROM: vasiapupkin@ya.ru
RCPT TO: billy@microsoft.com
DATA
From: <vasiapupkin@ya.ru>
To: <billy@microsoft.com>
Subject: Hello Billy
Hello, Billy! You will be die tomorrow!
.
QUIT
もちろん、非ASCIIテキストエンコーディングでメールを送信することに関する情報はありません。添付ファイルやMIMEについては書かれていませんが、詳細が必要な場合は以下のリンクをご覧ください。
WikiメールSMTP WikiMime Wikirfc5321アプリケーションを開発する場合、通常、SMTPを直接操作する必要はありません。これは、さまざまなフレームワークまたは標準機能を使用するためです。 PHPの場合、次を確認できます。
SMTP PEAR拡張機能
PHPMailer電子メールライブラリ良い実験をしてください!