Ubuntu 16.04: Postfixでメール送信する

この記事ではPostfixでSMTPサーバを立ち上げて、メール転送する方法について記載します。Gmailにメール転送する方法も記載します。

1 ローカルマシンや所属ネットワーク内でメール送信する

  • ローカルマシンのみでメール送信する場合は、myhostnameをlocalhostに、mydomainをlocaldomainに設定します。
  • 所属するネットワークドメインでメール送信する場合はmyhostnameをホスト名に、mydomainをドメイン名に設定します。この場合はDNSサーバを建てたり複数のマシンで共通の/etc/hostsを設定する必要があります。Postfixの設定は送信側と受信側で必要です。

以下のスクリプトを実行するとmyhostnameをlocalhostに、mydomainをlocaldomainに設定します。

#!/bin/sh

postfix_install()
{
  cat <<EOF | sudo debconf-set-selections
postfix postfix/main_mailer_type select No configuration
EOF
  sudo apt install -y postfix

  # shellcheck disable=SC2016
  cat <<EOF | sudo tee /etc/postfix/main.cf
myhostname = ${1}
mydomain = ${2}
myorigin = \$myhostname.\$mydomain
mydestination = localhost, localhost.\$mydomain, \$myhostname, \$mydomain, \$myorigin
compatibility_level = 2
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = all
local_recipient_maps = unix:passwd.byname \$alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
smtpd_banner = \$myhostname ESMTP \$mail_name (Ubuntu)
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd \$daemon_directory/\$process_name \$process_id & sleep 5
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
inet_protocols = ipv4
EOF

  sudo newaliases
  sudo systemctl restart postfix
  sudo apt install -y mutt
}

postfix_main()
{
  postfix_install localhost localdomain             # localhost only.
  # postfix_install ${YOUR_HOSTNAME} ${YOUR_DOMAIN} # your network.
}

postfix_main

2 Gmailにメール送信する

myhostnameとmydomainはローカルでも所属するネットワークドメインのどちらでも構いません。

Postfixに以下の設定を追加します。

$ cat <<EOF | sudo tee -a /etc/postfix/main.cf
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
EOF

/etc/postfix/sasl_passwdを作成します。GMAIL_ADDRにGmailのメールアドレスを(your@gmail.com)、GMAIL_PASSWDにGmailのパスワードを設定してください。

$ echo "[smtp.gmail.com]:587 ${GMAIL_ADDR}:${GMAIL_PASSWD}" | \
sudo tee /etc/postfix/sasl_passwd
$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap hash:/etc/postfix/sasl_passwd

Postfixを再起動します。

$ sudo systemctl restart postfix

このままではGmailの認証でエラーとなります。

postfix/smtp ... SASL authentication failed; server smtp.gmail.com...

2段階認証でアプリケーション用のパスワードを発行するのがより良い方法だとは思いますが、ここでは安全性の低いアプリの許可を有効にします。

https://myaccount.google.com/lesssecureapps

これでもGmailの認証でエラーとなる場合は、Googleアカウントへのアクセスのを許可が必要となるかもしれません。

https://accounts.google.com/DisplayUnlockCaptcha

以上の設定を済ませることで、インターネット側のメールはGmailに送信されます。メールの差出人はGmailのアドレスとなります。

postfix/smtp ... to=<yourgmail@gmail.com>,relay=smtp.gmail.com ...