プロジェクト

全般

プロフィール

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

バージョン 1/2 - 次 » - 最新版
健二 酒井, 2019/04/14 22:52


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サーバはどこで出てくるの?と思った鋭い方には以下の図をご覧ください。

!smtp

引用元: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用PHPだけ
みたいですね…)ライブラリによってはphpのプロセスから直接受信側サーバにSMTPで通信するかもしれませんが、同一ホスト内で動かしているSMTPサーバのプロセスを経由するかもしれません。
https://www.php.net/manual/ja/mail.configuration.php

スパムメール

さて、最初の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

また今度

参考