Пишемо на 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", "Помилка така-то,
вживіть заходів!");кінець циклу
Тобто. наші вкладені файли матимуть формат html і несуть невеликий текст із номером помилки.
А як бути із файлами з диска? Так, дуже просто.
Ми передаємо функціїmail_fileattachшлях до файлу на диску (або в Мережі) та його тип (формат).
Першим рядком ми відчіплюємо від шляху лише назву. Точніше - видаляємо всі символи до назви файлу, щоб отримати$name.
Другим рядком відкриваємо файл на читання, не забувши поставити перевірку на відкриття - навіщо нам треба висилати порожній атач, ми краще адміністратору надішлемо найгрізніше з наших попереджень -1.
А третім рядком викликаємо написану до цього функцію, якою передаємо знайомі нам параметри, лише як третій параметр зачитуємо дані з файлу.
Не забуваймо закрити файл!
Ось тут дуже важливо помітити таке. Розмір пам'яті, в якій виконується скрипт, може не співпадати з розміром файлу або файлів, які ви засовуєте в лист! Якщо не помиляюся, то за умовчанням обсяг пам'яті, що виділяється під кожен скрипт не перевищує 5Мб. Це залежить від вашого провайдера.
Звичайно, може виникнути бажання обійти це обмеження. Це цілком можливо: відкриваєш сокет, з'єднуєшся з поштовим сервером, домовляєшся з ним, закидаєш у нього хідери і починаєш методично зачитувати йому весь вміст жорсткого диска. Але цей метод – не для цього заняття.