Пишемо на php листи з вкладеними файлами

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

Набір наших функцій ми поміщаємо в клас utils. домовилися?

Визначимося зі змінними і константами.

Сподіваюся, зрозуміло, що перед відправкою листа треба заповнити поля: від кого, кому, тему і так далі? Якщо ви плануєте використовувати весь час одні і ті ж заголовки, то можете їх прописати спочатку, як ми зробили з boundary.

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

Нам для цього треба зуміти: створити заголовок листа, перетворити приєднуються файли і з'єднати всі вийшло.

Отже, створення заголовка.

Кинули заголовок, перейшли до тіла листа.

Тіло сучасного електронного листа з вкладеннями (attachments) нерідко складається з трьох (!) Видимих ​​частин. І якщо ви користуєтеся правильним поштовим клієнтом, то ви їх завжди бачите:

  1. Текстовий варіант основного тексту;
  2. html-варіант основного тексту (чомусь поштові клієнти віддають саме йому пріоритет. Мабуть, через будь-якої "краси", яку несе html);
  3. Власне, приєднані файли. Або як їх називають в просторіччі - аттачі;


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

Чесно кажучи, можна було цієї функції взагалі не писати, тому що вона виробляє всього лише просте присвоювання, яке можна робити точно так же перед відправкою кожного листа. Ніякої різниці, на зразок? Дійсно, навіщо викликати для прямого привласнення додаткову функцію. Але я вважаю за краще подібні речі оформляти окремою функцією для того, щоб надалі можна було єдиним махом додати щось в систему відправки листів - фільтри на заборонені слова, наприклад. Або, якщо ваші скрипти обслуговують клієнтів, то можна в цю функцію додати наскрізну нумерацію листів - чіплялися до тексту щось на кшталт: "Ідентифікаційний номер даного листа 00012424 від 02.12.02. Якщо ви потребуєте додаткових пояснень, напишіть в нашу службу підтримки , вказавши ID листи. ", - та й забезпечити ще цю функцію логування всіх листів, щоб знати - коли кому і що було надіслано.
І так далі. Як бачите - маленький "перезастави" сьогодні може вийти солідної економією часу в майбутньому.

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

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

Цією функцією ми заганяємо в два різних масиву: тип даних і самі дані, імена осередків в цих масивах при цьому збігаються, що нам буде дуже корисно. Вдалий випадок показати ефективне застосування асоціативних масивів.

Ця функція зручна, коли ми на ходу генеруємо дані для вкладеного файлу. Тоді виклик функції звучить логічно, наприклад:

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

А як бути з файлами з диска? Та дуже просто.

Ми передаємо функції mail_fileattach шлях до файлу на диску (або в Мережі) і його тип (формат).

Першим рядком ми відчіплюватися від шляху тільки назва. Вірніше - видаляємо всі символи до назви файлу, щоб отримати $ name.

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

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

Не забуваємо закрити файл!

Ось тут дуже важливо зауважити наступне. Розмір пам'яті, в якій виконується скрипт, може сильно не збігатися з розміром файлу або файлів, які ви засовує в лист!
Якщо не помиляюся, то за замовчуванням обсяг виділеної пам'яті під кожен скрипт не перевищує 5Мб. Це залежить від вашого провайдера.

Схожі статті