実現したいこと
お世話になります。メールサーバーを運用しております。
gmail宛のメール送信における、DKIM署名対応を進めております。
同一NICに割り当てている固定IPのうち、postfixのmyhostnameと異なるIPアドレスへSMTP接続を行いメール送信をした際に、DKIM署名がされませんでした。
- gmail宛のメール送信ガイドラインに準拠したい
- SMTP接続によるメール送信において、DKIM署名を行いたい
- PHPからのSMTPメール送信において、DKIM署名を行いたい
- postfixのmyhostnameと異なった場合でも、DKIM署名を行いたい
前提
メールサーバーは送信専用サーバーです。
サーバー情報
項目 | 値 |
---|---|
OS | CentOS 7.8 |
postfix | 2.10.1 |
opendkim | OpenDKIM Filter v2.11.0 |
項目 | IPアドレス |
---|---|
サーバーのホスト名 | smtp.example.com |
postfixのmyhostname | smtp1.example.com |
項目 | IPアドレス | ホスト名 |
---|---|---|
NIC eth0 固定IP 1 | 111.111.111.111 | smtp1.example.com |
NIC eth0 固定IP 2 | 222.222.222.222 | smtp2.example.com |
- opendkimインストール済みで、設定も完了しています。
- 実行するのはPHPのスクリプトです(ソースは後述)。
- PEAR::Mailを使用して、SMTP接続を行って、メール送信を行っています。
- smtp1.example.comを指定して、メール送信を行うと、DKIM署名がされますが、smtp2.example.comを指定して、メール送信を行うと、DKIM署名がされません。
確認方法は、maillogでの確認とyahooメール宛に送信を行い、認証情報の確認を行っています。
発生している問題・エラーメッセージ
smtp2.example.comを指定して、メール送信を行った時に、maillogにDKIM署名がされていない旨のログが出力されます。
送信先の「'receiver@example.net'」は実際には、yahoo.co.jpのメールアドレスです(メーラーで認証情報を目視確認できるため)。
bash
1[root@smtp.example.com opendkim]# cat /var/log/maillog | grep BCDFD576D3d: 2Nov 6 14:20:10 smtp postfix/smtpd[7595]: BCDFD576D3d: client=smtp1.example.com[111.111.111.111], sasl_method=LOGIN, sasl_username=sender 3Nov 6 14:20:10 smtp postfix/cleanup[15950]: BCDFD576D3d: message-id=<20241106052010.BCDFD576D3d@smtp1.example.com> 4Nov 6 14:20:10 smtp opendkim[13904]: BCDFD576D3d: DKIM-Signature field added (s=smtp1.example.com, d=example.com) 5Nov 6 14:20:10 smtp postfix/qmgr[14070]: BCDFD576D3d: from=<sender@example.com>, size=659, nrcpt=1 (queue active) 6Nov 6 14:20:12 smtp postfix/smtp[15951]: BCDFD576D3d: to=<receiver@example.net>, relay=mx3.mail.yahoo.co.jp[124.83.237.245]:25, delay=1.3, delays=0.09/0.02/0.06/1.1, dsn=2.0.0, status=sent (250 ok dirdel) 7Nov 6 14:20:12 smtp postfix/qmgr[14070]: BCDFD576D3d: removed 8[root@smtp.example.com opendkim]# 9[root@smtp.example.com opendkim]# 10[root@smtp.example.com opendkim]# cat /var/log/maillog | grep ADK96dfFDF797: 11Nov 6 14:25:28 smtp postfix-2/smtpd[6534]: ADK96dfFDF797: client=smtp1.example.com[111.111.111.111], sasl_method=LOGIN, sasl_username=sender 12Nov 6 14:25:28 smtp postfix-2/cleanup[16577]: ADK96dfFDF797: message-id=<20241106052528.ADK96dfFDF797@smtp2.example.com> 13Nov 6 14:25:28 smtp postfix-2/qmgr[14150]: ADK96dfFDF797: from=<sender@example.com>, size=629, nrcpt=1 (queue active) 14Nov 6 14:25:30 smtp postfix-2/smtp[16578]: ADK96dfFDF797: to=<receiver@example.net>, relay=mx5.mail.yahoo.co.jp[124.83.237.242]:25, delay=1.7, delays=0.05/0.01/0.01/1.6, dsn=2.0.0, status=sent (250 ok dirdel) 15Nov 6 14:25:30 smtp postfix-2/qmgr[14150]: ADK96dfFDF797: removed
上記のログの内、
一つ目は、message-idのホスト名が、clientのホスト名とpostfixのmyhostnameと一致している。
二つ目は、message-idのホスト名が、clientのホスト名とpostfixのmyhostnameと一致していない。
このあたりが要因なのかと思っています。
該当のソースコード
PEAR::Mailを使用して、SMTP接続を行い、メール送信を行っています。
php
1<?php 2require_once("Mail.php"); 3 4// ・$smtpIpAddress1 = postfixのmyhostnameのホスト名の固定IPアドレス 5// ・$smtpIpAddress1と$smtpIpAddress2 は、eth0に割り当てられている固定IPアドレス 6$smtpIpAddress1 = '111.111.111.111'; 7$smtpIpAddress2 = '222.222.222.222'; 8 9$Params = [ 10 'host' => $smtpIpAddress1, 11 'port' => 25, 12 'persist' => TRUE, 13 'auth' => TRUE, 14 'username' => 'user_name', 15 'password' => 'password' 16]; 17$mailer = Mail::factory('smtp', $Params); 18 19// 内部文字コードを設定 20mb_internal_encoding('UTF-8'); 21 22// ヘッダを作成 23$From = mb_encode_mimeheader('sender@example.com', 'ISO-2022-JP') . " <sender@example.com>"; 24$To = [ 25 'receiver@example.net' 26]; 27 28$Subject = mb_encode_mimeheader('メール件名', 'ISO-2022-JP'); 29$Body = 'メール本文'; 30 31$headers = [ 32 'X-Mailer' => 'MAILER', 33 'MIME-Version' => '1.0', 34 'Content-Type' => 'text/plain; charset=ISO-2022-JP', 35 'Content-Transfer-Encoding' => '7bit', 36 'From' => [ 37 'name' => '送信者名', 38 'mail' => 'sender@example.com' 39 ], 40 'To' => 'receiver@example.net', 41 'Subject' => $Subject 42]; 43 44// 送信先アドレスを作成 45$recipients = join(',', $To); 46 47// 本文を作成 48$body = mb_convert_encoding(mb_convert_kana($Body, 'KV'), 'ISO-2022-JP-MS', 'UTF-8'); 49 50// SMTPメール送信 51$mailer->send($recipients, $headers, $body);
opendkimの設定は以下の通りです。
bash
1[root@smtp.example.com opendkim]# cat /etc/opendkim/TrustedHosts 2127.0.0.1 3localhost 4111.111.111.111 # smtp1.example.com 5222.222.222.222 # smtp2.example.com 6smtp1.example.com 7smtp2.example.com 8 9[root@smtp.example.com opendkim]# cat /etc/opendkim/SigningTable 10*@example.com smtp1._domainkey.example.com 11*@example.com smtp2._domainkey.example.com 12 13[root@smtp opendkim]# cat /etc/opendkim/KeyTable | grep -v '#' 14smtp1._domainkey.example.com example.com:smtp1:/etc/opendkim/keys/example.com/smtp1.private 15smtp2._domainkey.example.com example.com:smtp2:/etc/opendkim/keys/example.com/smtp2.private 16 17# ※変更点の抜粋です。diff使ってるので、先頭に「<」がついています 18[root@smtp opendkim]# diff /etc/opendkim.conf /etc/opendkim.conf.org | grep '^<' 19< Mode s 20< #KeyFile /etc/opendkim/keys/default.private 21< KeyTable /etc/opendkim/KeyTable 22< SigningTable refile:/etc/opendkim/SigningTable 23< ExternalIgnoreList refile:/etc/opendkim/TrustedHosts 24< InternalHosts refile:/etc/opendkim/TrustedHosts
postfixのDKIM認証の設定は以下の通りです。
bash
1[root@smtp.example.com opendkim]# cat /etc/postfix/main.cf 2smtpd_milters = inet:127.0.0.1:8891 3non_smtpd_milters = $smtpd_milters 4milter_default_action = accept
試したこと
上記、opendkimのTrustedHostsにホスト名も合わせて追記しましたが、
DKIM署名がされませんでした(元々はIPアドレスのみの記載でした)。
GitHub Copilotにもアドバイスをもらいましたが、解決しませんでした。
補足情報(FW/ツールのバージョンなど)
telnetでのでの確認も行いましたが、同様でした。
以下の接続のsmtp1.example.comをsmtp2.example.comに変更して、メール送信を行いましたが、
maillogのDKIM署名の有無は変わりませんでした。
bash
1[root@smtp opendkim]# telnet smtp1.example.com 25 2Trying 111.111.111.111... 3Connected to smtp1.example.com. 4Escape character is '^]'. 5220 smtp1.example.com ESMTP Postfix 6helo smtp1.example.com 7250 smtp1.example.com 8MAIL FROM:sender@example.com 9250 2.1.0 Ok 10RCPT TO:receiver@example.net 11250 2.1.5 Ok 12DATA 13354 End data with <CR><LF>.<CR><LF> 14Subject:telnet mail send 15 16FROM smtp1.example.com 17. 18250 2.0.0 Ok: queued as AD4FC1B5335 19quit 20221 2.0.0 Bye 21Connection closed by foreign host.
※実際には、複数のメールサーバーに対してsmtp接続を行い、メール送信を行っています。
まず、自サーバー自体のsmtp接続におけるメール送信において、複数の固定IPごとにSMTP接続して、
メール送信する際の、DKIM署名がされない問題を解決したいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/11/11 03:03