プロジェクト

全般

プロフィール

SMTPの入門 » 履歴 » バージョン 2

健二 酒井, 2019/04/15 23:55

1 1 健二 酒井
# SMTPの入門
2 1 健二 酒井
3 1 健二 酒井
## 概要
4 1 健二 酒井
5 1 健二 酒井
SMTPとメールについて解説する。電子メールの基本的な登場人物、データ(メール)の流れ、postfixも解説する
6 1 健二 酒井
7 1 健二 酒井
## メタ情報
8 1 健二 酒井
9 1 健二 酒井
TODOでやり残したこと書いてある。
10 1 健二 酒井
grep TODO してね
11 1 健二 酒井
12 1 健二 酒井
### 具体的技術
13 1 健二 酒井
14 1 健二 酒井
以下のあたりを想定して考える
15 1 健二 酒井
16 1 健二 酒井
* postfix
17 1 健二 酒井
* Thunderbird
18 1 健二 酒井
* mailコマンド
19 1 健二 酒井
* telnet
20 1 健二 酒井
21 1 健二 酒井
### SMTP
22 1 健二 酒井
23 1 健二 酒井
Simple Mail Transfer Protocol。メール送信に使われる通信プロトコル、アプリケーション層。
24 1 健二 酒井
HTTPと同じようにテキストベースのプロトコルなのでtelnetコマンドとか使ってメールの送信ができる。
25 1 健二 酒井
一つ一つのコマンドは以下のような形をしている。
26 1 健二 酒井
27 1 健二 酒井
[コマンド] [引数]
28 1 健二 酒井
29 1 健二 酒井
TCPを使用し、ポート番号は25番です。
30 1 健二 酒井
プロトコルとして認証機能を持っていない点は覚えておいてください。
31 1 健二 酒井
通信の具体例を見てみましょう。以下はメールサーバであるmail.example.comに接続して通信の具体例です。
32 1 健二 酒井
33 1 健二 酒井
> * $ telnet mail.example.com 25
34 1 健二 酒井
> * Trying 10.232.45.151
35 1 健二 酒井
> * Connected To mail.example.com
36 1 健二 酒井
> * Excape character is '^}'.
37 1 健二 酒井
> * 220 mail.example.com ESMTP Postfix
38 1 健二 酒井
> * *HELO mail.oreilly.com*
39 1 健二 酒井
> * 250 mail.oreilly.com
40 1 健二 酒井
> * *MAIL FROM:<info@oreilly.com>*
41 1 健二 酒井
> * 250 OK
42 1 健二 酒井
> * *RCPT TO:<kdent@example.com>*
43 1 健二 酒井
> * 250 OK
44 1 健二 酒井
> * *DATA*
45 1 健二 酒井
> * 354 End data with <CR><LF>.<CR><LF>
46 1 健二 酒井
> *
47 1 健二 酒井
> * Date: Mon, 8 Apr 2003 15:38:21 -500  
48 1 健二 酒井
> *From: Customer Service \<info@oreilly.com\>*  
49 1 健二 酒井
> *Reply-To: \<service@oreilly.com\>  
50 1 健二 酒井
> Message-ID: <01a4e22382000842@mail.oreilly.com>  
51 1 健二 酒井
> Subject Have you read RFC2822?  
52 1 健二 酒井
> <br>
53 1 健二 酒井
> This is the start of the body of the message. It coulud continue  
54 1 健二 酒井
> for many lines, but itdosn't  
55 1 健二 酒井
> .*  
56 1 健二 酒井
> <br>
57 1 健二 酒井
> * 250 Ok: queued as 5FA26B3DEF
58 1 健二 酒井
> * *quit*
59 1 健二 酒井
> * 221 Bye
60 1 健二 酒井
> * Connection closed by foreign host:
61 1 健二 酒井
62 1 健二 酒井
63 1 健二 酒井
*太字* の部分が打ち込む部分になります。
64 1 健二 酒井
HTTPと違い、複数のコマンドから成り立つプロトコルです。一つ一つはコマンドを送信->ステータスコード等が帰ってくるという流れで同じです。
65 1 健二 酒井
66 1 健二 酒井
ThunderbirdやPOPサーバはどこで出てくるの?と思った鋭い方には以下の図をご覧ください。
67 1 健二 酒井
68 1 健二 酒井
[!smtp](images/smtp1.png)
69 1 健二 酒井
70 1 健二 酒井
引用元:https://baremetal.jp/blog/2017/12/08/468/
71 1 健二 酒井
72 1 健二 酒井
### メールリレー
73 1 健二 酒井
74 1 健二 酒井
さて、実際のところは多くのSMTPサーバを経由していいます。。電子メールのソースを開いてヘッダ部分を読んでみましょう。「Received: 」というヘッダがいくつも連なっています。(偽装されていなければ)それだけのSMTPサーバをそのメールは経由していることを示しています。
75 1 健二 酒井
実際のメールヘッダで見てみましょう。単純なReceivedヘッダだけ強調してします。
76 1 健二 酒井
77 1 健二 酒井
> Delivered-To: user@example.com  
78 1 健二 酒井
> **Received: by 2002:adf:fb82:0:0:0:0:0 with SMTP id a2csp5486028wrr;  
79 1 健二 酒井
>         Tue, 9 Apr 2019 05:14:07 -0700 (PDT)**  
80 1 健二 酒井
> X-Google-Smtp-Source: APXvYqzLZUnBBAebjBeP6CoG6iHWFIr5HqiEMQIPrHSibhHtGt30H86iahq3PKzM4dpFPreaj3p7  
81 1 健二 酒井
> X-Received: by 2002:a62:7648:: with SMTP id r69mr17135214pfc.114.1554812047772;  
82 1 健二 酒井
>         Tue, 09 Apr 2019 05:14:07 -0700 (PDT)  
83 1 健二 酒井
> ARC-Seal: i=1; a=rsa-sha256; t=1554812047; cv=none;  
84 1 健二 酒井
>         d=google.com; s=arc-20160816;  
85 1 健二 酒井
>         b=om+zTuGc52fEw506jfgyFaI9HntClcj5VWzjU6xuk2oMdFUhL6G2UoeY8EMwehKjoU  
86 1 健二 酒井
>          SQUprD2bNLvFj5FjTVfXS4lBbp3IAJlYoG1rC1hl9N0stXfItqgLc5BKHW+QNEm9MdC0  
87 1 健二 酒井
>          X/nTkyon0yrlgih8r22NWnvdTDEGDE/uDk5yuIPiCBXAy6XB9bIR344uSyQR+HDdATJu  
88 1 健二 酒井
>          rkZrSIPD6PQx5Tb/ybHdjjZXZ+naZAw/YmrVPcoQlNYuDpugbjfRuXjeWwNEfx74qdZJ  
89 1 健二 酒井
>          0VAbpIyLYfGnZREVSAAJ0fE24d4H0kM5m9UJ6l9lh7Y5RSVVXEEII7bZVZ1Lmsmo8WXz  
90 1 健二 酒井
>          8sQw==  
91 1 健二 酒井
> ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;  
92 1 健二 酒井
>         h=date:content-transfer-encoding:mime-version:subject:message-id:to  
93 1 健二 酒井
>          :from;  
94 1 健二 酒井
>         bh=A0xNuAoaQrVrZmXYQqHcnjccHMHctS5+2uQNDEy2E7A=;  
95 1 健二 酒井
>         b=Dtcawz+r3BIW5rUHFdSMz+43ANqKZTOm3W76POOiC/6+ryo+XuZygyBjspmpCoYy38  
96 1 健二 酒井
>          JfiVMDGfvyxenj3ZLDnJ8E4FGhmmk7xxzPbX8Vkc2dfIb5nWlp1uU1Q41peFqrFFvljv  
97 1 健二 酒井
>          tZbh1N+w5hzMHWJ/bWS48vC8rJHIRLqW2oXAvJqcf23m8J9Uwm+InkJPwg8eQiHmNTpG  
98 1 健二 酒井
>          TtPboA4Y4tCTVwSk1PoEMpNiWtleZ6a9hJFSsvgNOao6dMIiGEj1QtU1heSWQOzIA4EM  
99 1 健二 酒井
>          8z2yVuKuoTdyJdoTBpPruab3dPlVW0fDuiY7os+iP8T/BzTdQ20I0Nrfrpf+iWfKeDvP  
100 1 健二 酒井
>          bbVg==  
101 1 健二 酒井
> ARC-Authentication-Results: i=1; mx.google.com;  
102 1 健二 酒井
>        spf=pass (google.com: domain of bounce-onamae@gmo.jp designates 163.44.91.18 as permitted sender) smtp.mailfrom=bounce-onamae@gmo.jp  
103 1 健二 酒井
> Return-Path: <bounce-onamae@gmo.jp>  
104 1 健二 酒井
> **Received: from smisc-smtp01.gmo.jp (mta-a018.static.smisc.gmo.jp. [163.44.91.18])  
105 1 健二 酒井
>         by mx.google.com with ESMTP id f16si29233269pgj.149.2019.04.09.05.14.07  
106 1 健二 酒井
>         for <user@example.com>;  
107 1 健二 酒井
>         Tue, 09 Apr 2019 05:14:07 -0700 (PDT)**    
108 1 健二 酒井
> 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;  
109 1 健二 酒井
> Authentication-Results: mx.google.com;  
110 1 健二 酒井
>        spf=pass (google.com: domain of bounce-onamae@gmo.jp designates 163.44.91.18 as permitted sender) smtp.mailfrom=bounce-onamae@gmo.jp  
111 1 健二 酒井
> **Received: from 172.21.221.120 (unknown [172.21.221.120]) by   smisc-smtp01.gmo.jp (Postfix) with ESMTP id 90BE11AA475; Tue,    
112 1 健二 酒井
>   9 Apr 2019 21:14:06 +0900 (JST)**    
113 1 健二 酒井
> From: "\"お名前.com\"" <admin@onamae.com>  
114 1 健二 酒井
> To: weakhold27@gmail.com  
115 1 健二 酒井
> Message-ID: <359007069.13.1554812046597.JavaMail.root@miscmail-vip.internal-gmo>  
116 1 健二 酒井
> Subject: [お名前.com]DNSレコード設定 完了通知 udonge-in.reisen  
117 1 健二 酒井
> MIME-Version: 1.0  
118 1 健二 酒井
> Content-Type: text/plain; charset=ISO-2022-JP  
119 1 健二 酒井
> Content-Transfer-Encoding: quoted-printable  
120 1 健二 酒井
> X-RECNO: 20190409211323567-162950-2-113  
121 1 健二 酒井
> Date: Tue,  
122 1 健二 酒井
>   9 Apr 2019 21:14:06 +0900 (JST)  
123 1 健二 酒井
124 1 健二 酒井
こんな感じにSMTPによる通信は「送信」、「受信」で一台ずつではなく何台ものSMTPサーバを経由しているみたいです。
125 1 健二 酒井
以前どこかできいた話です。送信するメールに対して様々な処理を行うサービスを実装するとき、処理Aを行うサーバ、処理Bを行うサーバ…と複数台のメールサーバを直列に並べて行くことで機能を実現したりするそうです。大変ですね。
126 1 健二 酒井
このようにSMTPサーバは送受信以外にも「中継」を行います。これをリレーといいます。
127 1 健二 酒井
128 1 健二 酒井
#### php.iniとメール
129 1 健二 酒井
130 2 健二 酒井
phpでメールを送信するときはphp.ini上で設定項目があります。Windowsの場合は、SMTPから設定したsmtpサーバを通して(これは、デフォルトはlocalhost)、Linuxの場合はsendmail_path通じています。sendmail_pathからはsendmailコマンドが呼び出され、デフォルトではsendmailコマンドがpostfixに通じていくようです。
131 1 健二 酒井
https://www.php.net/manual/ja/mail.configuration.php
132 2 健二 酒井
133 2 健二 酒井
http://www.postfix.org/OVERVIEW.html
134 1 健二 酒井
135 1 健二 酒井
#### スパムメール
136 1 健二 酒井
137 1 健二 酒井
さて、最初のSMTPの具体例を見ても分かるようにSMTPの通信は認証をしなくても成立します。postfixは送信元を制限可能にはなっていますが、それをやると見知らぬ相手からのメールを受け取れなくなります。しかし単純に全世界からのメールをリレーする設定だとスパムメール配信者によって自身のメールサーバを踏み台にされます。
138 1 健二 酒井
139 1 健二 酒井
おそらく、電子メールに関する技術はスパムとの戦いだったのではないかなぁ。そこは今は省きます。
140 1 健二 酒井
141 1 健二 酒井
### メールとDNS
142 1 健二 酒井
143 1 健二 酒井
さて、メールを送信するには受信サーバのIPアドレスが必要です。HTTPならURLのホスト部を見てDNSで解決しますが、メールはどうでしょう?メールもメールアドレスを見てDNSで解決します。user@example.comというメールアドレスのexample.comをDNSを使って解決します。
144 1 健二 酒井
145 1 健二 酒井
URLのwww.example.comの場合Aレコードというものが使われる(かもしれません)。Aレコードはホスト名とIPを対応づけるためにDNSに蓄える情報です。
146 1 健二 酒井
例えば以下のような情報が設定されます。
147 1 健二 酒井
148 1 健二 酒井
```
149 1 健二 酒井
A www.example.com 192.168.200.10
150 1 健二 酒井
```
151 1 健二 酒井
152 1 健二 酒井
それに対して、メールの場合MXレコードというレコードが設定されます。
153 1 健二 酒井
154 1 健二 酒井
```
155 1 健二 酒井
MX example.com mx.example.com
156 1 健二 酒井
```
157 1 健二 酒井
158 1 健二 酒井
厳密には色々と間違っていますが、MXレコードとAレコードという言葉をひとまず覚えましょう。以下のページなどが勉強になります
159 1 健二 酒井
160 1 健二 酒井
https://f5.com/jp/education/glossary/glossary038-21520
161 1 健二 酒井
162 1 健二 酒井
### postfix
163 1 健二 酒井
164 1 健二 酒井
また今度
165 1 健二 酒井
166 1 健二 酒井
167 1 健二 酒井
## 参考
168 1 健二 酒井
169 1 健二 酒井
* 画像の引用元  
170 1 健二 酒井
https://baremetal.jp/blog/2017/12/08/468/
171 1 健二 酒井
* PHPのメール関数  
172 1 健二 酒井
https://www.php.net/manual/ja/mail.configuration.php
173 1 健二 酒井
* F5ネットワークの用語集  
174 1 健二 酒井
https://f5.com/jp/education/glossary/glossary038-21520
175 1 健二 酒井
* Postfix実用ガイド  
176 1 健二 酒井
https://www.oreilly.co.jp/books/4873111951/