фрагмент кода на языке php:
отправка e-mail с вложением

материал выложен: 16.08.2017

материал обновлён: 19.08.2017

Перед использованием материалов этого раздела рекомендуется ознакомиться с правилами сайта.

<?php

// Это php-скрипт на отправку письма на указанный адрес e-mail с темой, сопроводительным текстом и вложением.

// ВАЖНО: тот скрипт должен запускаться лишь тогда, когда точно известно, что отправляемый файл существует.

/*
ВАЖНО: если скрипт запускается не с того же адреса, на котором находится, то нужно прописать разрешение на обработку кроссдоменных запросов:
header('Access-Control-Allow-Origin: *');
*/

// чтобы скрипт не запускали просто так, тут стоит защита, в которую должно быть отправлено определённое значение (в примере указан 'password')

$protection = $_GET['protection'];

// если "пароль" к скрипту верен, то начинается выполнение:

if ($protection == "password")
{

// название файла, которое должно быть передано в этот скрипт:
// нужно передавать его с указанием формата; например, это может быть "result-20170727-184504-fsgsd.docx";

$filename = $_GET['myfilename'];

// далее нужно указать месторасположение файла, которое состоит из адреса его расположения (относительный или абсолютный путь) и имени файла
// в данном случае в качестве примера путь выбран относительный, т.е. файл должен находиться в папке "files", которая должна лежать в папке с этим скриптом:
// например: "files/result-20170727-184504-fsgsd.docx";

$filepath = "files/".$filename;

// содержимое этой переменной станет темой входящего письма в почтовом ящике адресата:

$subject = "Сервис отправки непонятных файлов";

// содержимое этой переменной станет текстом входящего письма в почтовом ящике адресата:

$message = "Здравствуйте! Ваш замечательный файл в этом письме.";

/*
ДОПОЛНИТЕЛЬНО
Можно сделать и так, чтобы текст сообщения содержал какую-то информацию, кастомизированную под пользователя.
Например:
// заранее записываем в переменные нужную информацию:
$username = $_GET['myname'];
$userdate = $_GET['mydate'];

// и теперь сам текст с переменными и html-разметкой:
$message = "<p> Добрый день, $username! </p>
<p> Ваш замечательный файл в этом письме. </p>
<p> Также напоминанем, что вы зарегистрированы на нашем сервисе с $userdate. </p>
<p> С уважением, Сервис отправки непонятных файлов</p>";
*/

// содержимое переменной $to является адресом, на который будет отправляться письмо:

$usermail = $_GET['mymail'];
$to = $usermail;

// содержимое переменной $projectmail является адресом, ОТ ИМЕНИ КОТОРОГО ЯКОБЫ будет отправляться письмо и на который можно будет отправить ответ
// в данном случае нужно ставить фиксированный e-mail данного сервиса:

$projectmail = "somemail@dom.dom";

// нижеследующий фрагмент скрипта взят отсюда: https://habrahabr.ru/sandbox/48759/ и доработан.
// в частности, доставлены кавычки вокруг выражений "\r\n" в двух местах ниже, потому что скрипт без этого выдавал ошибку.

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

$boundary = "--".md5(uniqid(time()));

// разделитель указывается в заголовке в параметре boundary:

$mailheaders = "MIME-Version: 1.0;\r\n";
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";

$mailheaders .= "From: $projectmail <$projectmail>\r\n";
$mailheaders .= "Reply-To: $projectmail\r\n";

// первая часть – само сообщение:

$multipart = "--$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";
$multipart .= "\r\n";
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));

// загрузка файла (имеется в виду НЕ загрузка с компьютера пользователя):

$fp = fopen($filepath,"r");
if (!$fp)
{
print "Не удается открыть файл";
exit();
}

// чтение файла:

$file = fread($fp, filesize($filepath));
fclose($fp);

// второй частью прикрепляется файл, можно прикрепить два и более файла:

$message_part = "\r\n--$boundary\r\n";
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
$message_part .= "Content-Transfer-Encoding: base64\r\n";
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$message_part .= "\r\n";
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";

$multipart .= $message_part;

// отправка письма:

mail($to,$subject,$multipart,$mailheaders);
}

// если "пароль" к скрипту неверен, то показать можно что угодно, в данном случае сообщение "Error!":

else
{
exit('Error!');
}

?>

Нашли ошибку или есть что дополнить?
Пишите на e-mail contact@legaltech.org.ua или сюда.