2013-03-21 1 views
9

Пожалуйста, извините мой php, но я использую Swiftmailer для отправки писем с веб-сайта клиентов. Они просили, чтобы добавить изображение или два, как подписи и т.д., и поэтому, глядя на 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" />' 

Оба этапа ive пытались, но безрезультатно. Когда я нажимаю кнопку отправки электронной почты, я получаю эту ошибку, которую я не знаю, что с этим делать.

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 

Единственное, что я добавил в свой уже рабочий код и адрес электронной почты, был код изображения непосредственно из примера на страницах документов. Эта ошибка, очевидно, запрещает отправку электронной почты. если я удалю его, он отправит письма в порядке. Так как мне нужно добавить изображение,

Любая помощь очень ценится. Спасибо

редактировать: это та часть, где построена электронная почта и послал $ чид = $ Сообщение-> встраивать (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') 
; 
+0

Так как вы не показывать имя файла для 'here' изображения, это немного трудно сказать, если это правильно отформатирована. –

+0

Можете ли вы показать полный код, где вы строите сообщение? – jeroen

+0

Что находится в 'строке 89' файла' ask-doc-proc2.php'? –

ответ

9

В конце концов, я нашел альтернативное решение. Swiftmailer позволяет использовать 2 метода для выполнения одного и того же.

одна функция встраивания()

и другая функция

присоединять(), так что код выше, я удалил «встраивание()», так как он не работал я и добавил эти 2 строки ниже, и она работает

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

, и она работала на 100%

3

Принятый ответ не работает (версия испытываться: 5.4.2). (шахтные работы, но может быть усовершенствовали)

Вместо глядя внутрь "Original" (Gmail: Показать оригинал) Я обнаружил, что SwiftMailer является опуская добавление 2 заголовков к приспособлению, а именно:

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

ABC123 является чидом мы должны поставить в теле, где мы хотим рядное быть показаны:

Так благодаря 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'); 
+0

Это рабочее решение, большое спасибо за этот кусок кода! –

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" ... /> 

Я думаю, что это решение работает без делать что-то Hacky с Swiftmailer (версия 5.4.2.). Именно так написано в документации.

Не забудьте проверить несколько почтовых клиентов (gmail, thunderbird, apple mail, web clients ...), если работают встроенные изображения. Например, используя Swift_Attachment, встроенные изображения отображаются в gmail, но не у некоторых веб-клиентов. Используя Swift_Image, он работал везде.

0

Если вы используете Laravel, попробуйте добавить public_path() в начале пути, например:

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