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

ねらいとしては、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レコードを割り当てる。

mail_server_dns

6.確認

6.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の以下のモジュールと同じディレクトリに置いておく。

# -*-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()

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

mail_server06

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

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

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

Follow me!

コメントを残す

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