Отправка письма с вложением | Webmaster

<?php

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {

    $file = $path.$filename;

    $file_size = filesize($file);

    $handle = fopen($file, «r»);

    $content = fread($handle, $file_size);

    fclose($handle);

    $content = chunk_split(base64_encode($content));

    $uid = md5(uniqid(time()));

    $name = basename($file);

    $header = «From: «.$from_name.» <«.$from_mail.»>\r\n»;

    $header .= «Reply-To: «.$replyto.»\r\n»;

    $header .= «MIME-Version: 1.0\r\n»;

    $header .= «Content-Type: multipart/mixed; boundary=\»».$uid.»\»\r\n\r\n»;

    $header .= «This is a multi-part message in MIME format.\r\n»;

    $header .= «—«.$uid.»\r\n»;

    $header .= «Content-type:text/plain; charset=iso-8859-1\r\n»;

    $header .= «Content-Transfer-Encoding: 7bit\r\n\r\n»;

    $header .= $message.»\r\n\r\n»;

    $header .= «—«.$uid.»\r\n»;

    $header .= «Content-Type: application/octet-stream; name=\»».$filename.»\»\r\n»; // use different content types here

    $header .= «Content-Transfer-Encoding: base64\r\n»;

    $header .= «Content-Disposition: attachment; filename=\»».$filename.»\»\r\n\r\n»;

    $header .= $content.»\r\n\r\n»;

    $header .= «—«.$uid.»—«;

    if (mail($mailto, $subject, «», $header)) {

        echo «Письмо отправлено»; // or use booleans here

    } else {

        echo «Ошибка отправки»;

    }

}

 

 

$to_mail = ‘[email protected]’; // кому письмо

$my_file = ‘attachment.zip’; //имя фала

$my_path = $_SERVER[‘DOCUMENT_ROOT’].’/files/’; //путь до папки с файлом

$my_name = ‘Имя отправителя’;

$my_mail = ‘[email protected]’; // email отправителя

$my_replyto = »; // копия

$my_subject = ‘Письмо с вложением.’;

$my_message = ‘Привет,\r\nУ меня получилось отправить письмо с вложением прямо из PHP)))’;

mail_attachment($my_file, $my_path, $to_mail, $my_mail, $my_name, $my_replyto, $my_subject, $my_message);

?>

mraak.ru

Как отправить электронное письмо с вложениями из формы PHP? — php

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

HTML

В вашем HTML есть только два требования для отправки вложений файлов.

  • Ваша форма должна иметь этот атрибут: enctype="multipart/form-data"
  • Вам нужно хотя бы одно поле типа <input type="file" name="examplefile">. Это позволяет пользователю просматривать прикрепленный файл.

Если у вас есть оба этих параметра, браузер загрузит все прикрепленные файлы вместе с формой отправки.

Примечание: они сохраняются как временные файлы на сервере. В этом примере мы возьмем их данные и отправим их по электронной почте, но если вы переместите временные файлы в постоянное место, вы просто создали форму для загрузки файлов.

Формат электронной почты MIME

Этот учебник отлично подходит для понимания того, как создать электронную почту MIME (которая может содержать содержимое HTML, текстовую версию, вложения, и т.д.) в PHP. Я использовал его в качестве отправной точки.

В принципе, вы делаете три вещи:

  • Объявите фронт, что это письмо будет содержать в себе несколько типов контента
  • Объявите строку текста, которую вы будете использовать для разделения различных разделов
  • Определите каждый раздел и вставьте соответствующий контент. В случае вложений файлов вы должны указать тип и закодировать их в ASCII.
    • Каждый раздел будет иметь content-type, например image/jpg или application/pdf.. Более подробную информацию можно найти здесь. (Мой пример script извлекает эту информацию из каждого файла с помощью встроенных функций PHP.)

PHP

После отправки формы любые файлы, загруженные браузером (см. раздел HTML), будут доступны через переменную $_FILES, которая содержит «Ассоциативный массив элементов, загруженных в текущий script через HTTP POST метод».

документация на $_FILES отвратительна, но после загрузки вы можете запустить print_r($_FILES), чтобы увидеть, как она работает. Он выведет что-то вроде этого:

Array ( [examplefile] => Array ( [name] => your_filename.txt 
[type] => text/plain [tmp_name] => 
C:\path\to\tmp\file\something.tmp [error] => 0 [size] => 200 ) ) 

Затем вы можете получить данные в связанном временном файле с помощью file_get_contents($_FILES['examplefile']['tmp_name']).

Бок

qaru.site

Как грамотно отправлять почту из скриптов (в частности — на PHP) / Habr

Первая часть текста взята из инструкции хостинг-провайдера Netangels. Вторая — авторская.

Отправка почты из скриптов на PHP — вещь, которая очень часто встречается в веб-приложениях. К сожалению, как показывает практика, большинство разработчиков используют эту функцию неправильно, допуская в своих скриптах одни и те же ошибки. В результате оказывается, что письмо получателю пришло в неверной кодировке, просто не дошло, или дошло, но отображается совсем не так, как этого хотел автор.

Для того, чтобы быть уверенным, что ваше сообщение отправляется действительно верно, необходимо иметь по меньшей мере базовые представления о формате почтового сообщения. Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются RFC 822 (описывает формат передачи простого текста на английском языке) и RFC 2045 и далее (описывает расширения этого формата для передачи произвольных данных).

Формат почтового сообщения


Ниже приведен самый простой пример текстового сообщения, составленного в соответствии с приведенными выше стандартами и готового к отправке.
From: =?windows-1251?b?0J7RgtC/0YDQsNCy0LjRgtC10LvRjD89?= <[email protected]>
To:  =?windows-1251?b?0J/QvtC70YPRh9Cw0YLQtdC70Yw/PQ==?= <[email protected]>
Subject: =?windows-1251?b?0Y3RgtC+INGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjz89?=
Content-Type: text/plain; charset=«windows-1251»
Content-Transfer-Encoding: 8bit

Это почтовое сообщение на русском языке
Содержит несколько строк

Именно в таком формате клиент для отправки почты (MS Outlook или Mozilla Thunderbird) подготавливает сообщение, а затем отправляет его получателю (кстати, большинство почтовых клиентов позволяют просмотреть исходный код сообщения, в Mozilla Thunderbird, например, для этого служит комбинация клавиш Ctrl+U). Задача нашего скрипта языке PHP — добиться точно такого же формата письма.

Как видно из приведенного выше примера, электронное письмо содержит две части: в одной (верхней) размещаются заголовки, а в другой (нижней) собствено текст письма. Отделены эти части друг от друга пустой строкой. Заголовки состоят из строк, в которых содержится тема письма (Subject), имя и адрес отправителя (From), получателя (To) и другая информация. В самом простом случае каждая строка содержит пару «ИмяЗаголовка: ЗначениеЗаголовка». Особенно необходимо подчеркнуть, что, согласно стандартам, в заголовках ни при каких обстоятельствах не должны содержаться символы, не присутствующие в ASCII таблице — латинские буквы, цифры, знаки пунктуации и псевдографики.

Грамотное использование русских символов в заголовках почтового сообщения


Итак, в явном виде русский текст в заголовке присутствовать не должен, поэтому для того, чтобы включить его туда, этот текст предварительно нужно закодировать. Стандарты описывают способ кодирования «запрещенных» символов. Общий формат выглядит так:
=? кодировка? способ кодирования? закодированный текст?=
Кодировка может быть любой из списка «windows-1251», «koi8-r», «utf-8» и т.д. Во всех случаях, как правило, кодировка сообщения будет совпадать с кодировкой в которой работает сайт. То есть в большинстве случаев это будет «windows-1251», реже — «utf-8».

Способ кодирования указывает на то, каким именно образом русские символы будут преобразованы в безопасный набор. Способа определяется два: так называемый «Q-encoding» (обозначается одной буквой «Q») и «Base64» (обозначается одной буквой «B»).

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

$subject = «=?windows-1251?b?». base64_encode($_POST[«subject»]). «?=»;
Здесь предполагается, что в переменной $_POST[«subject»] у вас содержится тема почтового сообщения, записанная по-русски в кодировке windows-1251.

Адрес отправителя или получателя может быть записан в виде «[email protected]» или в виде «Имя пользователя <[email protected]>». Во втором случае имя пользователя необходимо преобразовать так же, как в предыдущем примере. Ниже приведен пример, в котором предполагается, что в переменной $_POST[«username»] содержится имя пользователя, а в переменной $_POST[«email»] его электронный адрес:

$sender = «=?windows-1251?B?». base64_encode($_POST[«username»]). «?= <«. $_POST[«email»]. «>»;

Content-type: multipart/???


С этим заголовком знаком любой разработчик, которому доводилось решать проблемы отправки писем с вложениями или HTML письмами. И зачастую письма, сформированные без использования библиотек вроде PEAR::Mail_mime отображаются не очень корректно. Практика показывает, что если при формировании письма жестко придерживаться стандарта, которы задается в RFC (в частности — RFC 2046) — подавляющее большинство клиентских программ (включая таких любителей придерживаться стандартов, как Mozilla Thunderbird) отображает письмо корректно. Далее мы будем исходить из того, что читатель этого документа представляет себе основной синтаксис команд и понимает, что таке boundary и почему необходимо указывать Content-type для каждой из частей письма. Постараемся отметить основные ошибки.

Ошибка первая — неверный subtype


Тип multipart имеет три субтипа — mixed, alternative и related, которые используются синтаксически одинаково, но имеют разное предназначение
  • mixed — используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма — сообщение с вложением.
    alternative — используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО — например текстовая и HTML версия одного и того же письма.
    related — используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Яркий пример — HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов (вида <img src=«cid:image»>).
    Помните и применяйте по назначению.

    Ошибка вторая — неверный порядок частей

    Порядок частей, в котором они указаны в письме, зачастую имеет ключевое значения для того, как будет отображаться сообщение у клиента.
    • mixed — порядок частей для наших задач не имеет значения.
      alternative — части должны быть расставлены по порядку, от более простых к более сложным. RFC регламентирует процесс выбора одной из версий письма клиентом пользователя примерно так: «В общем случае, почтовый клиент должен отображать последнюю доступную ему версию документа». Т.е. при формировании текстовой и HTML-версий письма необходимо вперед поставить текстовую.
      related — первой в очереди должна идти основная часть (HTML документ, например). Следом — все остальные. По большому счету, стандартом регламентирован специальный параметр «start», который указывает на основную часть документа, но этим лучше не злоупотреблять.

      Ошибка третья — выбор только одного субтипа

      Зачастую разработчик, формирующий из программы письмо забывает, что любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Вот как примерно может выглядеть структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:
      • Content-type: multipart/mixed
        • Content-type: multipart/alternative
          • Content-type: text/plain
            Content-type: multipart/related
            • Content-type: text/html
              Content-type: image/jpeg
              Content-type: image/jpeg

            Content-type: application/msword

          И напоследок — еще пара рекомендаций

          • Всегда делайте text/plain вариант письма — никто не может предсказать, как именно будут читать Ваше письмо.
            Не ленитесь и придерживайтесь стандартов.
            Если интересно — http://people.dsv.su.se/~jpalme/ietf/mhtml-test/mhtml.html тут есть несколько примеров.

habr.com