фрагмент коду мовою 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 або сюди.