OpenSUSE Leap 42: Postfixでメール送信する

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

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

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

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

#!/bin/sh

firewall_open_service()
{
  for t in FW_CONFIGURATIONS_EXT FW_CONFIGURATIONS_DMZ FW_CONFIGURATIONS_INT; do
    sudo sed -e "s/^${t}=\"\(.*\)\"/${t}=\"\1 $1\"/g" \
         -i /etc/sysconfig/SuSEfirewall2
  done
  sudo systemctl restart SuSEfirewall2
}

postfix_install()
{
  sudo zypper -n in postfix

  sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

  # 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
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
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_version)
debug_peer_level = 2
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/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = maildrop
inet_protocols = ipv4
EOF

  sudo newaliases
  sudo systemctl restart postfix

  firewall_open_service smtp

  sudo zypper -n in 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

/etc/postfix/master.cfのtlsmgrを有効にします。

$ sudo sed -e 's/^#tlsmgr/tlsmgr/g' -i /etc/postfix/master.cf

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 ...