7.

SMTP 完全ガイド — プロトコル/認証/SPF・DKIM

編集
この記事の要点
  • SMTP (Simple Mail Transfer Protocol) はインターネットでメールを送信する標準プロトコル (RFC 5321)
  • ポート: 25 (サーバ間転送、ISP がブロックすることも) / 587 (Submission、認証必須) / 465 (SMTPS、SSL/TLS)
  • 主要コマンド: HELO/EHLO 挨拶 → MAIL FROM 送信元 → RCPT TO 宛先 → DATA 本文 → QUIT
  • なりすまし防止: SPF (送信元 IP 認証) / DKIM (電子署名) / DMARC (SPF + DKIM 違反時のポリシー)
  • クラウドメール: SendGrid / Amazon SES / Mailgun がデファクト。自前 Postfix は IP レピュテーション維持が困難

SMTP とは

SMTP (Simple Mail Transfer Protocol) は、メールクライアントからメールサーバへ、またメールサーバ間でメールを送信するためのテキストベースのプロトコルです。1982 年に RFC 821 で規定され、現在は RFC 5321 が標準。受信側は POP3 / IMAP を使い、SMTP は送信専用です。

SMTP のポート

ポート用途暗号化認証
25サーバ間転送 (MTA-to-MTA)平文 (STARTTLS で昇格可)不要 (匿名)
587Submission (クライアント送信)STARTTLS で TLS 化SMTP-AUTH 必須
465SMTPS (Implicit TLS)接続開始から TLSSMTP-AUTH 必須
2525非標準 (代替 Submission)STARTTLSSMTP-AUTH

日本の ISP の多くはOP25B (Outbound Port 25 Blocking) で、家庭回線からの 25 番ポート送信を遮断しています。家庭・モバイル回線からのメール送信は 587 / 465 を使う必要があります。

SMTP の対話例 (telnet)

$ telnet smtp.example.com 25
Trying 192.0.2.10...
Connected to smtp.example.com.
220 smtp.example.com ESMTP Postfix
EHLO myclient.example.org
250-smtp.example.com Hello myclient.example.org
250-PIPELINING
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN CRAM-MD5
250 HELP
MAIL FROM:<alice@example.org>
250 2.1.0 Ok
RCPT TO:<bob@example.com>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: Alice <alice@example.org>
To: Bob <bob@example.com>
Subject: Hello

This is the body of the message.
.
250 2.0.0 Ok: queued as 4ABCD1234
QUIT
221 2.0.0 Bye

SMTP 応答コード

コード分類意味と例
2xx成功250 OK / 220 Service ready / 221 Bye
3xx追加情報要求354 Start mail input
4xx一時エラー (再送 OK)421 Service not available / 451 Local error / 452 Mailbox full
5xx恒久エラー (再送不可)550 User unknown / 553 Invalid address / 554 Spam blocked

受信側 MTA が 4xx を返した場合、送信側はキューに残して数時間〜数日リトライします。5xx は即時バウンス。

STARTTLS による暗号化

STARTTLS は平文接続から TLS 接続にアップグレードする拡張コマンドです (RFC 3207):

EHLO client.example.com
250-server.example.com Hello client
250 STARTTLS         ← サーバが STARTTLS 対応を広告
STARTTLS
220 Ready to start TLS
[ここから TLS ハンドシェイク、以降全通信が暗号化]
EHLO client.example.com  ← TLS 後にやり直す
250-server.example.com Hello (TLS)
250 AUTH PLAIN LOGIN
AUTH PLAIN ...

SMTP-AUTH (認証)

Submission (587) では必ず AUTH が要求されます。主な方式:

方式仕組み注意
PLAINBase64 でユーザ名 + パスワードを送信必ず TLS と併用
LOGINPLAIN とほぼ同じ。Microsoft 系で多い必ず TLS と併用
CRAM-MD5チャレンジレスポンス (パスワード非送信)パスワード平文保管必要 → 廃れつつある
XOAUTH2OAuth 2.0 アクセストークンGmail / Microsoft 365 で標準

SPF / DKIM / DMARC (なりすまし対策)

SMTP には送信者認証の仕組みが無いため、From を詐称し放題です。これを補強するのが SPF / DKIM / DMARC。

SPF (Sender Policy Framework)

DNS の TXT レコードで「このドメインからメール送信が許される IP アドレス」を宣言します:

; DNS TXT レコード (example.com)
example.com.  IN  TXT  "v=spf1 ip4:192.0.2.0/24 include:_spf.google.com -all"

; v=spf1            : SPF バージョン 1
; ip4:192.0.2.0/24  : この IP からの送信を許可
; include:...       : 他ドメインの SPF を参照
; -all              : 上記以外は拒否 (hard fail)
;   ~all            : softfail (受信側判断)
;   ?all            : neutral (判断保留)

DKIM (DomainKeys Identified Mail)

送信時にメールヘッダに電子署名を付与し、受信側は DNS で公開鍵を取得して検証します:

; メールヘッダ
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=selector1;
    h=from:to:subject:date;
    bh=...;
    b=...

; DNS TXT (selector1._domainkey.example.com)
selector1._domainkey.example.com.  IN  TXT  "v=DKIM1; k=rsa; p=MIGfMA0GCSq..."

DMARC

SPF / DKIM が失敗したメールをどう扱うかを宣言:

_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; pct=100"

; p=none      : 何もしない (監視のみ)
; p=quarantine: 迷惑メールへ
; p=reject    : 拒否
; rua=...     : 集計レポートの送信先
; pct=100     : 100% に適用

2024 年から Gmail と Yahoo は送信ドメインに DMARC を必須化しています。一斉送信を行う場合は必ず設定してください。

主要なメールサーバ / クラウドサービス

製品種別特徴
PostfixOSS MTALinux のデファクト。設定がモジュール式で堅牢
SendmailOSS MTA歴史最古。設定が複雑で衰退傾向
EximOSS MTAcPanel に同梱、ホスティングで人気
Microsoft Exchange商用Active Directory 統合。社内メール定番
Amazon SESクラウド$0.10/1000通。SDK で送信、IP レピュテーション AWS 管理
SendGridクラウド無料 100通/日。配信統計 / バウンス自動処理
Mailgunクラウド開発者向け。REST API が使いやすい
Postmarkクラウドトランザクションメール特化、到達率が高い

PHP / Python / Node.js での送信例

// PHP (PHPMailer)
use PHPMailer\PHPMailer\PHPMailer;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.sendgrid.net';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = 'apikey';
$mail->Password = getenv('SENDGRID_API_KEY');
$mail->SMTPSecure = 'tls';
$mail->setFrom('noreply@example.com', 'My App');
$mail->addAddress('user@example.org');
$mail->Subject = 'Hello';
$mail->Body = 'This is the body';
$mail->send();
# Python smtplib
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg['From'] = 'noreply@example.com'
msg['To'] = 'user@example.org'
msg['Subject'] = 'Hello'
msg.set_content('This is the body')

with smtplib.SMTP('smtp.sendgrid.net', 587) as s:
    s.starttls()
    s.login('apikey', 'SG.xxxxxx')
    s.send_message(msg)
// Node.js nodemailer
import nodemailer from 'nodemailer';

const transporter = nodemailer.createTransport({
  host: 'smtp.sendgrid.net',
  port: 587,
  secure: false,        // STARTTLS
  auth: { user: 'apikey', pass: process.env.SENDGRID_API_KEY },
});

await transporter.sendMail({
  from: 'noreply@example.com',
  to: 'user@example.org',
  subject: 'Hello',
  text: 'Body',
});

Postfix 最小構築 (Ubuntu)

sudo apt update
sudo apt install -y postfix mailutils

# 設定モード: "Internet Site" を選択
# system mail name: example.com

# /etc/postfix/main.cf
sudo postconf -e 'myhostname = mail.example.com'
sudo postconf -e 'mydestination = mail.example.com, localhost'
sudo postconf -e 'inet_interfaces = all'
sudo postconf -e 'inet_protocols = ipv4'

# STARTTLS
sudo postconf -e 'smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem'
sudo postconf -e 'smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem'
sudo postconf -e 'smtpd_use_tls=yes'

sudo systemctl restart postfix

# 送信テスト
echo "test" | mail -s "test" user@example.org

# ログ確認
sudo tail -f /var/log/mail.log

Gmail SMTP リレーで送信

少量メール送信なら Gmail の SMTP を使えます (Google Workspace 推奨):

SMTP サーバ: smtp.gmail.com
ポート: 587 (STARTTLS) or 465 (SSL)
ユーザ名: your-account@gmail.com
パスワード: アプリパスワード (2 要素認証必須)
            https://myaccount.google.com/apppasswords

制限: 個人 Gmail で 500通/日、Workspace で 2000通/日

FAQ

Q: 25 番ポートで送信できない
A: 日本の ISP は OP25B でブロックしています。Submission (587) を使うか、VPS / クラウドのメールリレーサービスを使ってください。

Q: 自分のドメインで一斉メール送信したい
A: 自前 Postfix はバウンス率管理 / IP ウォームアップが大変。SendGrid / SES / Mailgun 等のクラウドサービスを強く推奨。SPF / DKIM / DMARC は必須設定。

Q: 送信したのに届かない
A: 受信側スパムフォルダ確認、SPF/DKIM 設定確認、IP がブラックリスト掲載されていないか (Spamhaus / MXToolbox) を確認。

関連プロトコル

  • POP3 (110/995): メールを受信してサーバから削除 / 単一端末向け
  • IMAP (143/993): サーバ上のメールを参照 / 複数端末向け
  • MIME (RFC 2045-2049): メールに添付ファイルや HTML を含める拡張
  • S/MIME: メール本文の電子署名・暗号化
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTTP
  2. HTTPS
  3. DNS
  4. FTP
  5. TFTP
  6. DHCP
  7. SMTP
  8. SNMP
  9. POP3
  10. Telnet
  11. NTP
  12. SSH

最近更新/作成されたページ