SendGrid 新人成長記 第八回 SMTPサーバに接続してメールを送る
年が明けてあっという間に一ヶ月が経ち、私が新人でいられる時間も残りわずかになってしまいました。この頃は、自力でメール配信をする大変さやSendGridなどのメール配信サービスの便利さをもっと知るべく、SendGridの機能に限定せず、一般的なメール送信の理解を深めたいなと思っています。今回はその初歩として、メール送信の基本的なプロトコルであるSMTPを実際に試してみたいと思います。
SMTPとは
メールがどういう流れで宛先まで届くのか、このブログの読者の方ならご存知の方が多いのではないでしょうか。ただ私のように、送信ボタン一つでメールが送れるのが当然で、それ以上のことを知らない方のためにとても簡単に説明すると、以下の図のようになります。
メールクライアントの送信ボタンを押すと、メールは最初に送信側のメールサーバに送られます。受け取ったサーバは受信側のメールサーバに配送し、最終的に受信者はそこからメールを受け取ります。
SMTPはSimple Mail Transfer Protocolの略で、差出人-メールサーバ間やメールサーバ同士でメールをどのように受け渡すかを規定するプロトコルです。プロトコルとは、通信における「作法」のようなものです。はがきを送る際にも、郵便番号や住所や本文をどこにどのように書くかという「作法」が決められていますね。メールの場合も同様に、データをやり取りするための作法=プロトコルに従わなければなりません。はがきの場合は国によって「作法」が異なるため、日本のはがきを海外でのやり取りに使うことはできませんが、メールの場合は全世界共通の「作法」が定められていて、これがSMTPです。
メールクライアントで送受信をふつうにしている限りでは、この作法を意識する必要はありません。私たちが文面を書き、宛先を入力し、送信ボタンを押すと、裏でメールクライアントがSMTPにのっとった形でメールを送ってくれています。そこで今回は、このSMTPを直接使ってメールの作法を体験してみたいと思います。
SendGridのSMTPサーバに接続してメールを送る
SendGridユーザであればSMTPを用いてSendGridからメールを送信することができます。ターミナルから、以下のようにしてSendGridのメールサーバ smtp.sendgrid.net に接続します。
$ telnet smtp.sendgrid.net 587 220 SG ESMTP service ready at ismtpd0000xxxxxx.sendgrid.net
telnetは遠隔地にあるサーバを操作するためのコマンドです(環境によってはインストールが必要)。587はSendGridが推奨するポート番号です。上のように2xxの返答が返ってきて接続ができたら、以下のように「挨拶」をして自分の身元を知らせます(以後、数字から始まる行はサーバからの応答で、それ以外はこちらの入力です)。
EHLO kke.co.jp 250-smtp.sendgrid.net 250-8BITMIME 250-PIPELINING 250-SIZE 31457280 250-STARTTLS 250-AUTH PLAIN LOGIN 250 AUTH=PLAIN LOGIN
EHLOコマンドに続けて自分のドメインをお知らせすると、接続先のメールサーバのドメインとともに利用可能な機能を教えてくれます。
次に、ユーザ名とパスワードで認証しましょう。
AUTH LOGIN 334 VXNlcm5hbWU6 YXBpa2V5 334 UGFzc3dvcmQ6 <<APIキーをBASE64エンコードした文字列>> 235 Authentication successful
AUTH LOGINと入れると、はじめにユーザ名を聞かれます(”VXNlcm5hbWU6”は”Username:”がBASE64エンコードされた文字列)。SMTPを使う場合もAPIキーを用いてメール送信ができ、その場合”apikey”がユーザ名になります。認証情報はBASE64でエンコードして送る必要があるので、”apikey”をBASE64エンコードした”YXBpa2V5”を入れます。
次にパスワードが求められるので(”UGFzc3dvcmQ6”は”Password:”がBASE64エンコードされたもの)、APIキーをBASE64エンコードして入力しましょう。BASE64によるエンコードは、MacやLinuxならターミナルで以下のようにするとできます。
$ echo -n <<APIキー>> | base64
次にMAIL FROM とRCPT TOでメールの送信者と宛先を指定します。
MAIL FROM: fromaddress@kke.co.jp 250 Sender address accepted RCPT TO: toaddress@example.com 250 Recipient address accepted
最後にDATAコマンドでメールの中身を書いていきます。
DATA 354 Continue To: toaddress@example.com From: fromaddress@kke.com Subject: Test mail This is body of the message. . 250 Ok: queued as hoge
To, From, Subjectはいわゆるメールヘッダの情報で、メールクライアントでメールを開いたときに表示されます。差出人や宛先はすでに指定したじゃないかと思うかもしれませんが、手紙を出すときに封筒にも手紙の文面そのものにも差出人と宛名を書くのと同じイメージをするのがいいかもしれません。あくまで表示のためのものなので、ここに何を書いても、RCPT TOで指定したアドレスさえ正しければ原理上メールは届きます。多くのスパムメールはこの原理を悪用して身元を偽装します。
ヘッダ部の後ろに改行だけの行を挟んでメール本文(ボディ部)を書き、最後にピリオドを打って終了を知らせると、メールが送られます。
QUIT 221 See you later
接続の終了にはQUITコマンドを用います。
ちなみにSendGridでSMTPを用いてメールを送る際は、メールヘッダに”X-SMTPAPI”というパラメータを指定することにより、色々なカスタマイズが可能です。ただし、Web APIの方が設定も簡単で機能も充実しているので、そちらを使うことをおすすめしています。
文章を書いて送信ボタンをクリックするだけと思っていた操作の裏側で、このような一連の(面倒な)やりとりが行われているとは今まで知りませんでした。
このような基礎知識を知って初めて、スパムメールの手口やその対処の必要性などがよりよくわかったので、今後もメールの仕組みを理解していきたいと思います!