[お名前.com] Postfixによるメール送信・転送設定作業あれこれ | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

[お名前.com] サービスを構築するまでに行ったサーバー設定作業もろもろ 」の続き。

次は、メール関係の設定です。

Postfixを使ってSMTP-Authによるメール送信とメール転送設定を行います。

メールサーバーの設定作業


・ 必要なパッケージのインストール


メール送信には、Postfixを使います。

また、SMTP-Authに対応するためにcyrus系のパッケージを追加インストールします。


# yum install postfix.x86_64
# yum install cyrus-sasl-devel.x86_64
# yum install cyrus-sasl-plain.x86_64
# yum install cyrus-sasl-md5.x86_64

・ main.cfファイル編集


メールを送信するためのPostfix設定作業を行います。

なお、メールのリレー先のサーバーなど、お名前.com用の設定が混じってます。

下記、詰めて編集箇所のみを書いてますので、実際の設定ファイル(/etc/postfix/main.cf)内から、適宜該当箇所を修正してください。

また、設定箇所が無い場合は追記します。


myhostname = smtp.example.jp
mydomain = example.jp
myorigin = $myhostname
inet_interfaces = all
#inet_interfaces = localhost
mydestination = localhost.$mydomain, localhost, $myhostname
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/

#virtualmailbox setting
virtual_mailbox_base = /var/vmail
virtual_uid_maps = static:6001
virtual_gid_maps = static:1000
virtual_mailbox_domains = hash:/etc/postfix/virtual_domain_maps
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps

#smtpauth setting
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
   permit_sasl_authenticated,
   permit_mynetworks,
   reject_unauth_destination,
   reject_invalid_hostname,
   reject_non_fqdn_recipient,
   reject_non_fqdn_sender,
   reject_unknown_sender_domain,
   reject_unknown_recipient_domain,
   reject_unauth_pipelining
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd

#ssl
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_cert_file= /etc/pki/tls/certs/mail.pem
smtpd_tls_loglevel = 1
smtpd_tls_recived_header = yes
smtpd_tls_session_cache_timeout = 3600s
broken_sasl_auth_clients = yes

relayhost = [mailgw.vps.gmoserver.jp]


・ vmailユーザーの作成


main.cfファイルの「#virtualmailbox setting」の項目で記載しているvmailユーザーを作成します。

なお、ユーザーIDとグループIDは予め指定して作成します。


# groupadd -g 1000 vmail
# useradd -u 6001 -g 1000 -d /var/vmail -s /sbin/nologin vmail

・ virtual_alias_maps、virtual_domain_maps、virtual_mailbox_mapsファイルの作成


main.cfファイルの「#virtualmailbox setting」の項目で記載しているvirtual_alias_maps、virtual_domain_maps、virtual_mailbox_mapsの3ファイルを作成します。

virtual_alias_mapsファイルでは、バーチャルユーザーのメールの転送設定(メールのエイリアス設定)を行います。


##### virtual email alias list #####
webmaster@example.jp itboy.org@gmail.com

上記のように設定することで、webmaster@example.jp 宛のメールを別の個人のメールアドレスへ転送することができます。


virtual_domain_mapsファイルでは、バーチャルドメインのリストを記述しておきます。


##### virtual domain list #####
example.jp OK

最後のvirtual_mailbox_mapsでは、バーチャルユーザーのメールボックスのパスを指定します。


##### virtual email mailbox list #####
webmaster@example.jp example.jp/webmaster/Maildir/


ファイルの作成後は、postmapコマンドを利用してDBファイルを作成します。


# postmap virtual_alias_maps virtual_domain_maps virtual_mailbox_maps

これで、virtual_xxxx_maps.dbファイルが作成されます。


・ 証明書および秘密鍵の作成


main.cfファイルの「#ssl」の項目で設定した独自の証明書と秘密鍵ファイルを作成します。


# cd /etc/pki/tls/certs
# make mail.pem

下記のように証明書に埋め込む情報を幾つか質問されるので、適宜情報を入力します。


Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Shibuya
Organization Name (eg, company) [My Company Ltd]:Foo
Organizational Unit Name (eg, section) []:Bar
Common Name (eg, your name or your server's hostname) []:example.jp
Email Address []:webmaster@example.jp


・ master.cfファイルの編集


Postfixのもう1つの重要な設定ファイルであるmaster.cfファイルを編集します。

master.cfファイルでは接続方式やデーモンの挙動を定義するファイルになっています。


submission inet n       -       n       -       -       smtpd
  -o smtpd_enforce_tls=no
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#cyrus     unix  -       n       n       -       -       pipe
#  user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}


・ smtpd.confファイルの編集


SASLの設定ファイル「/usr/lib64/sasl2/smtpd.conf」を編集して、SASLのパスワードファイルを利用するように設定します。


pwcheck_method: auxprop

・ ユーザーとパスワードの設定


メールアカウントとそのパスワードを設定します。


# saslpasswd2 -u example.jp webmaster

メールアカウントが作成されたか確認しておきます。


# sasldblistusers2
webmaster@example.jp: userPassword

ユーザーリストを作成すると/etc/sasldb2ファイルが出来上がるので、権限を変更しておきます。


# chown root:postfix /etc/sasldb2

・ デーモンの起動


一通り設定が終わったのでPostfixとSASLのデーモンを起動します。


# /etc/init.d/postfix start
# /etc/init.d/saslauthd start

自動起動するように設定するのもお忘れなく。


# chkconfig --level 3 postfix on
# chkconfig --level 3 saslauthd on

・ メールサーバーへの接続確認


最後に、メールサーバーへの接続確認を行います。

まずは、telnetを使った接続・認証テストです。


# telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 smtp.example.jp ESMTP Postfix
EHLO localhost
250-smtp.exapmle.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN CRAM-MD5 LOGIN DIGEST-MD5
250-AUTH=PLAIN CRAM-MD5 LOGIN DIGEST-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH CRAM-MD5
334 PDIxNzY5NTM1MTUuMTM1MjY4MzdAc210cC5pbmRvZy5qcD4=
d2VibWFzdGVyQGV4YW1wbGUuanAgN2FjOGIxNGQ5YzQxZGUzZTI4MDc3ZDYxOTlkYzgzMzI
235 2.0.0 Authentication successful

※ ハイライト箇所は手動で入力した箇所です。


ちゃんと認証が成功しました。

CRAM-MD5による認証方法(MD5ダイジェストの作成)に関しては、下記のサイトを参考にさせていただきました。


telnetでsmtp-auth @ Kung Noi


コードは、「AUTH CRAM-MD5」と入力した後に返ってくる「334 XXXXX」の部分(334以降)を指定します。

なので、2つ端末を開いて一方でtelnet接続し、もう一方で上記サイトで紹介されているPerlスクリプトのコード部分に埋め込んで結果を貼り付けたりすればよいかと思います。


次に、PHPからメール送信テストを行います。

SMTP-AUTHを通して、メールを送信するためPEARパッケージを使います。


# pear install Mail
pear install Net_SMTP


メールを送信するPHPプログラムは、下記のサイトを参考にしました。


How to Send Email from a PHP Script Using SMTP Authentication @ about.com


<?php

require_once "Mail.php";

$from = "webmaster <webmaster@example.jp&>";
$to = "Foo <foo@bar.com>";
$subject = "Hi!";
$body = "hello world";

$host = "smtp.example.jp";
$username = "webmaster@example.jp";
$password = "HogeHoge";
$port = "587";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'auth' => true,
    'port' => $port,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
} else {
  echo("<p>Message successfully sent!</p>");
}

長くなってしまいましたが、これで一通り設定完了です。