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