使用SwiftMailer的text / html和text / plain附件

时间:2016-10-24 08:24:41

标签: php email swiftmailer

我正在使用swiftmailer 发送电子邮件,我想有相同的附件:   * HTML版本(text/html)作为内联图片(cid)   *文字版本(text/plain)作为附件

我在Ubuntu上使用Mozilla Thunderbird 45.3.0测试电子邮件。

我一直在玩->setBody->addPart->embed->attach方法, 但我总是打破其中一个版本(即以纯文本形式收发邮件,或者我将邮件视为HTML或文本)。

我的测试代码看起来像(当然有有效的SMTP地址和文件路径):

function swiftMail() {
    require_once './vendor/swiftmailer/swiftmailer/lib/swift_required.php';
    //Create the Transport
    $transport = Swift_SmtpTransport::newInstance('smtp.mail.com', 25);
    //Create the Mailer using your created Transport
    $mailer = Swift_Mailer::newInstance($transport);
    // Create the message
    $message = Swift_Message::newInstance()
        // Give the message a subject
        ->setSubject('SwiftMailer test // ' . uniqid('', true))
        // Set the From address with an associative array
        ->setFrom(array('first.name@mail.com' => 'Me'))
        // Set the To addresses with an associative array
        ->setTo(array('first.name@mail.com' => 'Me'));

    // attach the image as attachment
    $message->attach(Swift_Attachment::fromPath('./path/to/file.png')->setFilename('cool_image.png'));

    // set the email's body as plain text
    $message->setBody('My amazing body in plain text', 'text/plain');

    // add the email's HTML part to the message
    $message->addPart(
        '<!doctype html>' .
        '<html>' .
        ' <head><meta charset="UTF-8"></head>' .
        ' <body>' .
        '  Here is an image <br />'.
        '  <img src="' . $message->embed(Swift_Image::fromPath('./path/to/file.png')->setFilename('inline_cool_image.png')) . '" alt="Inline Image" /><br />' .
        '  Rest of message' .
        ' </body>' .
        '</html>',
        'text/html' // Mark the content-type as HTML
    );

    // send the message
    if (!$mailer->send($message, $failures))
    {
        echo "Failures:";
        print_r($failures);
    }
}

以下代码导致两个附件(可能没问题)并且只有纯文本版本可用(这不是很好)。

有没有办法让附件用作内联HTML图像源和纯文本电子邮件中的标准附件?

2 个答案:

答案 0 :(得分:4)

我遇到了完全相同的问题,并且能够通过使用addPart()而不是setBody()添加明文部分来解决此问题。

$message->addPart('My amazing body in plain text', 'text/plain');

根据您的示例,它将是:

function swiftMail() {
    require_once './vendor/swiftmailer/swiftmailer/lib/swift_required.php';
    //Create the Transport
    $transport = Swift_SmtpTransport::newInstance('smtp.mail.com', 25);
    //Create the Mailer using your created Transport
    $mailer = Swift_Mailer::newInstance($transport);
    // Create the message
    $message = Swift_Message::newInstance()
        // Give the message a subject
        ->setSubject('SwiftMailer test // ' . uniqid('', true))
        // Set the From address with an associative array
        ->setFrom(array('first.name@mail.com' => 'Me'))
        // Set the To addresses with an associative array
        ->setTo(array('first.name@mail.com' => 'Me'));

    // attach the image as attachment
    $message->attach(Swift_Attachment::fromPath('./path/to/file.png')->setFilename('cool_image.png'));

    // set the email's body as plain text
    $message->addPart('My amazing body in plain text', 'text/plain');

    // add the email's HTML part to the message
    $message->addPart(
        '<!doctype html>' .
        '<html>' .
        ' <head><meta charset="UTF-8"></head>' .
        ' <body>' .
        '  Here is an image <br />'.
        '  <img src="' . $message->embed(Swift_Image::fromPath('./path/to/file.png')->setFilename('inline_cool_image.png')) . '" alt="Inline Image" /><br />' .
        '  Rest of message' .
        ' </body>' .
        '</html>',
        'text/html' // Mark the content-type as HTML
    );

    // send the message
    if (!$mailer->send($message, $failures))
    {
        echo "Failures:";
        print_r($failures);
    }
}

使用SwiftMailer版本5.4.4,MacOS上的Thunderbird 45.5.0和Gmail网络界面进行测试。

答案 1 :(得分:0)

尝试将->setDisposition('inline')添加到Swift_Image

Swift_Image::fromPath('./path/to/file.png')->setFilename('inline_cool_image.png')->setDisposition('inline')