А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/email2/
Rambler's Top100
Пишем на PHP: Письма с вложенными файлами (продолжение)

Не стану упрощать задачу. Будем писать утилиту (если быть точным, то -- набор функций), которая даст нам возможность с легкостью создавать и отсылать из наших скриптов письма любой сложность и "мультипАртовости".

Набор наших функций мы помещаем в класс utils, договорились?

Определимся с переменными и константами.



Надеюсь, понятно, что перед отправкой письма надо заполнить поля: от кого, кому, тему и так дальше? Если вы планируете использовать все время одни и те же заголовки, то можете их прописать изначально, как мы сделали с boundary.

Теперь разберемся с функциями, которые будут нам "собирать" письмо в один такой корявый текстовый файл.

Нам для этого надо суметь: создать заголовок письма, преобразовать присоединяемые файлы и соединить все получившееся.

Итак, создание заголовка.


По-моему, тут пояснять нечего. Про каждый параметр создаваемого заголовка вы только что прочли тут: http://www.bryansk.ru/pismo.html.

Бросили заголовок, перешли к телу письма.

Тело современного электронного письма с вложениями (attachments) не редко состоит из трех(!) видимых частей. И если вы пользуетесь правильным почтовым клиентом, то вы их всегда видите:
1. Текстовый вариант основного текста;
2. html-вариант основного текста (почему-то почтовые клиенты отдают именно ему приоритет. Видимо, из-за всякой "красоты", которую несет html);
3. Собственно, присоединенные файлы. Или как их называют в просторечье -- аттачи;

Создать первые две части можно одной функцией, т.к. обе они представляют собой обычный текст.

Честно говоря, можно было этой функции вообще не писать, т.к. она производит всего лишь простое присваивание, которое можно делать точно так же перед отправкой каждого письма. Никакой разницы, вроде? Действительно, зачем вызывать для прямого присваивания дополнительную функцию. Но я предпочитаю подобные вещи оформлять отдельной функцией для того, чтобы в последствии можно было единым махом добавить что-то в систему отправки писем -- фильтры на запрещенные слова, например. Или, если ваши скрипты обслуживают клиентов, то можно в эту функцию добавить сквозную нумерацию писем -- прицеплять к тексту что-то вроде: "Идентификационный номер данного письма 00012424 от 02.12.02. Если вы нуждаетесь в дополнительных пояснениях, напишите в нашу службу поддержки, указав ID письма...", -- да и снабдить еще эту функцию логированием всех писем, чтобы знать -- когда кому и что было отправлено.
И так далее. Как видите -- маленький "перезаклад" сегодня может выйти солидной экономией времени в будущем.

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

Присоединенные файлы могут создаваться двумя путями -- генерироваться скриптом или читаться из файла. Нам надо предусмотреть для себя оба этих случая.

Для хранения аттачей будем использовать ассоциативный массив. Это массив, где в качестве номера ячейки используется не порядковое число, а строка символов.


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

Эта функция удобна, когда мы на ходу генерируем данные для вложенного файла. Тогда вызов функции звучит логично, например:

начало цикла
$this->mail_attach($err[$n],"text/html", "<b>Ошибка такая-то, </b><br><br>примите меры!");
конец цикла

Т.е. наши вложенные файлы будут иметь формат html и нести небольшой текст с номером ошибки.

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

А как быть с файлами с диска? Да очень просто.


Идея понятна?

Мы передаем функции mail_fileattach путь к файлу на диске (или в Сети) и его тип (формат).

Первой строкой мы отцепляем от пути только название. Вернее -- удаляем все символы до названия файла, чтобы получить $name.

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

А третьей строкой вызываем написанную до этого функцию, которой передаем знакомые нам параметры, только в качестве третьего параметра зачитываем данные из файла.

Не забываем закрыть файл!

Вот тут очень важно заметить следующее. Размер памяти, в которой выполняется скрипт, может сильно не совпадать с размером файла или файлов, которые вы засовываете в письмо!
Если не ошибаюсь, то по умолчанию объем выделяемой памяти под каждый скрипт не превышает 5Мб. Это зависит от вашего провайдера.

Конечно, может возникнуть желание обойти это ограничение. Сие вполне возможно: открываешь сокет, соединяешься с почтовым сервером, договариваешься с ним, закидываешь в него хидеры и начинаешь методично зачитывать ему все содержимое жесткого диска. Но этот метод -- не для этого занятия.

Теперь надо преобразовать эти данные из массивов в понятный почтовым службам текстовый формат. И отправить письмо адресату.

Сделаем это на следующем занятии.

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin