2024/01/05
VPSで動かしていたメール送信プログラムをローカルサーバで実行させた時にGoogleのSMTPに拒否されたのでその対処を行ったときの記録。
S社のVPSで動作させていたプログラムでは以下の種類のメールを送信していた。
部屋の環境はプロバイダG社の回線を使っておりメール送信に際してはG社で指定するSMTPサーバ経由で送信を行っている。
このプログラムを部屋のローカルサーバで稼働させたところ、gmail宛のメールがSMTPでアクセス拒否されてしまった。
調べたところ、gmail側がG社ネットワークからの接続をほとんど拒否している状態らしい。※SPAM発信元として利用されまくったせいかもなぁ…
できるだけ既存の送信経路を変更したくない。
gmail宛メールのみVPSのPostfixにリレーして対応する。
変更前 | 変更後 |
---|---|
説明中にブラケットで囲んだ表記が出てくる。
例えば “[VPSのIPアドレス]” とあった場合、IPアドレスが8.8.8.8だとすると “[8.8.8.8]“の意となる。
例えば ”[xxxのアドレス]” とあった場合、アドレスがmail.hoge.jpだとすると “[mail.hoge.jp]“の意となる。
main.cf内パラメタmynetworksにローカルサーバ(Router)のIPアドレスを追加する。
mynetworks = 127.0.0.0/8, IPアドレス/32
mynetworksに登録されたネットワークからは認証等無しに接続できる。もし怖いならパラメタsmtpdシリーズの説明を調べてID/PASSを設定する事も可能。※ちょっと面倒。
transport_mapsでリレー先を選択させるので、main.cf内のパラメタrelayhostの指定をコメントアウトする。
元々はG社指定SMTPサーバをパラメタrelayhostで指定していた。
次に以下の指定を追記する。
transport_maps = hash:/usr/local/etc/postfix/transport smtp_sasl_password_maps = hash:/usr/local/etc/postfix/relay_passwd smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous inet_protocols = ipv4
パラメタtransport_mapsは宛先ドメイン毎にリレー先を指定するマップになる。
/usr/local/etc/postfix/transportにファイルを作る。
localhost : gmail.com smtp:[VPSのIPアドレス] * smtp:[G社指定SMTPサーバアドレス]:G社指定のポート番号
この例は、宛先がローカル無いならリレーせず、gmail.comドメイン宛ならVPSへリレーし、それら以外はG社指定SMTPサーバへリレーする。
postmapコマンドで/usr/local/etc/postfix/transport.dbを生成する。
main.cfで/usr/local/etc/postfix/transportと記載しているが実際に使用するのは/usr/local/etc/postfix/transport.dbになる。
postmap /usr/local/etc/postfix/transport
うちの環境ではパラメタsmtp_sasl_password_mapsの指定も必要だった。 これは、G社指定SMTPサーバはユーザ認証を必要としている為、/usr/local/etc/postfix/relay_passwdを作成し指定する必要がある。
[G社指定SMTPサーバのアドレス]:G社指定のポート番号 ユーザID:パスワード
postmapコマンドで/usr/local/etc/postfix/relay_passwd.dbを生成する。
main.cfで/usr/local/etc/postfix/relay_passwdと記載しているが実際に使用するのは/usr/local/etc/postfix/relay_passwd.dbになる。
postmap /usr/local/etc/postfix/relay_passwd
この指定は状況による。
SPFレコードでipv4のアドレスを設定していた場合、環境によってはipv6で通信が行われSMTPサーバからキックアウトされてしまう。
このパラメタを明示的に設定する。
inet_protocols = all
もしダメであればipv4を明示する。
inet_protocols = ipv4