Postfixの設定
Dockerfileの設定
code:dockerfile
ENV DEBIAN_FRONTEND noninteractive
自動インストール するためにinteractiveをnonにさせる。
postfixの設定
code:dockerfile
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y postfix
COPY php.ini /usr/local/etc/php/conf.d
COPY main.cf /etc/postfix
COPY exec.sh /
RUN chmod 744 /exec.sh
code:sh
service postfix restart
apache2-foreground
code:php.ini
sendmail_path="/usr/sbin/sendmail -t -i"
code:main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
readme_directory = no
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = 6cbcc8741c33
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, 6cbcc8741c33, localhost.localdomain, , localhost
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
コマンド
sendmail (postfix)
-t メッセージヘッダから受信者を抽出します。これらはコマンドラインで
指定された受信者に付け加えられます。
バージョン 2.1 以前の Postfix では、このオプションにはコマンドラ
インで受信者が指定されていないことが要求されます。
-i メッセージを標準入力から読み込む場合、"." 文字だけの行を入力の終
りとして扱いません。
メール送信テスト
code:sh
sendmail -f sender@example.com recipient@example.com < mime-email.txt
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
'From' => 'webmaster@example.com',
'Reply-To' => 'webmaster@example.com',
'X-Mailer' => 'PHP/' . phpversion()
);
mail($to, $subject, $message, $headers);
?>
phpからどのようにsendmailに標準入力されているのかを調べるには、
sendmail_pathにteeを設定する。
code:ini
sendmail_path = tee -a mail.txt
-----
Amazon SESと Postfix の統合
ubuntu
sudo apt install postfix libsasl2-modules
code:sh
"smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
"smtp_use_tls = yes" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes"
code:/etc/postfix/sasl_passwd
以下暗号化
code:sh
sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
Postfix が CA 証明書の場所を認識できるようにします
code:sh
sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'
sudo postfix start; sudo postfix reload
smtp_header_checks
header_checksと同じ書き方のはず
header_checks
header_checks ,smtp_header_checksを設定する場合は、ファイルを作成しておく必要がある
文法
sudo vim /etc/postfix/smtp_header_checks
code:txt
/^To:(.)/ INFO $1
/^From:(.)/ INFO $1
正規表現 ^To:(.*) は、ヘッダーのTo:フィールドをキャプチャ
INFO $1 は、キャプチャした内容($1)をメールログに記録
sudo vim /etc/postfix/smtp_header_checks
sudo postmap /etc/postfix/smtp_header_checks
code:cf
smtp_header_checks = regexp:/etc/postfix/smtp_header_checks
注意
mydomainは、SESで検証したドメインでないとエラーになる
エラー
said: 535 Signature Version 2 is deprecated for use with SES from March 26, 2021. From that date on, we are progressively rejecting such requests. To resolve the issue, you must migrate to Signature Version 4. If you created your SMTP credentials in the SES Console, please create new credentials and replace the former ones. If you are deriving Signature Version 2 credentials from a IAM user, please start using the Signature Version 4 algorithm: https://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-credentials.html SESSMTP認証情報を作り直したら解消した
Amazon SES→SMTP 設定
Simple Mail Transfer Protocol (SMTP) の設定
でIAMユーザーが作成される。
パスワードは、認証キーではなく、SMTPパスワード
以下が自動的に設定される
AmazonSesSendingAccess
AWSSESSendingGroupDoNotRenameグループが自動的に作成され、アタッチされる
注意
phpでメール送信するとき
mail()メソッドだと、日本語が入っていると、mail.logに以下のエラーが出た
(SMTPUTF8 is required, but was not offered by host email-smtp.us-west-2.amazonaws.com
mb_send_mailを使えば良い。
他参考