0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

blastengineの配信レスポンスコード解読ガイド|Gmail・Microsoft宛のエラー対策

0
Posted at

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設定・ウォームアップといった対策を適切に行うことで、到達率を着実に改善できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?