Posted at

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

More than 3 years have passed since last update.


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);