スポンサーリンク/Sponsored Link

Microsoft Exchange + SwiftMailer で、確実に届くメール環境を構築する

うさぎさんがすばやくメールを運ぶイラスト
ホームページ作成
スポンサーリンク/Sponsored Link

【2023/8追記】現在はMicrosoft Graphを使う方法に切り替えました

本記事は2018年7月時点で行った作業をまとめたものです。

ところが、2023年になり、Microsoft Exchange OnlineのSMTP AUTHが認証されない事態が連続して発生しました。Microsoftが、認証ポリシーを変更し、OAuthによる認証しか認めないようになったのです。

例外的な措置を繰り返して、SMTH AUTHを使い続けてきましたが、ついに、どのような抜け道でも使えない可能性がある、と判断しまして、さきほど(2023/8)、大幅にプログラムを書き換えました。

現在、当店の試験申し込みシステムは、Microsoft Graph(PHP SDK)を使って、メールを送信しております。

この顛末は、新しい記事にまとめて公開しました。

——-追記おわり 以下は当時の記事をそのままにしています。

先日、当店からのメールが、突然多くの方にきちんと届かなくなりました。

確認してみますと、当店が使用している共用サーバーのどこかに「ボットネットに感染した」形跡があるとして、「ブラックリスト」に掲載されていたのです。

レンタルサーバー側に連絡し、対処を依頼した結果、現在はその原因も除去され、ブラックリストから外れているようですが、

数カ月にわたりそのような状態になり、業務に支障が出ました。

そこで、思い切ってメールサーバとして外部サーバを使用することにし、PHPでコーディングして外部サーバからメール送信することにしました。

この記事は、その作業のてんまつをまとめたものです。

スポンサーリンク/Sponsored Link

発端・送信したメールがぞくぞくとエラーになる事態

ある日、当店で資格試験を受験しようとして申し込んでこられた方から、こんな連絡がありました。

「自動返信メールを待っているのですが、届かないのです。どうなっていますか?」

確認しますと、試験申し込みフォームの自動送信メールに対して、こんなエラーメールが返信されていました。
(サーバーアドレス等、一部を伏字「xxxx」にしています。赤字の下線部が注目点です。)

From:Mail Delivery System <MAILER-DAEMON@svxxxx.xserver.jp>
Subject:Undelivered Mail Returned to Sender

This is the mail system at host svxxxx.xserver.jp.
I’m sorry to have to inform you that your message could not be delivered to one or more recipients. It’s attached below.
For further assistance, please send mail to <postmaster>
If you do so, please include this problem report. You can delete your own text from the attached returned message.

The mail system

<xxx@xx.xxx.ac.jp>: host
xx-xx-xx-jp.mail.protection.outlook.com[xx.xxx.xxx.xxx] said: 550 5.7.1  Service unavailable, Client host [xxx.xx.xxx.xx] blocked using Spamhaus. To  request removal from this list see http://www.spamhaus.org/lookup.lasso
(ASxxxxxxxx) [xxxxxxxxxxxx.eop-JPN01.prod.protection.outlook.com] (in reply to RCPT TO command)

赤字下線部を訳しますと、

(メールは)「Spamhaus」を利用してブロックされました。このリストからの削除を要請するには、http://www.spamhaus.org/lookup.lasso をごらんください。

となります。

つまり「Spamhausというブラックリストに掲載されているという理由で、あなたのメールをブロックしました」ということです。

当店としては、直接に試験登録業務や受講予約業務に必要なメールを日々送信しているだけで、メーリングリストすら運営していません。いったい、なぜこんなことになってしまったのでしょう?

Spamhausとはいったい何?

「Spamhaus」とは、スパムメール(迷惑メール)の発信源のIPアドレスをリスト化して提供する会社です。1998年に設立された国際非営利団体「Spamhaus Project」の傘下にある、ということのようです。(参考: The Spamhaus Project | Wikipedia(English))

どうしてこんなことになったのか?

なぜこんなことになってしまったのか、正確な原因は分からずじまいですが、推測するに、

  • 同一サーバーに入っている誰かが、スパムメールを送り続けていた
  • 同一サーバーに入っている誰かのHPが、何かに感染し、誰かの悪質なメールの発信元に利用された

の、いずれかではないかと思います。

専用サーバーではなく、レンタルサーバーを使う以上は、仕方がないことなんですねー。

一つのサーバーを多数のユーザーで共有するしくみで、コストを安くおさえているため、自分はやってなくてもブラックリストに入ることがあるんです。

Spamhausブラックリストの影響範囲

このブラックリストに登録されたことによる、メールが届かない影響範囲は、当店の場合次のようなものでした。

  • @outlook.jp / @hotmail.comなど、マイクロソフト系のメールアドレス
  • 大学・企業など、マイクロソフトのメールサーバを使用していると思われるメールアドレス
  • @icloud.com

中でも@icloud.comは、エラーメールすら帰ってこないため、こちらからは正常に送信しているのに、まったく受信できない状態になっていました。

解除手続きを一応やってみましたが・・・

一応、エラーメールにある確認先、http://www.spamhaus.org/lookup.lasso を開いて、サーバーのIPアドレスを入力してみました。

確かにブラックリストに登録されています。そしてその通知ページ最下部に、リストから削除(Remove)するボタンがあったので、申請してみました。

たしかに一旦は削除され、メールも届くようになりますが、翌日にはもう再登録されてしまいます。

原因が除去されていないからですね。どうやら誰かが、かなり活発にこのサーバーから変なものを送信しているようです。

そんなことを3回ほど繰り返すと、「短期間に申請数が多い」として、削除ボタンそのものが出なくなってしまいました・・・。

スポンサーリンク/Sponsored Link

仕方ない、外部メールサーバーを使うか!

とりあえず、レンタルサーバー(XServer)のサポートには対応を依頼し、「なんとかします」的な返事はいただいたのですが、

とにかく日々の業務に支障が出ます。とても待ってはいられません。

まして、再度同じことがおきる可能性だってあります。

仕方ないので、面倒を覚悟で、外部メールサーバーを使うことにしました。

Microsoft Exchangeを使うことにしました。

今回は、Microsoftのサーバーから特に拒否が強かったので、こちらもMicrosoft Exchangeを使うことにしました。

G Suite、AWSなど、他のメールサーバーを使うこともできると思います。

今回特に、Exchangeを使うための設定や、送信コードの注意点などをまとめています。

PHP7に対応したメーラーを使う必要が・・・

外部メールサーバーを使うには、まずサーバーにメーラーをインストールする必要があります。

WordPressサイトの場合は、「WP Mail SMTP by WPForms」プラグインを使用するなどして、比較的簡単に外部SMTPサーバからメールを送ることができます。

しかし、当店HPのように、Wordpressを使用していない場合は、サーバー上のPHPにメールシステムを組み込む必要があるのです。

一部ググッて出る記事で、「PHP.iniの[mail function]」を設定すればよい、とする記事がありますが、この設定はWindows 32bit環境のPHPのみであるようです。

レンタルサーバーはLinuxであるため、PHP.iniを変更するだけでは外部メールサーバは使えません。

そこで、メーラーライブラリを使うわけですが、何種類か検索で出てきます。

Xserverには、Pear::Mailがなんだかうまく入らず・・・ どうも、特権が許可されてなく、sudoが使えない仕様なのが原因のようです。

Qdmailは、開発者の方が「開発終了」と表明されています。PHP7では動かない、ということでした。

このため、今回はSwift Mailerを使うことにしました。

スポンサーリンク/Sponsored Link

Microsoft Exchangeのセットアップ

ライセンスの購入

まずは、Microsoft Exchangeのライセンスを購入する必要があります。

一般法人向けのOffice365製品には、Exchangeライセンスがついているものがあります。

一般法人向けOffice365製品一覧

含まれるサービスにExchangeが入っている

「含まれるサービス」の中にExchangeが入っているものは大丈夫。

当店の契約には、これが入っていなかったため、更新までの間、Exchangeライセンスを単体で追加することにしました。

Exchange単体プラン一覧

とりあえず一番安い440円のプランを購入。

独自ドメインでExchangeを使えるようにする

当店のアドレスは info@curio-shiki.com で、独自ドメインですので、これをMicrosoft Exchangeで使えるようにする必要があります。

元の状態

  • Webサーバ(ホームページ): XServer
  • メールサーバ:Xserver

これを今から、

  • Webサーバ(ホームページ):Xserver
  • メールサーバ:Microsoft Exchange

に変えていきます。

DNSレコードの編集

方法は、DNSレコードの編集によって行います。

Office365にドメインの追加
Office365トップメニュー。右から二番目の「管理」から入ります

詳しくは、Office365トップページからログインして、Office365管理画面で「ドメインの追加」をクリックし、指示に従って操作していきます。

編集すべきDNSレコードの一覧と、実際の記入内容がすべて表示されますので、それを自分のドメインを管理するサイトで入力して反映します。今回の場合は、Xserverのサーバーパネル→「DNSレコード設定」で編集します。

きちんと設定されたか確認できる画面もありますので安心です。

設定が終わると、次のような状態になります。確認画面でなかなかうまくいかなかったら、この例を参考にしてみてください。(画面は、XServerのDNSレコード確認画面です)

DNSレコードの状態

メールボックスのセットアップ

ドメインが設定出来たら、メールアドレスを設定し、メールボックスをセットアップします。

当店のように、追加ライセンスで購入した場合は、Office365管理画面(※ログイン必要)の「ユーザーの追加」から行う必要があります。

ユーザーの追加

下記のように、使いたいメールアドレスをユーザー名に設定したのち、Exchangeのライセンスを含むライセンスをオンにします。(画像はすでに設定済みの状態から「追加」しているため、ライセンスがありません、と表示されていますが、未割当の場合はライセンス数が表示されます。)

ユーザー追加の設定画面

ここで設定したユーザー名・パスワードが、のちにSwiftMailerに持たせるパスワードになります。

※「まだライセンスを買っていないけど試しに・・・」、などの理由で「製品ライセンスなしでユーザーを作成する」を「オン」にしないでください。これをやりますと、メールボックスが「共有メールボックス」としてセットアップされてしまい、後でややこしいことになります。

※ここで設定するメールアドレスが「プライマリメールアドレス」となります。このほか、設定後に「エイリアス」として、他のメールアドレスも追加できますが、このエイリアスは

  • エイリアスでの受信OK→プライマリと同じメールボックスに入ります。
  • エイリアスでの送信NG→できません。プライマリメールアドレスでの送信となります

詳しくはこちらに説明があります→ ユーザーに別のメール エイリアスを追加する | Officeサポート

※ライセンス追加ではなく、Office365導入時点での追加の場合は、既存のユーザーを編集して、ユーザー名を受信したいメールアドレスに変更します。

ユーザーの編集

Exchange管理センターで最終確認

設定が終わりましたら、Office365管理画面(※ログイン必要) 左ペインの「管理センター」→「Exchange」から、メールボックスができていることを確認します。

Exchange管理センター
メールボックスを選択
メールボックス 表示名 種類 プライマリメールアドレス

このように表示されていれば、設定完了です。

SMTP接続の設定を確認

最後に、SMTP接続の設定を確認します。

Office365ホームから、「Outlook」を選択

Office365ホームからOutlookを選択

Outlook Onlineの右上の歯車(設定)

Outlook Onlineの設定ボタン

設定の中の「メール」

メールの設定

「メール」の中の「POPとIMAP」を開き、SMTPの設定を確認

POPとIMAPの設定 SMTPの設定を確認

次の設定でSMTP接続が可能です。

サーバー名: smtp.office365.com

ポート: 587

暗号化方法: STARTTLS

ユーザー名: xxxx@xxxx.xx【設定したメールアドレス全体】

パスワード: 【アカウントに設定したパスワード】

スポンサーリンク/Sponsored Link

SwiftMailerをサーバーにインストール

続いては、HPを置いているサーバーから、外部SMTPでメールを送るための設定です。

SwiftMailerのインストール方法は、次のサイトを参考にさせていただきました。

swiftmailerでメールを送る (Gmail, Yahoo!メール経由) | Qiita

SwiftMailerのインストールには、Composerが必要なので、先に次のページを参考にComposerをインストールしました。

xserverにComposerをインストールして使えるようにする | Qiita

またそもそも、サーバーをコマンドラインで操作するため、SSH接続も必要です。Xserverの場合は次の公式マニュアルを参考にしました。

SSH設定 | Xserverマニュアル

SSHソフトの設定(Tera Term) | Xserverマニュアル

スポンサーリンク/Sponsored Link

Webページに送信用のコードを記述

ここまでできたら、あとは送信用のコードをページに記述するだけとなります。

まず送信用の関数を記述。

function sendswiftmail($from_email, $from_name, $to_email, $to_name, $subject, $body){
require_once 'bin/vendor/autoload.php';

// 送信設定
$transport = new Swift_SmtpTransport('smtp.office365.com', 587 ,'tls');
$transport->setUsername('info@curio-shiki.com');
$transport->setPassword('(パスワード)');
$transport->setAuthMode('LOGIN'); 
$mailer = new Swift_Mailer($transport);

// メール作成
$message = new Swift_Message($subject);
$message->setFrom([$from_email=>$from_name]);
$message->setTo([$to_email=>$to_name]);
$message->setBody($body);

// メール送信
$result = $mailer->send($message);
}

この中の、

$transport->setAuthMode(‘LOGIN’);

が必要だと気付くまでにけっこうかかりました。Microsoft Exchangeの場合は、これを入れないとそもそも認証プロセスに入れませんでした。

きちんと説明したサイトが少なく、以下のサイトの事例を参考にして作成しました。

swiftmailer Office 365 #497 | GitHub

あとは、この関数を使って実際にメールを送信します。

sendswiftmail ( $email_admin, $name_admin, $email_candidate, $name_candidate, $subject_user, $email_user_body);

メリット・デメリットと、その他の方法

上記の方法は、次のOffice公式ドキュメントの中の、「オプション1」に該当します。

Office 365 を使って、多機能デバイスやアプリケーションがメールを送信するように設定する方法 | Office サポート

メール送信時に直接SMTPサーバでID/パスワードで認証するため、セキュリティ面から言えばこれがベストです。

しかし、実際に運用してみて、デメリットを感じることもあります。というのも、

認証にけっこう時間がかかり、その間次のページが読み込まれず画面が空白となるのです。

この点は、Javascriptで「お待ちください」を表示するなど、解決方法はありそうなのですが、

「オプション2」「オプション3」として、他の方法も掲載されています。

オプション2: プリンターやアプリケーションからOffice365に直接メールを送信する(直接送信)

おもにSMTP認証の動作そのものができない機器からのメール送信に対応するため、特定のアドレス(MXエンドポイント)に向けて送信したメールを、認証なしでExchangeからメール送信できる設定です。

ただし、認証なしのため、メールあて先は組織内(同一ドメイン内)に限られます。

オプション 3: Office 365 の SMTP リレーを使ってメールを送信するコネクタを構成する

オプション2に似ていますが、外部にメール送信する必要があるため、特定のIPアドレスをあらかじめ設定して、そのIPアドレスからMXエンドポイントに向けたメール送信を、無認証でExchangeのメールとして送信する機能です。

当教室の場合、送信元サーバがレンタルサーバであり、複数人で同一IPアドレスを使用することから、オプション3 の設定をするとセキュリティ上問題があると判断し、

結局、時間は少しかかりますが直接認証によってメールを送信する方式としました。

スポンサーリンク/Sponsored Link

結果: すべてのメールが問題なく届くようになりました!

以上の実装に、夜なべして3日ほどかかりましたが、ぶじ完了しました。

結果、Microsoft系のサーバやicloudメールにも、問題なくメールが届くようになりました。

Microsoft Exchangeのメールは、設定しなくてもDKIM認証されるようです。(認証ドメインはxxx.onmicrosoft.comとなります) このため、迷惑メールフォルダに入ってしまうこともなくなりました。

DKIM認証は、本当は「curio-shiki.com」ドメインで実施したいところです。これはちょっとまだ、うまくいっていないのですが、もしできましたらここに追記します。

パソコン教室・キュリオステーション志木店からのお知らせ
レッスンはオンラインで受講できます

パソコン教室・キュリオステーション志木店では、オンラインでの在宅レッスンを実施しております。
教室の全コースがオンラインで受講可能。実際にインストラクターがご対応いたします。
1時間の無料体験レッスンはいつでも予約できます。詳しくは公式ページをご覧ください。

キュリオステーション志木店運営をフォローする
スポンサーリンク/Sponsored Link

コメント

タイトルとURLをコピーしました