CentOSにメールサーバーを構築してPythonからメールを送信する

ねらいとしては、AWS Elastic Beanstalk を使って作成しているアプリケーションから、メールを飛ばす。

ServersManで借りているレンタルサーバー(CentOS6) にメールサーバーを構築し、AWS Elastic Beanstalk 上のアプリケーションから接続してメール送信を行う。

1.メール送信サーバーの構築

メールサーバーの構築は、完全に以下のサイトの手順を参考に。

基本的に上記のサイトの手順通りにやればOKだと思う。

とはいえ、やはり「こはまり」はあったので、備忘。

1.1 Postfix のインストールと設定

  1. # yum install postfix

vi /etc/postfix/main.cf

  1. myhostname = mail.typea.info
  2. mydomain = typea.info
  3. myorigin = $mydomain
  4. inet_interfaces = all
  5. mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
  6. relayhost =
  7. home_mailbox = Maildir/
  8. smtpd_banner = $myhostname ESMTP unknown
  9.  
  10. smtpd_sasl_auth_enable = yes
  11.  
  12. #smtpd_sasl_type = dovecot
  13. #smtpd_sasl_path = private/auth
  14. #smtpd_sasl_security_options = noanonymous
  15. #smtpd_sasl_local_domain = $hyhostname
  16. #smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
  17.  
  18. smtpd_sasl_type = cyrus
  19. smtpd_sasl_path = smtpd
  20.  
  21. smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
  22. smtp_sasl_mechanism_filter = plain
  23. smtpd_sasl_local_domain = $myhostname
  24. smtpd_recipient_restrictions =
  25. permit_mynetworks
  26. permit_sasl_authenticated
  27. reject_unauth_destination
  28.  
  29. message_size_limit = 10485760
  30.  
  31. smtpd_use_tls = yes
  32. smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
  33. smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
  34. smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

SASL認証の導入

このあたりの手順も上記サイトに丁寧な説明があります。

  1. # yum -y install cyrus-sasl
  2. # /etc/rc.d/init.d/saslauthd start
  3. # chkconfig saslauthd on
  4. # vi /etc/postfix/sasl_passwd
  5. # postmap /etc/postfix/sasl_passwd
  6. # mkdir -p /etc/skel/Maildir/{new,cur,tmp}
  7. # chmod -R 700 /etc/skel/Maildir/

メールユーザーの追加

ユーザー名:phraseit、パスワード:password

  1. # echo "password" | saslpasswd2 -p -u mail.typea.info -c phraseit
  2. # sasldblistusers2
  3. phraseit@mail.typea.info: userPassword
  4.  
  5. # chgrp postfix /etc/sasldb2
  6. # cd /etc/sasldb2

基本的には、上記の2つのリンクに設定値の説明はあるので、そちらを参照。

上記は設定値の抜粋。

1.1.1 リレーホストの問題

1つ異なるのは、自分の契約しているプロバイダのメールサーバーをリレーサーバーとして利用すべく設定(偶然上記と同じASAHIネット)してみたのだが、うまくいかない。

OP25B(Outbound Port 25 Blocking)対策 が原因かと思い、

http://asahi-net.jp/support/security/op25b/
http://asahi-net.jp/support/security/op25b/op25b_biz.pdf

動的IPアドレスによる接続でDynamic DNS等でメールサーバーを設置している場合は、以下の中継専用
(Relay)サーバーをご用意してます。
・ op25b.asahi-net.or.jp
ご利用にあたっては、以下をご確認ください。
(1)本サーバは、中継専用(Relay)サーバーです。そのため、一般的な使用上必要と考えられるラインにて最
適化し、対応させていただきます。
(2)ASAHIネットの接続回線やメールサーバーでは、法人会員規約で定める会員の禁止事項として、迷惑メー
ルの発信を禁じています。接続回線やメールサーバーから迷惑メールの発信が認められた会員に対しては、サー
ビス利用停止、ASAHIネットからの強制退会等の処置を講じます。

というこtで、何パターンか試したが、解決しないので断念。

relayhost =

とした。GMail、Hotmail、ASAHIネットへメールが送信されることは確認。

1.2 メール送信プログラムとpostfixの起動設定

  1. # alternatives --config mta
  2.  
  3. 2 プログラムがあり 'mta' を提供します。
  4.  
  5. 選択 コマンド
  6. -----------------------------------------------
  7. *+ 1 /usr/sbin/sendmail.sendmail
  8. 2 /usr/sbin/sendmail.postfix
  9.  
  10. Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
  11.  
  12. # /etc/rc.d/init.d/postfix restart
  13. postfix を停止中: [失敗]
  14. postfix を起動中: [ OK ]
  15. # chkconfig postfix on

2.メール受信サーバーの構築

2.1 dovecotのインストールと設定

  1. # yum -y install dovecot

vi /etc/dovecot/conf.d/10-mail.conf

  1. mail_location = maildir:~/Maildir

vi /etc/dovecot/conf.d/10-auth.conf

  1. disable_plaintext_auth = no

vi /etc/dovecot/conf.d/10-ssl.conf

  1. ssl = yes

2.2 起動と起動設定

  1. # /etc/rc.d/init.d/dovecot start
  2. Dovecot Imap を起動中: [ OK ]
  3. # chkconfig dovecot on

3.SSLの構成

3.1 公開鍵の作成

https://blog.apar.jp/linux/678/
http://scientificsrv.com/postfix-tls.shtml

以下の手順で公開鍵を作成する。上記のサイトを参考に期限を10年に設定した上で、作成する。

  1. cd /etc/pki/tls/certs/
  2. cp -ip Makefile Makefile.org
  3. sed -i 's/365/3650/g' Makefile
  4.  
  5. # make mail.pem
  6. umask 77 ; \
  7. PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
  8. PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
  9. /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 3650 -out $PEM2 -set_serial 0 ; \
  10. cat $PEM1 > mail.pem ; \
  11. echo "" >> mail.pem ; \
  12. cat $PEM2 >> mail.pem ; \
  13. rm -f $PEM1 $PEM2
  14. Generating a 2048 bit RSA private key
  15. ......................................................................................+++
  16. .................+++
  17. writing new private key to '/tmp/openssl.qZKMXu'
  18. -----
  19. You are about to be asked to enter information that will be incorporated
  20. into your certificate request.
  21. What you are about to enter is what is called a Distinguished Name or a DN.
  22. There are quite a few fields but you can leave some blank
  23. For some fields there will be a default value,
  24. If you enter '.', the field will be left blank.
  25. -----
  26. Country Name (2 letter code) [XX]:JP
  27. State or Province Name (full name) []:Aichi
  28. Locality Name (eg, city) [Default City]:Owariasahi
  29. Organization Name (eg, company) [Default Company Ltd]:typea.info
  30. Organizational Unit Name (eg, section) []:
  31. Common Name (eg, your name or your server's hostname) []:mail.typea.info
  32. Email Address []:postmaster@mail.typea.info

3.2 postfix の設定

  1. # vi /etc/postfix/main.cf
  2. smtpd_use_tls = yes
  3. smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
  4. smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
  5. smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

4.トラブルシュート

4.1 SASL認証のエラー

http://centossrv.com/bbshtml/webpatio/2238.shtml

  1. Jun 20 16:00:59 dos-vps-srv53 postfix/master[11252]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
  2. Jun 20 16:14:25 dos-vps-srv53 postfix/smtpd[11400]: warning: xsasl_cyrus_server_get_mechanism_list: no applicable SASL mechanisms
  3. Jun 20 16:14:25 dos-vps-srv53 postfix/smtpd[11400]: fatal: no SASL authentication mechanisms

不足ライブラリの確認とインストール

  1. # rpm -qa | grep cyrus-sasl
  2. cyrus-sasl-2.1.23-15.el6_6.2.i686
  3. cyrus-sasl-lib-2.1.23-15.el6_6.2.i686
  4. cyrus-sasl-devel-2.1.23-15.el6_6.2.i686
  5.  
  6. # yum install -y cyrus-sasl-md5
  7. # yum install -y cyrus-sasl-plain

5.DNSの設定

ムームードメインのDNS設定で、MXレコードの設定を行う。

Aレコード で設定したドメインに対して、MXレコードを割り当てる。

mail_server_dns

6.確認

6.1 コンソールからメールを送信してみる

  1. $ echo "test mail" | mail -s "test title" pppiroto@gmail.com

6.2 メーラーの設定

Outlookの場合、送信サーバーのポートを 465 に変更。

mail_server03

7.Pythonからメールを送信するサンプル

簡単なSSLメール送信サンプルを関数化

上記で作成した公開鍵ファイル /etc/pki/tls/certs/mail.pem をダウロードし、Pythonの以下のモジュールと同じディレクトリに置いておく。

  1. # -*-coding:utf-8 -*-
  2. import smtplib
  3. import email.utils
  4. from email.mime.text import MIMEText
  5. from email.header import Header
  6. import os
  7.  
  8. SMTP_CERT_FILE_NAME = 'mail.pem'
  9. SMTP_SERVER_HOST = 'mail.typea.info'
  10. SMTP_SERVER_PORT = '465'
  11. SMTP_USER_ID = 'phraseit'
  12. SMTP_PASSWORD = '**********'
  13. SMTP_FROM_NAME = 'Phraseit'
  14. SMTP_FROM_ADDR = 'phraseit@mail.typea.info'
  15. SMTP_TIME_OUT = 30
  16.  
  17. def send_mail(to_name, to_addr, subject, message):
  18. '''
  19. E-Mailを送信する
  20. '''
  21. DEBUG_LEVEL = True
  22. pem_file = os.path.join(os.path.dirname(__file__), SMTP_CERT_FILE_NAME)
  23. charset = 'utf-8'
  24. msg = MIMEText(message, 'plain', charset)
  25. msg['To'] = email.utils.formataddr((to_name, to_addr))
  26. msg['From'] = email.utils.formataddr((SMTP_FROM_NAME,SMTP_FROM_ADDR))
  27. msg['Subject'] = Header(subject, charset)
  28. server = smtplib.SMTP_SSL(
  29. SMTP_SERVER_HOST,
  30. SMTP_SERVER_PORT,
  31. 'phraseit.info',
  32. pem_file,
  33. pem_file,
  34. SMTP_TIME_OUT)
  35. server.set_debuglevel(DEBUG_LEVEL)
  36. try:
  37. server.login(SMTP_USER_ID, SMTP_PASSWORD)
  38. server.sendmail(SMTP_FROM_ADDR,
  39. [to_addr],
  40. msg.as_string())
  41. finally:
  42. server.quit()

作成したメールを飛ばしてみた。

mail_server06

基本迷惑メールに振り分けられるが、Gmail、Hotmail、ISP(ASAHIネット)へのメールとも正常に送信完了!

もっと簡単かと思っていたが、なかなか面倒くさい作業だ。

上記メール送信を組み込んだ、Django を AWS Elasticbeanstalk から起動させても、問題なくメール送信を行うことも出来た。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です