blastengineでメール配信すると、宛先サーバからSMTPレスポンスコードが返されます。特にGmailやMicrosoft(Outlook/Hotmail)は独自の拒否理由を返すため、コードを正しく読み解いて対策することがメール到達率の改善に直結します。
本記事では、blastengine APIの配信ログに記録されるレスポンスコードの意味と、それぞれの対処法を解説します。
配信ログからレスポンスコードを確認する
配信ログ一覧の取得
GET /logs/mails/results でレスポンスコード別にフィルタできます。
# ハードエラーのログを取得
curl "https://app.engn.jp/api/v1/logs/mails/results?status[]=HARDERROR&count=100" \
-H "Authorization: Bearer ${TOKEN}"
{
"data": [
{
"maillog_id": 190,
"delivery_id": 162,
"email": "user@example.jp",
"status": "HARDERROR",
"last_response_code": 550,
"last_response_message": "宛先のメールアドレスがありません。"
}
]
}
特定のレスポンスコードで絞り込み
# Gmail関連のエラー(421系)を抽出
curl "https://app.engn.jp/api/v1/logs/mails/results?response_code[]=421&count=100" \
-H "Authorization: Bearer ${TOKEN}"
配信ログ詳細で送信履歴を確認
GET /logs/mails/{maillog_id} でリトライ履歴を含む詳細が取れます。
curl https://app.engn.jp/api/v1/logs/mails/190 \
-H "Authorization: Bearer ${TOKEN}"
{
"maillog_id": 190,
"email": "user@gmail.com",
"status": "HARDERROR",
"last_response_code": 550,
"last_response_message": "宛先のメールアドレスがありません。",
"sent_history": [
{"response_code": 421, "response_message": "...一時的に拒否..."},
{"response_code": 421, "response_message": "...一時的に拒否..."},
{"response_code": 550, "response_message": "...宛先なし..."}
]
}
sent_history を見ると、リトライの経過とレスポンスの変遷がわかります。
レスポンスコード一覧と対策
成功
| コード | 意味 | 対応 |
|---|---|---|
| 250 | 配信成功 | 対応不要 |
一時エラー(ソフトエラー):blastengineが自動リトライ
| コード | 意味 | 対策 |
|---|---|---|
| 421 | 宛先サーバから一時的に拒否 | 通常は自動リトライで解消。頻発する場合は配信ペースを調整 |
| 450 | 一時的にメールボックスが利用不可 | 自動リトライで解消することが多い |
| 451 | 宛先サーバの一時エラー | 自動リトライに任せる |
| 452 | 宛先サーバのリソース不足 | 自動リトライに任せる |
Gmail固有の一時エラー(要注意)
| コード | 意味 | 対策 |
|---|---|---|
| 421(gmail-url) | 本文中URLが迷惑メール疑い | 本文内のURLやドメインがブラックリストに載っていないか確認。短縮URLの多用を避ける |
| 421(gmail-dmarc) | DMARCアライメント不一致 | DMARCレコードを正しく設定する。FromドメインとDKIM署名ドメインを一致させる |
| 421(gmail-ratelimit) | DKIM署名ドメインからの大量配信 | 新規ドメインは配信数を段階的に増やす(ウォームアップ) |
| 421(gmail-dkim) | DKIM作成者署名の認証失敗 | DKIM署名の設定を見直す。blastengineの署名APIで秘密鍵を確認 |
| 450(gmail-receivelimit) | 受信側の受付速度超過 | 時間をおいてから再送。同一宛先への大量配信を避ける |
恒久エラー(ハードエラー)
| コード | 意味 | 対策 |
|---|---|---|
| 550 | 宛先アドレスが存在しない | 配信リストから除外する |
| 551 | 宛先アドレスが存在しない | 配信リストから除外する |
| 552 | メールボックスがいっぱい | 継続する場合はリストから除外を検討 |
| 553 | メールボックスが利用不可 | 配信リストから除外する |
| 554 | 宛先サーバでエラー | 原因調査が必要 |
Microsoft固有のハードエラー(要注意)
| コード | 意味 | 対策 |
|---|---|---|
| 550(ms-dkim) | DKIM作成者署名の認証失敗 | DKIM署名を設定する。blastengineの署名APIで秘密鍵を登録 |
| 550(ms-dmarc) | DMARCアライメント不一致 | DMARCレコードを設定する |
| 550(ms-dkim-dmarc) | DKIM署名+DMARCの両方に問題 | DKIM作成者署名の設定とDMARCレコードの両方を見直す |
| 550(rejection) | 宛先サーバから受信拒否 | 送信元IPやドメインの評価を確認 |
blastengine側で制御されるエラー
| コード | 意味 | 対策 |
|---|---|---|
| 554(banned) | 配信禁止アドレスへの配信をブロック | 該当アドレスは配信対象から除外する |
| 554(errors) | エラー停止リストに含まれる宛先 | エラー停止が解除されるまで待つ(最大2週間) |
| 554(rejection) | 配信可能アドレスではない | 無料トライアル中は配信可能アドレスの登録が必要 |
実践: レスポンスコード別の配信状況を集計する
Pythonで配信ログを取得し、レスポンスコード別に集計する例です。
import requests
from collections import Counter
BASE = "https://app.engn.jp/api/v1"
TOKEN = "YOUR_BEARER_TOKEN"
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
def fetch_all_logs(delivery_id):
"""指定配信IDのログを全件取得"""
logs = []
anchor = None
while True:
params = {"delivery_id": delivery_id, "count": 1000}
if anchor:
params["anchor"] = anchor
res = requests.get(f"{BASE}/logs/mails/results", headers=HEADERS, params=params)
data = res.json()["data"]
if not data:
break
logs.extend(data)
anchor = data[-1]["maillog_id"] # 次のページの基準
return logs
# 集計
logs = fetch_all_logs(delivery_id=123)
code_counter = Counter(log["last_response_code"] for log in logs)
print("=== レスポンスコード別集計 ===")
for code, count in code_counter.most_common():
print(f" {code}: {count}件")
# Gmail/Microsoft関連エラーを抽出
gmail_errors = [l for l in logs if "gmail" in str(l.get("last_response_message", ""))]
ms_errors = [l for l in logs if "ms-" in str(l.get("last_response_message", ""))]
print(f"\nGmail関連エラー: {len(gmail_errors)}件")
print(f"Microsoft関連エラー: {len(ms_errors)}件")
Gmail・Microsoft宛の到達率を上げるチェックリスト
上記のレスポンスコードを踏まえた対策をまとめます。
1. DKIM作成者署名を設定する
blastengineの署名APIで秘密鍵を登録します。
curl -X POST https://app.engn.jp/api/v1/signatures \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"selector": "default",
"domain": "example.com",
"private_key": "-----BEGIN PRIVATE KEY-----\nXXXXX...\n-----END PRIVATE KEY-----"
}'
これで 421(gmail-dkim) や 550(ms-dkim) の解消が期待できます。
2. DMARCレコードを設定する
DNSに以下のようなTXTレコードを追加します。
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
Fromドメイン、SPFドメイン、DKIM署名ドメインを一致させ、DMARCアライメントを通します。
3. 新規ドメインはウォームアップする
421(gmail-ratelimit) が出る場合、配信実績の少ないドメインからの大量配信が原因です。初日は数百通から始め、数週間かけて段階的に増やしましょう。
4. 本文中のURLを確認する
421(gmail-url) が出る場合、本文中のURLやリンク先ドメインがブラックリストに登録されている可能性があります。短縮URLサービスの多用は避け、自ドメインのURLを使いましょう。
5. Gmail 5000通/日以上はList-Unsubscribeを設定する
curl -X POST https://app.engn.jp/api/v1/deliveries/bulk/begin \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"from": {"email": "news@example.com"},
"subject": "お知らせ",
"text_part": "本文",
"list_unsubscribe": {
"mailto": "mailto:unsubscribe@example.com?subject=unsubscribe",
"url": "https://example.com/unsubscribe"
}
}'
まとめ
blastengineの配信レスポンスコードは、単純な成功/失敗だけでなく、Gmail・Microsoft固有のサブコードで拒否理由を詳細に教えてくれます。配信ログAPIで定期的にエラー傾向を分析し、DKIM署名・DMARC設定・ウォームアップといった対策を適切に行うことで、到達率を着実に改善できます。