今回はUbuntu Linux 22.10 ServerのPostfixでGmailの送信サーバを使ってメール送信できるようにしていきます。以前ArchLinuxでも同様にPostfixの設定を実施して記事のネタが被りますが、今回作業したUbuntuでは若干手順が異なる部分もあったので、リニューアル記事として記載しておきます。

Postfixのインストール

まずはPostfixを以下コマンドでインストール。mailutilsはmailコマンドでメール可能にするため。

$ sudo apt install postfix mailutils

設定(Google認証用ファイルの準備)

自身のGoogleアカウントで次に以下のURLにアクセスし、二段階認証のパスワードを入手しておきます。
アプリはその他を選びpostfixとしましょう。

https://accounts.google.com/IssuedAuthSubTokens?hide_authsub=1

認証パスワードは16桁、4桁毎にスペースが空いているのが表示されているかと思いますが、
これをメモして以下ファイルに記述します。

$ sudo vi /etc/postfix/gmail_sasl_password

尚、記述の際は4桁毎の区切りのスペースは無くて良いです。(abcd efgh ijkl mnop)

[smtp.gmail.com]:587 abcde12345@gmail.com:abcdefghijklmnop

保存が終わったら以下のコマンドでハッシュ化します。

$ sudo postmap hash:/etc/postfix/gmail_sasl_password

すると/etc/postfix/gmail_sasl_password.dbが生成されているかと思います。
以下コマンドで確認します。

$ ls -l /etc/postfix/gmail_sasl_password.db

<注意>
ここで、仮に「postmap: fatal: bad string length 0 < 1: setgid_group =」というエラーが出た場合、
main.cfのファイルの「setgid_group =」の箇所を「#setgid_group =」としてコメントアウトします。

続いてtransportファイルを準備します。

$ sudo vi /etc/postfix/transport

ファイルの中には以下の記述をします。

gmail.com	smtp:[smtp.gmail.com]:587

以下のコマンドでハッシュ化します。

$ sudo postmap transport 

すると/etc/postfix/transport.dbが生成されているかと思います。
以下コマンドで確認します。

$ ls -l /etc/postfix/transport.db

設定(Postfix)

以下のファイルを編集します。

$ sudo vi /etc/postfix/main.cf

編集内容は以下です。

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

append_dot_mydomain = no

readme_directory = no

compatibility_level = 3.6

# 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_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = hostname
mydomain = test.domain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = localhost, $myhostname, haproxy0, localhost.localdomain, localhost,$mydomain
mynetworks = 192.168.1.0/24,127.0.0.1/8
mailbox_size_limit = 100
recipient_delimiter = +
inet_interfaces = all
default_transport = error
relay_transport = error
inet_protocols = all
html_directory = no
setgid_group = postdrop

#gmail
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail_sasl_password
smtp_sasl_mechanism_filter = plain
smtp_sasl_tls_security_options = noanonymous
transport_maps = hash:/etc/postfix/transport

上記を保存して、postfixのサービスを再起動します。

$ sudo systemctl restart postfix

送信テスト

コマンドラインからメール送信テストをしてみましょう。
以下コマンドを打ち込みます。

$ mail -s test abcd12345@gmail.com

ここから本文の入力モードになります。
適当に入力して最後に、「ctrl」+「D」を押して入力終了で送信されます。
上記で宛先のメールアドレスにメールが送信できていればOKです。

仮に届いてない場合は以下のコマンドでまだスプールに残っているか確認です。

$ mailq 

または

$ postqueue -p

上記で権限がないとエラーが出る場合は、以下としてキューに残っているか確認します。

$ sudo mailq 

ここで残っていた場合は、パスワードの認証失敗か、
送信先アドレスが間違ってリトライ待ちになっているケースもあります。

再度ファイルを作成し直して確認してください。

スプールに残ってしまったキューは修正後もキューは残っています。
一括で削除するには以下コマンドで送信キューを削除できます。

$ sudo postsuper -d ALL

全てでは無く、キューの一部だけ削除する場合は、
mailqの左端のIDを以下のxxxxxxx部に入れて実行します。

$ sudo postsuper -d xxxxxxxx

まとめ

今回はUbuntu Linux 22.10のServerでpostfixを使ってGmail経由でメール送信する方法について
紹介しました。

何かの参考になれば幸いです。


おまけ

運用していく中で、crontabの結果をメールで配信したい場合は以下で可能です。

crontab の1行目に以下一文を追記します。

MAILTO="abcd12345@gmail.com"