この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: SMTP
SEOタイトル: 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  &quot;v=spf1 ip4:192.0.2.0/24 include:_spf.google.com -all&quot;

; 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  &quot;v=DKIM1; k=rsa; p=MIGfMA0GCSq...&quot;

DMARC

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

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

; 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

# 設定モード: &quot;Internet Site&quot; を選択
# 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 &quot;test&quot; | mail -s &quot;test&quot; 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: メール本文の電子署名・暗号化