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