Inkognitoss
@Inkognitoss
Full-stack разработчик.

Как отправить строку xml на почту как файл file.xml (PHP)?

Проблема следующая:
Есть строковое значение, например
$xml ='<?xml version="1.0" encoding="WINDOWS-1251" ?>';
$xml .='<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">';
$xml .='<xsl:template match="/">';
#$xml .= и так далее....

хочу это отправить на почту так, чтобы это было вложенным фалом file.xml, желательно без создания промежуточного файла на сервере. Подскажите пожалуйста.
  • Вопрос задан
  • 798 просмотров
Решения вопроса 1
Inkognitoss
@Inkognitoss Автор вопроса
Full-stack разработчик.
Вообще, мне показалось, что все в корне неверно поняли мой вопрос, хотя ответ Дастана теплее.
Ответ будет таков:
Т.к. строка с XML у нас уже есть, осталось ее только присобачить к письму как к вложение, о чем и был вопрос. Сделать это можно например так:

$HTML = '<b>Текст<b>';
       //$Наш кусок кода из вопроса
        $xml ='<?xml version="1.0" encoding="WINDOWS-1251" ?>';
        $xml .='<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">';
        $xml .='<xsl:template match="/">';
      #$xml .= и так далее.... Или же иной XML формирующий процесс.


        $filename = 'file.xml'; //Такое имя файла увидит пользователь при получении.
        $subject = 'Ваш отчет, cударъ!';

        $boundary = "--".md5(uniqid(time())); //Разделитель, который нужно будет использовать чтобы разделять разные типы контента в сообщении

        //Напишем в хидере, что наше сообщение multipart (мол разный контент там будет)
        $headers = "MIME-Version: 1.0;\r\n";
        $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";

         //Наш текст сообщения будет в перовой части сообщения в формате Html (не забываем про разделитель)
        $part1 = "--$boundary\r\n";
        $part1 .= "Content-Type: text/html; charset=windows-1251\r\n";
        $part1 .= "Content-Transfer-Encoding: base64\r\n";
        $part1 .= "\r\n";
        $part1 .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $HTML))); //контент кодируется в base64, о чем мы писали в Content-Transfer-Encoding, а также мы еще перед этим нашему сообщению сменили кодировку на windows-1251

        //И самое интересное, мы ставим разделитель и помещаем контент, содержащий вложение, а также указываем имя вложения. А дальше всё как с обычным текстом, разница тут только в том, что такой контент не будет так просто отображен в почтовой программе, а отобразится как вложение, и чтобы его просмотреть, придется отдельно загрузить файл.
        $part2 = "\r\n--$boundary\r\n";
        $part2 .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
        $part2 .= "Content-Transfer-Encoding: base64\r\n";
        $part2 .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
        $part2 .= "\r\n";
        $part2 .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $xml)));
        $part2 .= "\r\n--$boundary--\r\n";

        //После всего этого мы можем отправить всё это на почту обычной функцией mail (php)
        $message = $part1.$part2

        mail(''example@site.com",$subject, $message ,$headers);


Всё должно получиться. Если у кого-то будут замечания по собственному решению, то прошу. Всегда радуюсь, когда указывают на ошибки, особенно если аргументируют.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dastiw1
@dastiw1
Frontend Developer
Попробуй так
$mail->AddStringAttachment($xml, "attachment.xml",'base64','application/xml');
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы