Microsoft Azure で手軽にメール送信する

Webサービスなどを構築する際にクラウドサービスを利用するのは、もはや当たり前とも言える時代です。そんな時、メール送信周りがうまくいかずにトラブルになるという話も良く聞かれます。送信はできるようになっても、迷惑メールとして判定されてしまったという話も聞かれます。

今回はそんなトラブルを回避すべく、Microsoft AzureとCustomers Mail Cloudを組み合わせる方法を紹介します。今回はPostfixとRuby on Railsでメール送信を行います。

Customers Mail Cloudの設定

まずはCustomers Mail Cloudにて送信サーバの設定を行います。

ユーザ登録

ユーザ登録はまず、メールアドレスとパスワードを入力するところからはじまります。

f:id:moongift:20190510151017p:plain
ユーザ登録

入力したメールアドレス宛にメールアドレスの確認メール(仮登録受付メール)が届きますので、URLをクリックします。その後、名前や住所といった必要な情報を入力します。ユーザ登録が完了すると、無料トライアル開始のための審査が入ります。時間は長くとも30分程度です。「Customers Mail Cloud 無料トライアル利用開始のご案内」というメールが届いたら利用できます。

ログイン後に行うこと

ログインしたら、2つの作業を行う必要があります。

f:id:moongift:20190510150911p:plain
ダッシュボード

DKIMキーを設定する

DKIMキーはメールのなりすましを防止するための技術になります。メール配信を行うドメインのTXTレコードに対して設定します。管理コンソールでドメインを追加しようとすると、専用のキーが表示されます。

f:id:moongift:20190510150735p:plain
DKIMキーの取得

ドメインは s999999999999._domainkey.example.com のような形式になります。設定する値は v=DKIM1; p=MIG...QAB のように指定されるはずです。この設定はシステム管理者などに依頼して行ってもらってください。

DNS設定はすぐに反映されませんので、数分後にDNSを確認ボタンを押します。正しく設定されていれば、ドメインが追加登録できます。

ユーザを追加する

次にメール配信を行うユーザを追加します。これはAPI設定にて行います。ユーザ名(メールアドレス形式)、パスワードを設定します。また、利用できる機能を制限できます。例えばSMTPのみ、APIのみといった指定も可能です。

f:id:moongift:20190510150841p:plain
ユーザの追加

サーバに設定を反映する

設定を行ったら、それをサーバに反映します。サーバ構成機能にて行います。この反映を行わないと、DKIMやユーザ追加設定が反映されませんので注意してください。ここまでで以下の情報が入手できているはずです。

  • SMTPサーバのアドレス
  • SMTPサーバのポート番号
  • APIユーザ
  • APIキー

これらの情報はメール送信時に設定しますので覚えておいてください。

Microsoft Azureのセットアップ

続いてMicrosoft Azureで仮想マシンを立ち上げます。今回はStandard D2s v3、Ubuntu 18.04LTSを指定しています。インスタンスを立ち上げる際、SSHとHTTPS、HTTPは使えるようにし、手元のSSHキーを指定しています。

f:id:moongift:20190712171707p:plain
Microsoft Azureのセットアップ中

仮想マシンにログイン

仮想マシンが立ち上がったら、SSHでログインします。

ssh (公開鍵のユーザ名)@(仮想マシンのIPアドレス)

セットアップ

まずはパッケージを更新します。

sudo apt-get update

今回はPostfixでメール転送設定を行います。まずスーパーユーザになります。

sudo su -

マスク解除を設定します。

umask 077

Postfixをインストールします。

apt-get install postfix libsasl2-modules -y

途中で選択欄が表示されるので [Local Only] を選択します。入力欄も出ますが、デフォルトのままで問題ありません。

Postfixの設定

Postfixの設定は /etc/postfix/main.cf に記述されています。このファイルを vi や nanoなどで開きます。

修正点は以下の通りです。まず、下記の設定をコメントアウトします。行頭に # を書けばOKです。

# default_transport = error
# relay_transport = error

relayhost という設定があるので、Customers Mail CloudのSMTPサーバアドレスとポート番号を記述します。以下は一例です。

# SMTPサーバのIPアドレス:ポート番号 という形です
relayhost = sandbox.smtps.jp:10025

ファイルの末尾に以下を記述します。これは認証設定になります。

smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous

設定ファイルを閉じます。

認証設定を行う

次に以下のコマンドを実行します。括弧内をすべて指定されたものに書き換えてください。

echo (SMTPサーバアドレス):(ポート番号) (APIユーザ):(APIキー) >> /etc/postfix/sasl_passwd

例えば下記のようになります。

echo sandbox.smtps.jp:10025 user:password >> /etc/postfix/sasl_passwd

DBファイルを生成します。

postmap /etc/postfix/sasl_passwd

DBファイル化したオリジナルファイルは不要なので削除します。

rm /etc/postfix/sasl_passwd

DBファイルに対してアクセス権限を設定します。

chmod 600 /etc/postfix/sasl_passwd.db

Postfixを再起動して設定を反映します。

/etc/init.d/postfix restart

Ruby on Railsのインストールと設定

今回はRuby on Railsをインストールしていきます。まず必要なライブラリをインストールします。

sudo apt-get install autoconf \
bison build-essential libssl-dev \
libyaml-dev libreadline6-dev zlib1g-dev \
libncurses5-dev libffi-dev libgdbm5 libgdbm-dev \
sqlite3 libsqlite3-dev nodejs

次にrbenvをインストールします。aptでもインストールできますが、ライブラリをインストールする度にroot権限が必要だったりバージョン管理が面倒だからです。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv  
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build  
cd ~/.rbenv && src/configure && make -C src  
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc  
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

.bashrc の更新を反映します。

. ~/.bashrc

Rubyをインストールします。ソースコードからビルドするので多少時間がかかります。

rbenv rehash  
rbenv install 2.6.3  
rbenv global 2.6.3

Ruby on Railsの設定

続いてRuby on Railsをインストールします。

gem install rails

railsコマンドで新しいアプリケーションを作成します。

rails new app
cd app

メールの設定

ではメールの設定を行います。 config/environments/production.rb を開いて次のように追加設定します。括弧内について、皆さんの設定で書き換えてください。

config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => '(メール送信を行うドメイン)' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => 'localhost',
  :enable_starttls_auto => false
}

メール送信のテスト

ではメール配信をテストしてみます。まずベースを生成します。

rails g mailer test

これで app/mailers/test_mailer.rb というファイルが生成されます。内容を次のように変更します。

$ cat app/mailers/test_mailer.rb
# coding: utf-8
class TestMailer < ApplicationMailer
  default from: "(送信元になるメールアドレス)"

  def send_mail(to)
    mail(
      subject: "お問い合わせ", # メールの件名
      to: to                 # メールの宛先
    ) do |format|
      format.text
    end
  end
end

続けて app/views/test_mailer/send_mail.text.erb を作成して、メールの本文を作成します。今回は特にプログラマブルに書き換えられる設定にはしていません。

お問い合わせのメールです。

対応をお願いします。

ではRuby on Railsのコンソールを立ち上げます。Railsの環境設定はproductionとしています。

RAILS_ENV=production rails c

そしてメール送信を試してみます。下記のメールアドレスは自分のものに書き換えてください。

TestMailer.send_mail('(あなたが受け取れるメールアドレス)').deliver

これでメールが届けばちゃんと設定できているのが確認できます。

まとめ

Microsoft Azureではセキュリティやスパムなどを防止するために25番ポートが使えないように制御されています。そのためメール送信は外部ベンダーのものを使うのが基本となっています。

ぜひMicrosoft Azureでのメール送信にCustomers Mail Cloudをご利用ください。

Microsoft Azure Cloud Computing Platform & Services