Как отправить письмо с вложения на php?

3lettersОтправка письма с вложением задача по сложнейе чем просто от правка письма функцией . Я не буду расматривать создание форма отправки файла проверки, правельности введёных данных и наличия файла вложения (а также проверки его на размер и тд.). На воротом может быть много, но мы расмотри основу как собственно отправть письмо со вложением. Для отправки я превиду вам функцию отправки таких писем. Функция будет называться  kmail ().  У данной функции будет несколько аргументов:

1. $from — Отправитель письма. Смысл данной переменной мы рассмотрим ниже.
2. $to — Адрес электронной почты, куда необходимо отправить сообщение.
3. $subj — Тема письма.
4. $text — Текст сообщения.
5. $filename — имя файла (путь до файла), который необходимо отправить адресату. 

А вот и сама функция:

<!--r--> function kmail( $from, $to, $subj, $text, $filename) {
$f = fopen($filename,"rb");
$un = strtoupper(uniqid(time()));
$head = "From: $from\n";
$head .= "To: $to\n";
$head .= "Subject: $subj\n";
$head .= "X-Mailer: world-blog.ru\n";
$head .= "Reply-To: $from\n";
$head .= "Mime-Version: 1.0\n";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary=\"----------".$un."\"\n\n";
$zag = "------------".$un."\nContent-Type:text/html;\n";
$zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag .= "------------".$un."\n";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name=\"".basename($filename)."\"\n";
$zag .= "Content-Transfer-Encoding:base64\n";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename=\"".basename($filename)."\"\n\n";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";
return @mail("$to", "$subj", $zag, $head);
}
?&gt;

Внутри функции формируются 2 переменные $head и $zag. Но для начала мы открываем файл, который был передан функции. Далее создаем вспомогательную переменную $un, содержащую особый уникальный id, генерируемый функцией uniq_id (). Он будет использоваться для указания границ.

Формирование $head

Отправляя сообщение, мы должны указать служебную информацию в заголовках, поэтому мы формируем переменную $head, которая содержит в себе адрес отправителя ($from), тему письма ($subj) , адресата ($to), название программы отправителя (X-Mailer: world-blog.ru) и указываем тип контента. В отличие от предыдущего урока, в  Content-type указываем multipart/mixed. Это  говорит о том, что сообщение смешанное, т.е. помимо текста содержит в себе вложение.

Формированию $zag

$zag в нашем случае является телом сообщения, в котором содержится сообщения и собственно наше вложение в особой кодировке. Для начала создаем границу (———$un), после которой указываем новый тип контента Content-type: text/html и кодировку отправки Content-transfer-encoding:8bit. Далее следует переменная содержащая текст письма — $text.

Так как тело сообщения состоит не только из текста, но и из вложения, необходимы дополнительные манипуляции. Мы создаем вторую границу (———-$un), после которой следуют аттач. Content-type указываем application/octet-stream, имя name — $filename. Обязательно указываем Content-transfer-encoding: Base64 и сообщаем что далее следует аттач (Content-Disposition: attachment). Теперь открытый файл читаем в строку ( fread ($f,filesize ($filename)) ), кодируем её функцией base64_encode () и разбиваем на куски функцией chunk_split (). Это стандартные операции при работе с вложением.

Если код оформляется следующим образом:
$zag = “————”.$un.”\n”;
$zag .= Content-Type:text/html;\n”;

то это значит, что  применяется стандартная операция “накапливания” переменной. Т.е. первоначально мы указываем первую часть переменной, далее при присваивании ей следующей части используем точку перед знаком равно. Это операция очень полезна. Теперь если вывести переменную в браузер то она будет содержать строку ————”.$un.”\nContent-Type:text/html;\n .В будущем мы рассмотрим несколько примеров с использованием данной операции.

Завершающий этап функции — это возврат значения функции mail (), атрибутами которой как раз являются наши стандартные переменные ($from и $to) и сформированные внутри функции ($zag и $head). Если сообщение будет отправлено, то функция вернет TRUE.

Ну а вызывать функцию будем к примеру так:

<!--r-->// от кого почта
$from = "inbox@rabota-net.net";
// для кого почта
$to = "p.kostik@bk.ru";
// заголовок письма
$title = "Доставка вашего заказа";
// текст письма
$text = "Текст письма";
// файл вложения
$file = "zakaz/test.zip";
kmail ( $from, $to, $title, $text, $file);
?&gt;

Переменные можно брать из формы отправки думаю стало понятно. Если всё же нет то пишем, что не ясно. На этом всё спасибо.

  • Михаил

    Приветствую.

    Есть вопрос по этому коду.

    Как должен выглядить сам файл отправки на имэйл с атачем?

    Если скопировать

    // от кого почта

    02.$from = «inbox@rabota-net.net»;

    03.// для кого почта

    04.$to = «p.kostik@bk.ru»;

    05.// заголовок письма

    06.$title = «Доставка вашего заказа»;

    07.// текст письма

    08.$text = «Текст письма»;

    09.// файл вложения

    10.$file = «zakaz/test.zip»;

    11.kmail ( $from, $to, $title, $text, $file);

    12.?>

    а потом код самой функии, то после запуска файла с сайта, ничего не происходит.

    Предварительно я заменил значения $from, $to и путь к моему файлу на сервере.

    Буду очень благодарен за помощь.

    Спасибо.

  • admin

    файл может находится на хосте или загружен через форму при отправке...

  • aleksey1994j

    Хороший пост, спасибо помогло!

Запись навигация

Top