将内嵌图像添加到使用swiftmailer发送的消息中

时间:2013-03-21 00:51:09

标签: php swiftmailer

请原谅我的PHP但是,我使用Swiftmailer从客户网站发送电子邮件。他们要求添加一个或两个图像作为签名等,所以看看这里的swiftmailer规范

http://swiftmailer.org/docs/messages.html

他们建议添加像这样的内嵌图像

$message->embed(Swift_Image::fromPath('http://site.tld/image here'))

或像这样(分2步)

$cid = $message->embed(Swift_Image::fromPath('image here'));

然后在电子邮件正文部分添加

<img src="' . $cid . '" alt="Image" />'

两个步骤我都试过但无济于事。当我点击发送邮件按钮时,我收到此错误,我不知道该怎么做。

Call to a member function embed() on a non-object in /home/content/78/5152878/html/4testing/erase/ask-doc-proc2.php on line 89

我添加到我已经运行的代码和电子邮件中的唯一内容是直接来自文档页面中示例的图像代码。此错误显然会阻止发送电子邮件。如果我删除它然后它发送电子邮件很好。由于我需要为此添加图像,

非常感谢任何帮助。谢谢

编辑:这是构建和发送电子邮件的部分 $ cid = $ message-&gt; embed(Swift_EmbeddedFile :: fromPath('http://myforecyte.com/dev/pic.jpg'));

->setTo( $docEmail)

->setBody("Hello" . "\r\n\r\n" .  
$fullName . " has visited MyForeCYTE.com. Upon their visit they have requested to learn more about the test. \r\n\r\n" . 
"Please visit www.ClarityWomensHealth.com to find out more about The ForeCYTE Breast Health Test, or call our customer support line at 1 (877) 722-6339.  \r\n\r\n" .
"We look forward to hearing from you. \r\n\r\n" .
"Thank You," , 'text/plain')

->addPart("Hello" . ",</b><br/><br/>" . 
"<b>" . $fullName . "</b> has visited www.MyForeCYTE.com. Upon their visit they have requested to learn more about the test. <br/>" . 
"Please visit www.ClarityWomensHealth.com to find out more about The ForeCYTE Breast Health Test, or call our customer support line at 1 (877) 722-6339.<br/> " . 
"We look forward to hearing from you. <br/><br/><br/>" . "<img src='" . $cid. "' alt='pic'/>" .

"Thank you " , 'text/html')
;

5 个答案:

答案 0 :(得分:10)

在所有跑来跑去之后,我找到了另一种解决方案。 Swiftmailer允许两种方法执行相同的操作。

一个是embed()函数

,另一个是attach()函数

所以对于上面的代码,我删除了“embed()”,因为它不适用于我并在下面添加了这两行并且它可以正常工作

    ->attach(Swift_Attachment::fromPath('path to image here.jpg')  
->setDisposition('inline'));

它100%工作

答案 1 :(得分:4)

接受的答案不起作用(测试版本:5.4.2)。 (我的工作但可以完善)

相反,查看&#34; Original&#34; (Gmail:Show Original)我发现swiftmailer省略了向附件中添加2个标题,即:

Content-ID: <ABC123>
X-Attachment-Id: ABC123

ABC123是我们要放入体内的cid,我们希望显示内联:

感谢this question:我找到了为swiftmailer修复它的方法(甚至可以反对swiftmailer文档,但它可以工作,而他们没有)

这是最终(丑陋)代码:

$attachment = Swift_Attachment::fromPath('image.jpg')->setDisposition('inline');
$attachment->getHeaders()->addTextHeader('Content-ID', '<ABC123>');
$attachment->getHeaders()->addTextHeader('X-Attachment-Id', 'ABC123');
$cid = $message->embed($attachment);
$img = '<img src="cid:ABC123"/>';
$html = "
<html>
<head>
</head>
<body>
$img
</body>
</html>
";
$message->setBody($html, 'text/html');

答案 2 :(得分:4)

这些答案都没有真正对我有用。我必须使用CID包含内嵌图像。我必须做的,让它工作:

$attachment = Swift_Image::newInstance($data, $filename, $mimeType)
    ->setDisposition('inline');

$cid = $message->embed($attachment); // Generates "cid:something"

重要的部分是使用Swift_Image类。那么html中的图像应该是:

<img src="cid:something" ... />

我认为这个解决方案可以在不使用swiftmailer(版本5.4.2)的情况下工作。这正是文档所说的。

如果内嵌图像有效,请记住测试多个电子邮件客户端(gmail,thunderbird,apple mail,Web clients ...)。例如,使用Swift_Attachment,内联图像显示在gmail中,但在某些Web客户端中没有显示。使用Swift_Image,它可以在任何地方使用。

答案 3 :(得分:1)

我知道这是一个老问题(答案已被接受),但是对于有相同问题的任何人,Swift_Image::fromPath($image_path)方法都希望图像路径是本地的(文件系统路径):

Swift_Image::fromPath("/local/path/to/image.jpg");
// Local path = great success

因此,如果您的图像路径是外部的(以https://等开头,则以下操作将失败:

Swift_Image::fromPath("https://external.path/to/image.jpg");
// External path = epic fail

对于外部图像,您应该使用:

# Load the image file
$data = file_get_contents($image_path);
# Get the filename
$filename = explode("?",basename($image_path))[0];
# Get the mime type
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->buffer($buffer);
# Load the image file
$image_file = new \Swift_Image($data, $filename, $mime_type);
# Set the disposition to inline
$image_file->setDisposition('inline');

答案 4 :(得分:0)

如果您使用laravel,请尝试在路径的开头添加public_path(),例如:

<img src="<?php echo $message->embed(public_path().'/img/backend/name.jpg); ?>">