SMTPの入門¶
概要¶
SMTPとメールについて解説する。電子メールの基本的な登場人物、データ(メール)の流れ、postfixも解説する
メタ情報¶
TODOでやり残したこと書いてある。
grep TODO してね
具体的技術¶
以下のあたりを想定して考える
- postfix
- Thunderbird
- mailコマンド
- telnet
SMTP¶
Simple Mail Transfer Protocol。メール送信に使われる通信プロトコル、アプリケーション層。
HTTPと同じようにテキストベースのプロトコルなのでtelnetコマンドとか使ってメールの送信ができる。
一つ一つのコマンドは以下のような形をしている。
[コマンド] [引数]
TCPを使用し、ポート番号は25番です。
プロトコルとして認証機能を持っていない点は覚えておいてください。
通信の具体例を見てみましょう。以下はメールサーバであるmail.example.comに接続して通信の具体例です。
- $ telnet mail.example.com 25
- Trying 10.232.45.151
- Connected To mail.example.com
- Excape character is '}'.
- 220 mail.example.com ESMTP Postfix
- HELO mail.oreilly.com
- 250 mail.oreilly.com
- MAIL FROM:info@oreilly.com
- 250 OK
- RCPT TO:kdent@example.com
- 250 OK
- DATA
- 354 End data with . *
- Date: Mon, 8 Apr 2003 15:38:21 -500
From: Customer Service <info@oreilly.com>
Reply-To: <service@oreilly.com>
Message-ID: 01a4e22382000842@mail.oreilly.com
Subject Have you read RFC2822?
This is the start of the body of the message. It coulud continue
for many lines, but itdosn't
.- 250 Ok: queued as 5FA26B3DEF
- quit
- 221 Bye
- Connection closed by foreign host:
太字 の部分が打ち込む部分になります。
HTTPと違い、複数のコマンドから成り立つプロトコルです。一つ一つはコマンドを送信->ステータスコード等が帰ってくるという流れで同じです。
ThunderbirdやPOPサーバはどこで出てくるの?と思った鋭い方には以下の図をご覧ください。
引用元:https://baremetal.jp/blog/2017/12/08/468/
メールリレー¶
さて、実際のところは多くのSMTPサーバを経由していいます。。電子メールのソースを開いてヘッダ部分を読んでみましょう。「Received: 」というヘッダがいくつも連なっています。(偽装されていなければ)それだけのSMTPサーバをそのメールは経由していることを示しています。
実際のメールヘッダで見てみましょう。単純なReceivedヘッダだけ強調してします。
Delivered-To: user@example.com
Received: by 2002:adf:fb82:0:0:0:0:0 with SMTP id a2csp5486028wrr;
Tue, 9 Apr 2019 05:14:07 -0700 (PDT)
X-Google-Smtp-Source: APXvYqzLZUnBBAebjBeP6CoG6iHWFIr5HqiEMQIPrHSibhHtGt30H86iahq3PKzM4dpFPreaj3p7
X-Received: by 2002:a62:7648:: with SMTP id r69mr17135214pfc.114.1554812047772;
Tue, 09 Apr 2019 05:14:07 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1554812047; cv=none;
d=google.com; s=arc-20160816;
b=om+zTuGc52fEw506jfgyFaI9HntClcj5VWzjU6xuk2oMdFUhL6G2UoeY8EMwehKjoU
SQUprD2bNLvFj5FjTVfXS4lBbp3IAJlYoG1rC1hl9N0stXfItqgLc5BKHW+QNEm9MdC0
X/nTkyon0yrlgih8r22NWnvdTDEGDE/uDk5yuIPiCBXAy6XB9bIR344uSyQR+HDdATJu
rkZrSIPD6PQx5Tb/ybHdjjZXZ+naZAw/YmrVPcoQlNYuDpugbjfRuXjeWwNEfx74qdZJ
0VAbpIyLYfGnZREVSAAJ0fE24d4H0kM5m9UJ6l9lh7Y5RSVVXEEII7bZVZ1Lmsmo8WXz
8sQw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=date:content-transfer-encoding:mime-version:subject:message-id:to
:from;
bh=A0xNuAoaQrVrZmXYQqHcnjccHMHctS5+2uQNDEy2E7A=;
b=Dtcawz+r3BIW5rUHFdSMz+43ANqKZTOm3W76POOiC/6+ryo+XuZygyBjspmpCoYy38
JfiVMDGfvyxenj3ZLDnJ8E4FGhmmk7xxzPbX8Vkc2dfIb5nWlp1uU1Q41peFqrFFvljv
tZbh1N+w5hzMHWJ/bWS48vC8rJHIRLqW2oXAvJqcf23m8J9Uwm+InkJPwg8eQiHmNTpG
TtPboA4Y4tCTVwSk1PoEMpNiWtleZ6a9hJFSsvgNOao6dMIiGEj1QtU1heSWQOzIA4EM
8z2yVuKuoTdyJdoTBpPruab3dPlVW0fDuiY7os+iP8T/BzTdQ20I0Nrfrpf+iWfKeDvP
bbVg==
ARC-Authentication-Results: i=1; mx.google.com;
spf=pass (google.com: domain of bounce-onamae@gmo.jp designates 163.44.91.18 as permitted sender) smtp.mailfrom=bounce-onamae@gmo.jp
Return-Path: bounce-onamae@gmo.jp
Received: from smisc-smtp01.gmo.jp (mta-a018.static.smisc.gmo.jp. [163.44.91.18])
by mx.google.com with ESMTP id f16si29233269pgj.149.2019.04.09.05.14.07
for user@example.com;
Tue, 09 Apr 2019 05:14:07 -0700 (PDT)
Received-SPF: pass (google.com: domain of bounce-onamae@gmo.jp designates 163.44.91.18 as permitted sender) client-ip=163.44.91.18;
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of bounce-onamae@gmo.jp designates 163.44.91.18 as permitted sender) smtp.mailfrom=bounce-onamae@gmo.jp
Received: from 172.21.221.120 (unknown [172.21.221.120]) by smisc-smtp01.gmo.jp (Postfix) with ESMTP id 90BE11AA475; Tue,
9 Apr 2019 21:14:06 +0900 (JST)
From: "\"お名前.com\"" admin@onamae.com
To: weakhold27@gmail.com
Message-ID: 359007069.13.1554812046597.JavaMail.root@miscmail-vip.internal-gmo
Subject: [お名前.com]DNSレコード設定 完了通知 udonge-in.reisen
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: quoted-printable
X-RECNO: 20190409211323567-162950-2-113
Date: Tue,
9 Apr 2019 21:14:06 +0900 (JST)
こんな感じにSMTPによる通信は「送信」、「受信」で一台ずつではなく何台ものSMTPサーバを経由しているみたいです。
以前どこかできいた話です。送信するメールに対して様々な処理を行うサービスを実装するとき、処理Aを行うサーバ、処理Bを行うサーバ…と複数台のメールサーバを直列に並べて行くことで機能を実現したりするそうです。大変ですね。
このようにSMTPサーバは送受信以外にも「中継」を行います。これをリレーといいます。
php.iniとメール¶
phpでメールを送信するときはphp.ini上で設定項目があります。Windowsの場合は、SMTPから設定したsmtpサーバを通して(これは、デフォルトはlocalhost)、Linuxの場合はsendmail_path通じています。sendmail_pathからはsendmailコマンドが呼び出され、デフォルトではsendmailコマンドがpostfixに通じていくようです。
https://www.php.net/manual/ja/mail.configuration.php
http://www.postfix.org/OVERVIEW.html
スパムメール¶
さて、最初のSMTPの具体例を見ても分かるようにSMTPの通信は認証をしなくても成立します。postfixは送信元を制限可能にはなっていますが、それをやると見知らぬ相手からのメールを受け取れなくなります。しかし単純に全世界からのメールをリレーする設定だとスパムメール配信者によって自身のメールサーバを踏み台にされます。
おそらく、電子メールに関する技術はスパムとの戦いだったのではないかなぁ。そこは今は省きます。
メールとDNS¶
さて、メールを送信するには受信サーバのIPアドレスが必要です。HTTPならURLのホスト部を見てDNSで解決しますが、メールはどうでしょう?メールもメールアドレスを見てDNSで解決します。user@example.comというメールアドレスのexample.comをDNSを使って解決します。
URLのwww.example.comの場合Aレコードというものが使われる(かもしれません)。Aレコードはホスト名とIPを対応づけるためにDNSに蓄える情報です。
例えば以下のような情報が設定されます。
A www.example.com 192.168.200.10
それに対して、メールの場合MXレコードというレコードが設定されます。
MX example.com mx.example.com
厳密には色々と間違っていますが、MXレコードとAレコードという言葉をひとまず覚えましょう。以下のページなどが勉強になります
https://f5.com/jp/education/glossary/glossary038-21520
postfix¶
また今度