13

请原谅我的 php,但我使用 Swiftmailer 从客户网站发送电子邮件。他们要求添加一两个图像作为签名等,因此请查看此处的 swiftmailer 规范

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

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

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

或像这样(分两步)

$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->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')
;
4

5 回答 5

10

经过所有的奔跑,我找到了一个替代解决方案。Swiftmailer 允许使用 2 种方法来执行相同的操作。

一个是 embed() 函数

另一个是 attach() 函数

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

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

它工作100%

于 2013-03-21T03:34:32.720 回答
8

没有一个答案真的对我有用。我必须使用 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 客户端......)。例如,使用 Swift_Attachment,内联图像显示在 gmail 中,但在某些 Web 客户端中不显示。使用 Swift_Image,它无处不在。

于 2016-06-09T08:31:48.987 回答
6

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

相反,查看“原始”(Gmail:显示原始)我发现 swiftmailer 省略了在附件中添加 2 个标题,即:

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

ABC123 是我们必须放入要显示内联的正文中的 cid:

所以多亏了这个问题:我找到了为 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');
于 2016-05-19T23:54:17.543 回答
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');
于 2020-07-20T15:25:30.753 回答
0

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

<img src="<?php echo $message->embed(public_path().'/img/backend/name.jpg); ?>">
于 2018-01-16T06:54:02.457 回答