Как правильно встраивать изображения PHPMailer в электронное письмо в формате HTML? - PullRequest
1 голос
/ 21 июля 2009

Я хочу отправить информационный бюллетень с PHPMAiler. Информационный бюллетень работает, но мне интересно, есть ли лучший способ сделать это.

Что у меня есть.

  1. HTML-страница
  2. Изображения

Теперь мой код выглядит следующим образом

$mail = new PHPMailer();

//Adding the body
$body = file_get_contents('template/index.htm');

$mail->Subject = "PHPMailer Test Subject via mail(), basic";

$mail->AltBody = "To view this message, please use an HTML compatible email viewer!";


$mail->SetFrom('xxxxxxx', 'xxxxxxxxxx');

$address = ".......@gmail.com";
$mail->AddAddress($address, "xxxxxxx");

$mail->AddEmbeddedImage("template/images/bullet_point.gif","1");
$mail->AddEmbeddedImage("template/images/template_1_01.gif","2");
$mail->AddEmbeddedImage("template/images/template_1_03.gif","3");


$mail->MsgHTML($body);

if(!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

Я использую file_get_contents для получения html-страницы и AddEmbeddedImage для встраивания изображений, теперь есть ли способ передать только HTML-страницу в PHPMailer и что PHP Mailer будет встраивать эти изображения автоматически?

1 Ответ

1 голос
/ 21 июля 2009

Я не думаю, что вы пытаетесь сделать это возможно (автоматическое добавление необходимых изображений) с PHPMailer "с нуля".

Может быть, вы могли бы разобрать HTML, чтобы получить список изображений, на которые он ссылается? Есть как минимум 2 способа сделать это:

  • с использованием rexexes; как правило, не лучший способ сделать что-то, если вы пытаетесь извлечь данные из HTML - и вы ^^
  • другим (вероятно) лучшим способом было бы использовать DOMDocument::loadHTML для содержимого HTML, загруженного из вашего файла (вывод file_get_contents), и работать с методами DOMDocument (и, почему бы и нет, DOMXPath?)

Чтобы получить изображения, я полагаю, в вашем электронном письме есть теги <img> с атрибутами src; цель состоит в том, чтобы найти значения этих; -)

Получив путь к списку изображений, вы выполняете их итерацию и вызываете $mail->AddEmbeddedImage для каждого из них.

Полагаю, это сработало бы (хотя и не пробовал, но не понимаю, почему) .

В качестве дополнительного примечания другим способом было бы хранить изображения на вашем сервере в течение нескольких дней / недель / месяцев, а не включать их в почту; это уменьшит размер писем, что означает:

  • меньше пропускной способности, потраченной на вашей стороне (если вы отправляете много писем, это может составить большую часть пропускной способности)
  • меньше тратится на каждую сторону ваших клиентов - что тоже хорошо для них ^^
  • меньше места используется на жестких дисках; -)

И чтобы убедиться, что изображения не будут удалены / заменены на сервере раньше, чем через пару недель / месяц, вы можете создать новый каталог для каждого информационного бюллетеня, содержащего его изображения, - и время от времени удаляйте каталоги старше X дней.

...