Відправка листів за допомогою php-прикріплення файлу, php

Лист, що містить прикріплений файл, дещо відрізняється від простого.
У ньому додаються деякі заголовки, і трохи змінюється сама побудова,
хоча безсумнівно сам лист залишається текстовим файлом. Але давайте все по порядку.

Одна з особливостей - наявність заголовка mime-version.
Цей заголовок вказує стандарт, якому відповідав би тіло повідомлення.
Повідомлення, відповідні mime зобов'язані утримувати таке поле заголовка з наступним текстом:
mime-version: 1.0

Якщо ми хочемо відіслати листа з прикріпленими файлами, то необхідно використовувати заголовок content-type: multipart / mixed, який позначає, що лист складається з декількох частин, кожна з яких містить свій заголовок content-type. Для позначення кордону цих частин необхідно використовувати параметр boundary, який ще називається маркером кордону.
Значення цього параметра може служити будь-який рядок. Але треба врахувати, що вона повинна бути унікальною і не зустрічалася в тілі листа. Інакше лист може бути неправильно розбите на частини.

from: "uspenskii evgeny"
to: [email protected]
subject: hello
mime-version: 1.0
content-type: multipart / mixed; boundary = "spravkaweb-12345"

При поділі листи на частини перед маркером повинні стояти два знака дефіса.
А останній маркер, який позначає кінець листи, повинен містити в кінці два знака дефіса.
Для кожної частини необхідно встановити свої заголовки.
Після заголовків необхідно поставити два знаки перекладу рядка.

from: "uspenskii evgeny"
to: [email protected]
subject: hello
mime-version: 1.0
content-type: multipart / mixed; boundary = "spravkaweb-12345"
--spravkaweb-1234
content-type: text / plain; charset = "windows-1251"
content-transfer-encoding: quoted-printable

hi!
here's that my file!

--spravkaweb-1234
content-type: application / x-rar-compressed; name = "file.rar"
content-transfer-encoding: base64
content-disposition: attachment

Якщо у нас йде частина з текстом, то треба заголовок content-transfer-encoding привласнити значення quoted-printable, або 7bit, або 8bit. Для частини з файлом цей заголовок має дорівнювати base64.

Тема content-disposition, присутній у другій частині, вказує, як поштовій програмі слід відобразити дану частину листа. Він може приймати значення attachment (ця ділянка не є частиною листа, а просто прикріплений до нього у вигляді файлу) і inline (включення, яке використовується безпосередньо в листі, наприклад, картинка, що вставляється в html).

У першій частині заголовком
content-type: text / plain; charset = "windows-1251"

вказали, що це простий текст з кодуванням windows.
У другій же частині заголовком
content-type: application / x-rar-compressed; name = "file.rar"

вказали, що тип файлу - rar-архів, а ім'я файлу - file.rar.
Якщо відправляємо gif-картинку, його content-type буде виглядати:
content-type: image / gif; name = "file.gif"

У разі, якщо заздалегідь не відомо, який тип файлу відправляємо, або формат файлу не є стандартним, слід заголовку content-type привласнити значення application / octet-stream.
content-type: application / octet-stream; name = "file.dat"

Прикріплені файли повинні бути розміщені в листі в форматі base64.
Перетворити файл у цей формат можна за допомогою функції base64_encode ():
// Відкриваємо файл для читання в бінарному форматі
$ File = fopen ( "file.zip", "rb");
// Прочитуємо його в рядок $ str_file
$ Str_file = fread ($ file, filesize ( "file.zip"));
// Перетворимо цей рядок в base64-формат
$ Str_file = base64_encode ($ str_file);

Тепер змінну $ str_file, яка містить файл, можна вставляти в лист.

Схожі статті