2026/04/07

はじめに

WordPressのメール送信は標準ではPHPのmail()関数を使いますが、レンタルサーバー環境では迷惑メールフォルダに振り分けられたり、そもそも届かないことがあります。

SMTPプラグインで解決するのが一般的ですが、今回はMicrosoftのAzure Communication Services(ACS)のREST APIを使ってwp_mailを完全に置き換えるプラグイン「AzureMailer」を開発しました。

当社はMicrosoftパートナーとしてAzureを活用しており、Azure Communication Services・Azure Functions・SharePoint・Microsoft Teamsなど、Microsoft 365 / Azureを組み合わせた業務システムの構築を得意としています。

WordPress.org公式ディレクトリにも申請中で、GitHubでソースコードを公開しています。

なぜAzure Communication Servicesなのか

SMTPの代わりにACSを選んだ理由は以下の通りです。

  • SMTPポート不要 — ファイアウォールでSMTPポート(587/465)がブロックされている環境でもHTTPS経由で送信できる
  • 高い到達率 — Microsoftのメールインフラを利用するため、Gmail・Outlook等への到達率が高い
  • HMAC-SHA256認証 — SMTPのパスワード認証より安全
  • 無料枠 — 1日100通まで無料(コーポレートサイトなら十分)

プラグインの設計方針

開発にあたって、以下を設計方針としました。

  • pre_wp_mailフィルターでwp_mailを置き換え、既存のプラグイン(Contact Form 7、WooCommerce等)は一切変更不要
  • 管理画面の「設定」から接続文字列と送信元アドレスを入力するだけで動作
  • 設定が空の場合はデフォルトのwp_mailにフォールバック
  • テストメール機能を内蔵

管理画面の「設定 → AzureMailer」から接続文字列と送信元アドレスを入力するだけで利用できます。

AzureMailer設定画面

実装のポイント

1. ACSのHMAC-SHA256認証

ACSのREST APIは、リクエストごとにHMAC-SHA256署名を生成する必要があります。署名の対象は「HTTPメソッド + パス + 日時 + ホスト + ボディのSHA256ハッシュ」です。

$content_hash = base64_encode( hash( 'sha256', $json_body, true ) );
$date = gmdate( 'D, d M Y H:i:s T' );
$host = wp_parse_url( $endpoint, PHP_URL_HOST );

$string_to_sign = "POST\n{$path}\n{$date};{$host};{$content_hash}";
$signature = base64_encode(
    hash_hmac( 'sha256', $string_to_sign, base64_decode( $access_key ), true )
);

この署名をAuthorizationヘッダーに含めてリクエストを送信します。接続文字列にはエンドポイントとアクセスキーが含まれているので、それをパースして使います。

2. pre_wp_mailフィルター

WordPressにはpre_wp_mailというフィルターがあり、wp_mailの処理を完全に置き換えることができます。

add_filter( 'pre_wp_mail', [ $this, 'send_via_acs' ], 10, 2 );

このフィルターでtrueを返せば「送信成功」、falseなら「送信失敗」、nullなら「デフォルトのwp_mailにフォールバック」という挙動になります。設定が空の場合にnullを返すことで、プラグインを有効化しただけではメール送信に影響しない安全設計にしています。

3. HTML/テキストメールの自動判別

wp_mailのheadersパラメータにContent-Type: text/htmlが含まれている場合はHTMLメール、それ以外はプレーンテキストメールとして送信します。

$header_str = is_array( $headers ) ? implode( "\n", $headers ) : (string) $headers;
if ( preg_match( '/Content-Type:\s*text\/html/i', $header_str ) ) {
    $body['content']['html'] = $message;
} else {
    $body['content']['plainText'] = wp_strip_all_tags( $message );
}

つまったところ

WordPress.orgのPlugin Check

WordPress.org公式ディレクトリに申請するためPlugin Checkを実行したところ、いくつかの指摘を受けました。

  • プラグイン名に「WP」は使えない — 当初「WP Azure Mail」という名前でしたが、WordPressの商標保護のため「WP」を含むプラグイン名は禁止されています。「AzureMailer」にリネームしました
  • テキストドメインとスラッグの一致 — WordPress.orgが割り当てるスラッグ(azuremailer)とプラグインのText Domainヘッダーが一致しないとエラーになります
  • load_plugin_textdomain()は非推奨 — WordPress 4.6以降、公式ディレクトリのプラグインは自動で翻訳がロードされるため不要です
  • error_log()は本番コードで非推奨 — WP_DEBUG_LOGが有効な場合のみログ出力するようにラップしました
  • $_POSTのサニタイズ — wp_unslash()を通してからsanitize_text_field()する必要があります

Contact Form 7との連携

Contact Form 7は内部でwp_mailを使っているため、AzureMailerを有効化するだけで自動的にACS経由でメールが送信されます。追加設定は不要です。

当社サイトではContact Form 7の送信後にAzure Functionsを呼び出してSharePoint ListとTeamsにも通知を送っていますが、これはAzureMailerとは独立した処理(wpcf7_mail_sentフック)なので互換性の問題はありません。

設定画面からテストメールを送信して、正常に動作することを確認できます。

AzureMailerテストメール送信成功

まとめ

  • Azure Communication Servicesを使えばSMTP不要で安全にメール送信できる
  • pre_wp_mailフィルターで既存プラグインに影響なく置き換え可能
  • WordPress.orgへの申請にはPlugin Checkの基準を満たす必要がある
  • プラグインはGitHubで公開中: https://github.com/bgng-co-jp/azuremailer

Azureの導入・活用のご相談

株式会社ビギニングはMicrosoftパートナーとして、Azure Communication Services をはじめとするAzure / Microsoft 365 の導入・活用をサポートしています。

  • Azure Communication Servicesを使ったメール・SMS配信
  • Azure Functionsによる業務自動化
  • SharePoint / Teamsとの連携システム構築
  • 既存WordPressサイトのAzure移行

「自社でもAzureを使ってみたい」「既存システムをAzureに移行したい」など、お気軽にご相談ください。

お問い合わせはこちら