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 から起動させても、問題なくメール送信を行うことも出来た。