SwiftMailとISO-2022-JPとワードラップ

SwiftMailでISO-2022-JPな日本語メールを送信する際に、次のような問題が生じる場合があります。

  • 文字化け
  • ワードラップ

Swift MailerでISO-2022-JPなメールが送れなくなっていた件について - polidog lab++」を 参考にさせて頂きました。

検証コード

class Message extends \Swift_Message
{
    public static function newInstance($subject = null, $body = null, $contentType = null, $charset = null)
    {
        return new self($subject, $body, $contentType, $charset);
    }

    public function setSubject($subject)
    {
        $subject = $this->_convertString($subject);
        parent::setSubject($subject);
        return $this;
    }

    protected function _convertString($string)
    {
        $charset = strtolower($this->getCharset());
        if (!in_array($charset, array('utf-8','iso-8859-1', ''))) {
            $string = mb_convert_encoding($string, $charset, 'utf-8');
        }
        return $string;
    }
}

class TestSwiftMailCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this->setName('sample:swiftmail');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $subject = $body = 'あいうえおかきくけこさしすせそたちつてとABC日本語 ワードラップされる?';

        $message = Message::newInstance()
            ->setCharset('iso-2022-jp')
            ->setEncoder(\Swift_Encoding::get7BitEncoding())
            ->setFrom(array('...'))
            ->setTo('...')
            ->setSubject($subject)
            ->setMaxLineLength(0)    // 折り返しはココで調整
            ->setBody($body);

        $container = $this->getContainer();
        $mailer = $container->get('mailer');
        $mailer->send($message);

        $spool = $mailer->getTransport()->getSpool();
        $transport = $container->get('swiftmailer.transport.real');
        $spool->flushQueue($transport);
    }
}