Laravelで理解するメール配信の仕組み

send mail

皆さんはメールがどのように送信され受信者に届いているかご存じですか?

先日、会社のメンバーとメールサーバーについて話し合った際に「そもそもメールサーバーってなんだ?」という議論になりました。その時は理解が曖昧だったため説明することができませんでした。

そこで今回はLaravelでメールを送信する場合を想定して、どのような流れでメールが配信されているのかについてまとめてみました。

メールが受信者に届くまでの流れ

メールは下記の流れで送信されます。

①アプリケーションサーバーからメールサーバー(SMTPサーバー)に送信される
②メールサーバーはDNSサーバーに対してメールアドレスのIPアドレスをリクエストする
③DNSサーバーから宛先のメールアドレスのIPアドレスを特定し送信メールサーバーへレスポンスする。
④宛先のメールサーバーへ送信する(送信完了)
⑤受信者は届いたメールを閲覧する

Laravelで.envの設定

Laravelでメール機能を実装し、実際にメールを送信する際に.envには以下のような記述をしています。

MAIL_MAILER=smtp
MAIL_HOST=smtp.juno-blog.site
MAIL_PORT=587
MAIL_USERNAME=info@juno-blog.site
MAIL_PASSWORD=12345678
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=info@juno-blog.site
MAIL_FROM_NAME="${APP_NAME}"

上記の設定で、sato@company.comにメールを送信すると仮定して流れをみていきましょう。

①メールサーバー(SMTPサーバー)へ送信

まずアプリケーションで本文を作成したら、MAIL_HOSTであるsmtp.juno-blog.siteというメールサーバー(SMTPサーバー)に送信します。この際、SMTPというプロトコルでやりとりされます。

メールサーバーにメール送信依頼をするには認証が必要となります。その認証で使われるのがMAIL_USERNAMEとMAIL_PASSWORDです。

MAIL_USERNAMEとMAIL_PASSWORDがあっていれば、そのメールサーバーでメールを送信することができます。

②宛先メールアドレスの名前解決(IPアドレスの特定)

メールサーバーに送られたメールは次に宛先のメールアドレスのIPアドレスを確認します。

確認はメールサーバーからDNSサーバーに対して行われます。

DNSには以下のような形でレコード情報を持っています。

MXレコード:company.comのメールサーバードメイン=> mai.company.com

Aレコード:mai.company.comのIPアドレス

DNSサーバーではまず、送信先のドメイン(company.com)からMXレコードでメールサーバのドメインを特定します。

そして、そのメールサーバーのドメインのAレコードからメールサーバーのIPアドレスを特定します。

③宛先メールアドレスの名前解決(IPアドレスの特定)

IPアドレスが特定できたらメールサーバーに返却します。

④宛先のメールサーバーへ送信する

メールサーバーは宛先のメールサーバーへメールを送信します。

これでメールの送信は完了です。

参考:送信元メールアドレスはみていない?!

さて、受信したメールを見るとFROMメールアドレスから誰からメールが来たのか判断するかと思います。

しかしこれ、実はなんでもいいんです。

試しに.envのMAIL_FROM_ADDRESSを適当なメールアドレスにしてみて送信してみてください。

ちゃんと送信できるはずです。

メールの仕組み上、送信元のアドレスの確認はしていません。送信元をみるのは何かしらエラーになった場合です。

これはハガキを出す時と同じですね。宛先さえ書いてあればハガキは送られます。

(実際にはEメールを送信する際、送信元を示す2つのアドレスを使用します。メッセージの受取人に表示される差出人アドレス(これがメール閲覧時よくみる方)と、メッセージの発信元を示すMAIL FROMアドレスです。メールをソースで見るとわかります。)

つまり、送信元を偽ることができるのです。

そのため、通常は受信側でSPFなどの送信元の確認を行なっているのが普通です。

気になる方は他で調べてみてください。

まとめ

いかがだったでしょうか。普段メール配信の仕組みを考える機会がなかったので動画などをみて色々勉強しました。少しはメールの仕組みを理解できたかと思います。

DNSの設定ではこの理解が必要なので理解しておきたいことです。