2247
現在、Postfixを使用してメールサーバを立てています。
最近Gmail宛てのメールで421-4.7.0のエラーが発生し、Gmailにメールが送れなくなりました。
このエラーの内容としてはGoogleからSPAM扱いを受けてIPアドレスごと拒否されているというものです。

原因を調べたところ、あるユーザアカウントで個人のGmailのメールアドレスに自動転送設定をサーバ側でしており、
その転送しているメールのなかにスパムが多く含まれるようになったため、 Googleに怒られる状況になったようです。

現在、取り急ぎ転送設定を取消、Gmail宛てに送り損ねたメールがキューに溜まっていたので全て削除した状態です。
今の時点でメールサーバ上の他のアカウントがgmail宛てにメールを送ったところ、 当然ながら421-4.7.0のエラーで送られない状態なのですが、
延々とメール送信がリトライされることになるため、 いつまでにたってもGmail側でのIP制限が解除されない自体に繋がるのでは？
とかユーザは送ったつもりなのに実際には送れなかったことが認識出来ずトラブルになるのでは？ という懸念がございます。

ここでリトライをせず、ユーザに「エラーとなったので遅れませんでした」といった感じのエラーメールとして送り返すにはどのように設定を行えばよろしいでしょうか？
CC BY-SA 3.0
2014-12-20T11:48:03.603
2242
2014-12-23T13:26:19.190
2014-12-20T12:24:22.337
33
5359
question
linux postfix gmail
Postfixでメール送信が失敗した時にリトライせずにエラーメールを送信者に返すにはどうしたらいいですか？
単純に再送をやめるのであれば、main.cfにて、maximal_queue_lifetimeとbounce_queue_lifetimeを0にすればよさそうです。
ただ、いろいろ弊害はあるのでご注意を。

> インターネット上では確実に配送される保証はありませんので、再配送を完全に止めてしまうと本来送るべきメールが送れなくなる可能性があります。
>
> <http://q.hatena.ne.jp/1225177875> より

(ケータイのキャリアメール向けのサービスで、MTA側では再送間隔を調整しておいて、別の処理でqueueをさらって再送扱いのメールをお掃除するようなことをやりました。が、最終的にはキャリアさんにたのんで第8層で解決した記憶があります、gmailもそうなるんでしょうかねぇ。。)
CC BY-SA 3.0
2014-12-20T12:50:12.737
2247
2014-12-20T14:37:14.453
2014-12-20T14:37:14.453
30
2992
2242
answer
直接の回答ではありません。

Gmailへの送信をしないという観点であれば、gmail.com などのアドレスへの送信を無条件で拒否するという手があります。

main.cf:

```

    smtpd_recipient_restrictions =
      ...
      check_recipient_access hash:/usr/local/etc/postfix/reject_recipients
      ...
    
```

check_recipient_access は permit_mynetworks
などの許可設定よりも前に入れてください。(たいていの場合には先頭に入れてしまっても良いと思います。)

/usr/local/etc/postfix/reject_recipients:

```

    gmail.com       REJECT Could not deliver to Gmail
    googlemail.com  REJECT Could not deliver to Gmail
    
```

注: 独自ドメインで Gmail (Google Apps) を使っている場合には個別に対応が必要です。
CC BY-SA 3.0
2014-12-20T15:52:03.953
2276
2014-12-20T15:52:03.953
76
2242
answer
## Postfix 2.7 以降の場合

Postfix 2.7 以降であれば、`smtp`(8) の `smtp_reply_filter` で Gmail
からの応答を書き換えるフィルターを設定するといいかもしれません。 Gmail (`*@gmail.com`)
宛のメールにだけ適用するため、`master.cf` で Gmail 宛専用のトランスポートを定義し、`transport`(5)
でそれを指定するといいでしょう。

`/etc/postfix/master.cf` で Gmail 宛専用のトランスポート `smtp-gmail` とそのコマンドラインを設定します。ここで
`smtp_reply_filter` を使用するようにします:

```

    smtp-gmail        unix  -       -       -       -       -       smtp
      -o syslog_name=postfix/gmail
      -o smtp_reply_filter=regexp:$config_directory/smtp_reply_filter.gmail.regexp
    
```

`/etc/postfix/smtp_reply_filter.gmail.regexp` で Gmail
の応答の書き換えルールを設定します。書き換え対象の正規表現、書き換える内容は、適宜調整してください:

```

    /^421-(4\.7\.0.*)/ 550-5.0.0 任意のメッセージ (${1})
    
```

`/etc/postfix/transport` で Gmail 宛のメールを `smtp-gmail` トランスポートを利用するように設定します:

```

    gmail.com    smtp-gmail:
    
```

`/etc/postfix/main.cf` で `transport`(5) を参照するように設定します:

```

    transport_maps = hash:$config_directory/transport
    
```

`/etc/postfix/transport.db` への反映と Postfix `master` への `main.cf`、`master.cf`
変更を反映します:

```

    # postmap /etc/postfix/transport
    # postfix reload
    
```

## Postfix 2.6 以前の場合 (Postfix 2.7 以降も可)

`mailq` あるいは `postqueue -p` の出力から該当している滞留メールの情報を調べ、
送信者にバウンスメッセージを送信し、キューから削除する方法が考えられます。

例えば、以下のようなスクリプトを cron で定期実行するのはどうでしょうか。 (送信者アドレスなどは適宜変更してください)

```

    #!/bin/sh
    
    bounce_sender="postmaster@example.jp"
    bounce_subject_prefix="Delivery to Gmail failed: "
    bounce_body="\
    Message body.
    Blah-Blah
    
    -- 
    $bounce_sender
    "
    
    postqueue -p \
    |sed -n \
      -e '/^[0-9A-Z]*  */N' \
      -e 's/\n(host [^ ]* said: 421[- ]4\.7\.0 <\([^@>]*@gmail\.com\)>:.*/ \1/p' \
    |while read -r qid size wday month mday time sender recipient; do
      {
        echo "From: $bounce_sender"
        echo "To: $sender"
        echo "Subject: $bounce_subject_prefix<$recipient>"
        echo
        echo "$bounce_body"
      } \
      |sendmail \
        -i \
        -f "$bounce_sender" \
        "$sender" \
      ;
      postsuper -d "$qid"
    done
    
```

バウンスメッセージに元のメッセージを含めたい場合は `postcat -q "$qid"` で抽出できるので、 適宜利用を検討してみてください。

この例ではバウンスメールの送信に `sendmail` を利用していますが、ほかの方法でも構いません。 `sendmail`
なら手前味噌ですが、以下のページにいくらか情報があります。ご参考まで。

  * sendmail コマンドによるメール発信 - Postfix Advent Calendar 2014 - ダメ出し Blog 
    * <https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html>
CC BY-SA 3.0
2014-12-20T17:12:08.950
2284
2014-12-23T13:26:19.190
2014-12-23T13:26:19.190
3061
3061
2242
answer