Я закончил сборку сообщения MIME самостоятельно, используя этот тип шаблона, где каждое поле заменяется переменной TEMPLATE_<name>
:
From: TEMPLATE_FROM_ADDRESS
MIME-Version: 1.0
To: TEMPLATE_TO_ADDRESS
Subject: TEMPLATE_SUBJECT
Content-Type: multipart/mixed; boundary="080107000800000609090108"
This is a message with multiple parts in MIME format.
--080107000800000609090108
Content-Type: text/plain
TEMPLATE_BODY
--080107000800000609090108
Content-Type: application/octet-stream;name="TEMPLATE_ATTACH_FILENAME"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="TEMPLATE_ATTACH_FILENAME"
TEMPLATE_ATTACH_CONTENT
--080107000800000609090108
Тогда создание окончательного сообщения довольно просто с помощью str_replace
:
$content = file_get_contents("Template.eml");
$content = str_replace("TEMPLATE_FROM_ADDRESS", $fromEmail, $content);
$content = str_replace("TEMPLATE_TO_ADDRESS", $toEmail, $content);
// etc. for each template parameter
// Also don't forget to base64_encode the attachment content;
$content = str_replace("TEMPLATE_ATTACH_CONTENT", base64_encode($attachContent), $content);
Дополнительная информация о вложении файла в этом сообщении: Имя вложения и расширение файла не работают в электронной почте * .eml
Редактировать (2018): Поскольку этот ответ был написан, кажется, что он был скопирован и вставлен немного везде, в частности, в шаблон.Чтобы избежать конфликта с другими данными MIME, необходимо убедиться, что граница "080107000800000609090108" уникальна - это строка случайных символов длиной не более 70 символов.