PHPメール送信ライブラリ SwiftMailer の日本用カスタマイズ

  • 19
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

1. RFCに従わないキャリアメールにメールを送れるように

デフォルトだと、foo..bar@docomo のように . が連続したり foo.@docomo のように . で終わるユーザー名だとエラーになり送れません。
それを回避する方法

参考
https://teratail.com/questions/28363

2. エンコードを iso-2022-jp にする

デフォルトだとutf-8になりますが、どうしてもiso-2022-jp でないと受け取れないクライアント向けに iso-2022-jp にエンコードする方法

参考
http://uzulla.hateblo.jp/entry/2015/03/20/235252

サンプル

別途 Sample/Email/LooseMimeGrammar.php を作成しておく。

<?php

use Sample\Email\LooseMimeGrammar;

\Swift::init(
        function () {
            // 日本語に関する初期設定 (ISO 2022)
            \Swift_DependencyContainer::getInstance()
                ->register('mime.qpheaderencoder')
                ->asAliasOf('mime.base64headerencoder');
            \Swift_Preferences::getInstance()->setCharset('iso-2022-jp');

            // RFC違反のアドレスにメール送る設定
            // @link https://teratail.com/questions/28363
            \Swift_DependencyContainer::getInstance()
                ->register('mime.grammar')
                ->asSharedInstanceOf(LooseMimeGrammar::class);
        }
    );


// SMTP サーバーとの接続設定
/** @var \Swift_SmtpTransport $transport */
$transport = \Swift_SmtpTransport::newInstance($host, $port);

/** @var \Swift_Mailer $mailer */
$mailer    = \Swift_Mailer::newInstance($transport);

// メールの作成
/** @var \Swift_Message $message */
$message = \Swift_Message::newInstance()
    ->setCharset('iso-2022-jp')
    ->setEncoder(\Swift_Encoding::get7BitEncoding())
    ->setSubject($subject)
    ->setFrom($from)
    ->setTo($to)
    ->setBody($body);

// 送信
$result = $mailer->send($message);