CentOSにメールサーバーを構築してPythonからメールを送信する
- (1) Django起動まで
- (2) (TIPS) SSH、RDSへの接続
- (3) (TIPS) ログの確認とデプロイ結果の確認
- (4) いくつかのトラブルシュート
- (5) アプリケーションの作成
- (6) createadmin スクリプトの実行のトラブルシュート
- (7) 静的IPアドレスの設定とドメインの取得とDNSの設定
- AWS Elastic Beanstalk RDS の文字コードをutf-8に設定しなおす
- Djangoでバッチ処理を行う(AWS Elasticbeanstalk)
ねらいとしては、AWS Elastic Beanstalk を使って作成しているアプリケーションから、メールを飛ばす。
ServersManで借りているレンタルサーバー(CentOS6) にメールサーバーを構築し、AWS Elastic Beanstalk 上のアプリケーションから接続してメール送信を行う。
1.メール送信サーバーの構築
メールサーバーの構築は、完全に以下のサイトの手順を参考に。
基本的に上記のサイトの手順通りにやればOKだと思う。
とはいえ、やはり「こはまり」はあったので、備忘。
1.1 Postfix のインストールと設定
- # yum install postfix
vi /etc/postfix/main.cf
- myhostname = mail.typea.info
- mydomain = typea.info
- myorigin = $mydomain
- inet_interfaces = all
- mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
- relayhost =
- home_mailbox = Maildir/
- smtpd_banner = $myhostname ESMTP unknown
- smtpd_sasl_auth_enable = yes
- #smtpd_sasl_type = dovecot
- #smtpd_sasl_path = private/auth
- #smtpd_sasl_security_options = noanonymous
- #smtpd_sasl_local_domain = $hyhostname
- #smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
- smtpd_sasl_type = cyrus
- smtpd_sasl_path = smtpd
- smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
- smtp_sasl_mechanism_filter = plain
- smtpd_sasl_local_domain = $myhostname
- smtpd_recipient_restrictions =
- permit_mynetworks
- permit_sasl_authenticated
- reject_unauth_destination
- message_size_limit = 10485760
- smtpd_use_tls = yes
- smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
- smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
- smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
SASL認証の導入
このあたりの手順も上記サイトに丁寧な説明があります。
- # yum -y install cyrus-sasl
- # /etc/rc.d/init.d/saslauthd start
- # chkconfig saslauthd on
- # vi /etc/postfix/sasl_passwd
- # postmap /etc/postfix/sasl_passwd
- # mkdir -p /etc/skel/Maildir/{new,cur,tmp}
- # chmod -R 700 /etc/skel/Maildir/
メールユーザーの追加
ユーザー名:phraseit、パスワード:password
- # echo "password" | saslpasswd2 -p -u mail.typea.info -c phraseit
- # sasldblistusers2
- phraseit@mail.typea.info: userPassword
- # chgrp postfix /etc/sasldb2
- # 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の起動設定
- # alternatives --config mta
- 2 プログラムがあり 'mta' を提供します。
- 選択 コマンド
- -----------------------------------------------
- *+ 1 /usr/sbin/sendmail.sendmail
- 2 /usr/sbin/sendmail.postfix
- Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
- # /etc/rc.d/init.d/postfix restart
- postfix を停止中: [失敗]
- postfix を起動中: [ OK ]
- # chkconfig postfix on
2.メール受信サーバーの構築
2.1 dovecotのインストールと設定
- # yum -y install dovecot
vi /etc/dovecot/conf.d/10-mail.conf
- mail_location = maildir:~/Maildir
vi /etc/dovecot/conf.d/10-auth.conf
- disable_plaintext_auth = no
vi /etc/dovecot/conf.d/10-ssl.conf
- ssl = yes
2.2 起動と起動設定
- # /etc/rc.d/init.d/dovecot start
- Dovecot Imap を起動中: [ OK ]
- # chkconfig dovecot on
3.SSLの構成
3.1 公開鍵の作成
https://blog.apar.jp/linux/678/
http://scientificsrv.com/postfix-tls.shtml
以下の手順で公開鍵を作成する。上記のサイトを参考に期限を10年に設定した上で、作成する。
- cd /etc/pki/tls/certs/
- cp -ip Makefile Makefile.org
- sed -i 's/365/3650/g' Makefile
- # make mail.pem
- umask 77 ; \
- PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
- PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
- /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 3650 -out $PEM2 -set_serial 0 ; \
- cat $PEM1 > mail.pem ; \
- echo "" >> mail.pem ; \
- cat $PEM2 >> mail.pem ; \
- rm -f $PEM1 $PEM2
- Generating a 2048 bit RSA private key
- ......................................................................................+++
- .................+++
- writing new private key to '/tmp/openssl.qZKMXu'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [XX]:JP
- State or Province Name (full name) []:Aichi
- Locality Name (eg, city) [Default City]:Owariasahi
- Organization Name (eg, company) [Default Company Ltd]:typea.info
- Organizational Unit Name (eg, section) []:
- Common Name (eg, your name or your server's hostname) []:mail.typea.info
- Email Address []:postmaster@mail.typea.info
3.2 postfix の設定
- # vi /etc/postfix/main.cf
- smtpd_use_tls = yes
- smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
- smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
- smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
4.トラブルシュート
4.1 SASL認証のエラー
http://centossrv.com/bbshtml/webpatio/2238.shtml
- Jun 20 16:00:59 dos-vps-srv53 postfix/master[11252]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
- Jun 20 16:14:25 dos-vps-srv53 postfix/smtpd[11400]: warning: xsasl_cyrus_server_get_mechanism_list: no applicable SASL mechanisms
- Jun 20 16:14:25 dos-vps-srv53 postfix/smtpd[11400]: fatal: no SASL authentication mechanisms
不足ライブラリの確認とインストール
- # rpm -qa | grep cyrus-sasl
- cyrus-sasl-2.1.23-15.el6_6.2.i686
- cyrus-sasl-lib-2.1.23-15.el6_6.2.i686
- cyrus-sasl-devel-2.1.23-15.el6_6.2.i686
- # yum install -y cyrus-sasl-md5
- # yum install -y cyrus-sasl-plain
5.DNSの設定
ムームードメインのDNS設定で、MXレコードの設定を行う。
Aレコード で設定したドメインに対して、MXレコードを割り当てる。
6.確認
6.1 コンソールからメールを送信してみる
- $ echo "test mail" | mail -s "test title" pppiroto@gmail.com
6.2 メーラーの設定
Outlookの場合、送信サーバーのポートを 465 に変更。
7.Pythonからメールを送信するサンプル
簡単なSSLメール送信サンプルを関数化
上記で作成した公開鍵ファイル /etc/pki/tls/certs/mail.pem をダウロードし、Pythonの以下のモジュールと同じディレクトリに置いておく。
- # -*-coding:utf-8 -*-
- import smtplib
- import email.utils
- from email.mime.text import MIMEText
- from email.header import Header
- import os
- SMTP_CERT_FILE_NAME = 'mail.pem'
- SMTP_SERVER_HOST = 'mail.typea.info'
- SMTP_SERVER_PORT = '465'
- SMTP_USER_ID = 'phraseit'
- SMTP_PASSWORD = '**********'
- SMTP_FROM_NAME = 'Phraseit'
- SMTP_FROM_ADDR = 'phraseit@mail.typea.info'
- SMTP_TIME_OUT = 30
- def send_mail(to_name, to_addr, subject, message):
- '''
- E-Mailを送信する
- '''
- DEBUG_LEVEL = True
- pem_file = os.path.join(os.path.dirname(__file__), SMTP_CERT_FILE_NAME)
- charset = 'utf-8'
- msg = MIMEText(message, 'plain', charset)
- msg['To'] = email.utils.formataddr((to_name, to_addr))
- msg['From'] = email.utils.formataddr((SMTP_FROM_NAME,SMTP_FROM_ADDR))
- msg['Subject'] = Header(subject, charset)
- server = smtplib.SMTP_SSL(
- SMTP_SERVER_HOST,
- SMTP_SERVER_PORT,
- 'phraseit.info',
- pem_file,
- pem_file,
- SMTP_TIME_OUT)
- server.set_debuglevel(DEBUG_LEVEL)
- try:
- server.login(SMTP_USER_ID, SMTP_PASSWORD)
- server.sendmail(SMTP_FROM_ADDR,
- [to_addr],
- msg.as_string())
- finally:
- server.quit()
作成したメールを飛ばしてみた。
基本迷惑メールに振り分けられるが、Gmail、Hotmail、ISP(ASAHIネット)へのメールとも正常に送信完了!
もっと簡単かと思っていたが、なかなか面倒くさい作業だ。
上記メール送信を組み込んだ、Django を AWS Elasticbeanstalk から起動させても、問題なくメール送信を行うことも出来た。