【问题标题】:Sending base64 emails with SWIFTMAIL使用 SWIFTMAIL 发送 base64 电子邮件
【发布时间】:2014-04-11 09:23:05
【问题描述】:

我只是想用 base64 编码我的多部分电子邮件并通过 swiftmail 发送。这是我到目前为止的代码:

$message = Swift_Message::newInstance("Email Template Test")
    ->setBoundary($boundary)
    ->setFrom(array('no-reply@domain.net' => 'Mailer Service'))
    ->setTo(array("a@d.com","a@b.com"))
    ->setBody($plaintext)
    ->addPart($htmlmail,"text/html");

$headers = $message->getHeaders();
$headers->addTextHeader('Content-Transfer-Encoding','base64');

$contenttype = $message->getHeaders()->get('Content-Type');
$contenttype->setValue('multipart/alternative');

据我从文档中看到的(我觉得不太清楚),Content-Transfer-Encoding 标头是一个文本标头,所以我应该可以像上面那样设置它。在此之前,我运行了所有当前标头的输出,Content-Transfer-Encoding 没有在其中列出,因此需要设置它。因此,为什么在上面的代码中我试图设置它。

输出很好,我收到了电子邮件,它们可以工作,但是当我查看源代码时,它们没有被编码。我尝试过使用上述相同的代码,但将$plaintext 更改为base64_encode($plaintext),但刚刚收到编码消息。怎么弄的>

【问题讨论】:

    标签: php swiftmailer


    【解决方案1】:

    version 5.4你可以设置编码器。否则Swift_Message 将使用本机编码器对消息进行编码。

    $message = \Swift_Message::newInstance("Email Template Test");
    $message->setEncoder(\Swift_Encoding::getBase64Encoding());
    //...
    

    另外还有一个带有编码的bug (as of version 4 and 5)addPartMimePart 不会从原始消息继承编码。 为此,您需要手动创建 MimePart 并将其附加到原始消息中。

    $part = \Swift_MimePart::newInstance();
    $part->setEncoder($message->getEncoder());
    $part->setBody($htmlmail, 'text/html');
    $message->attach($part);
    

    这将自动添加Content-Type: multipart/alternative; boundary=****、边界charsetContent-Transfer-Encoding: base64标头信息。

    结果:

    var_dump($message->toString());
    
    string 'Message-ID: <2f48c04910b97f730834e92f268d3410@example.com>
    Date: Thu, 14 Jan 2016 20:45:30 +0000
    Subject: Email Template Test
    From: Mailer Service <no-reply@domain.net>
    To: a@d.com, a@b.com
    MIME-Version: 1.0
    Content-Type: multipart/alternative;
     boundary="_=_swift_v4_1452804330_b0a47ad936ba98d2f513294958a235d0_=_"
    
    
    --_=_swift_v4_1452804330_b0a47ad936ba98d2f513294958a235d0_=_
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: base64
    
    VGhpcyBpcyBhbiBodG1sIG1lc3NhZ2U=
    
    --_=_swift_v4_1452804330_b0a47ad936ba98d2f513294958a235d0_=_
    Content-Type: text/html; charset=utf-8
    Content-Transfer-Encoding: base64
    
    VGhpcyBpcyBhIHRleHQgbWVzc2FnZQ==
    
    --_=_swift_v4_1452804330_b0a47ad936ba98d2f513294958a235d0_=_--
    ' (length=751)
    

    SwiftMailer 6

    在 swiftmailer 6 中 Swift_Encoding class and ::newInstance() methods were removed.

    \Swift_Encoding::getBase64Encoding()的原用法,看起来像

    public static function getBase64Encoding()
    {
        return self::_lookup('mime.base64contentencoder');
    }
    
    
    private static function _lookup($key)
    {
        return Swift_DependencyContainer::getInstance()->lookup($key);
    }
    

    因此,您可以直接从Swift_DependencyContainer 调用mime.base64contentencoder

    $encoder = \Swift_DependencyContainer::getInstance()->lookup('mime.base64contentencoder');
    
    $message = (new \Swift_Message("Email Template Test"))
        ->setEncoder($encoder);
    

    【讨论】:

      【解决方案2】:

      我最近只是想自己做这个,并且

      \Swift_Encoding::getBase64Encoding()
      

      显然已被删除,所以我不得不像这样使用 Swift_DependencyContainer:

      $message->setEncoder(\Swift_DependencyContainer::getInstance()->lookup('mime.base64contentencoder'));
      

      现在 swiftmailer 将使用 base64 作为内容传输编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 2018-07-04
        • 2016-10-30
        • 2013-04-20
        • 2023-03-30
        • 2016-04-17
        • 2017-12-07
        相关资源
        最近更新 更多