Методы класса MailSystem
Класс MailSystem предназначен для отправки писем с сервера − как обычных, так и содержащих файлы-вложения. По умолчанию все письма рассылаются в текстовом формате (MIME-тип text/plain), но поддерживается возможность отправки писем и в формате HTML. Все методы класса предназначены для отправки одного письма, одному адресату. Если вам нужно отправить несколько однотипных писем, вызовите соответствующий метод несколько раз, но будьте осторожны − чем больше писем сервер отправит в течение короткого интервала времени, тем больше у него шансов оказаться в черных списках за спам.
Экземпляр класса MailSystem создается в движке автоматически и доступен через глобальную переменную $mailSystem. В пакетах эта переменная доступна автоматически, ее не нужно никак объявлять. В функциях и методах классов ее нужно предварительно объявить командой:
global $mailSystem;
Все письма отправляются при помощи стандартной функции mail. Если письма не отправляются или отправляются с ошибками − обратитесь к вашему хостеру по поводу настройки локального почтового сервера и установки правильных параметров для функции mail. Настроить работу почтовой службы может только администратор сервера.
Класс также поддерживает возможность удобной отладки при отправке писем, особенно при локальной разработке проекта. Создайте в корневом каталоге сайта каталог mail, переключите стандартную константу MailDebuggerEnabled в true, и отныне все письма, рассылаемые через класс MailSystem, не будут отправляться на почтовый сервер, а будут сохраняться в виде текстовых файлов в папке mail.
Рассмотрим методы класса более подробно.
bool sendMail ( string sender, string recipient, string subject, string message [, bool html] )
Метод отправляет письмо с заголовком subject и телом (текстом) message на адрес recipient. В качестве обратного адреса используется значение параметра sender. По умолчанию письмо отправляется в текстовом формате и с MIME-типом text/plain, если вам нужен формат HTML и MIME-тип text/html − укажите необязательному параметру html значение true. Разумеется, в этом случае и параметр message также должен иметь вид HTML-файла.
Хорошей практикой считается использование шаблонов ACMS для формирования заголовков и текстов отправляемых писем. Это особенно удобно для писем, в содержимое которых вставляются динамические данные, например, код активации аккаунта или имя пользователя. При использовании шаблонов для таких вставок достаточно использовать стандартные теги <var:...>. При этом, однако, нужно помнить следующее:
Если вы используете plain-формат писем, то есть письма в обычном текстовом формате, то при подстановке значений переменных в тексты нужно отключать фильтрацию специальных символов. Например, вместо <var:username> в шаблоне письма нужно писать <var:username nofilter>.
При компиляции шаблона ACMS автоматически удаляет из него все пустые строки. Для HTML-шаблонов это удобно, но при обработке обычного текста строки могут "слипаться" друг с другом. Повлиять на этот механизм нельзя, он является частью компилятора, поэтому, чтобы обойти эту оптимизацию, используйте один или несколько пробелов вместо пустых строк в текстах писем.
Наконец, для сборки шаблона ему нужно предварительно передать список доступных переменных, ибо по умолчанию "область видимости" шаблона пуста. Как это сделать − см. в примере ниже. Список переменных шаблона собирается в специальной переменной $scope при помощи стандартной функции compact, и затем просто передается методу
captureTemplate в качестве второго параметра.
Метод возвращает значение true, если письмо было успешно отправлено, и false в противном случае.
Пример:
// Отправка приветственного письма на адрес $email, пользователю $username
// Для сборки письма используются шаблоны mailWelcomeSubject и mailWelcomeMessage
// 1. Подготовка списка переменных для шаблона (логин, пароль, e-mail адрес)
$scope=compact("username","password","email");
// 2. Сборка заголовка и текста письма
$subject=$compiler->captureTemplate("mailWelcomeSubject",$scope);
$message=$compiler->captureTemplate("mailWelcomeMessage",$scope);
// 3. Собственно отправка письма
$success=$mailSystem->sendMail($settings["siteAdminEmail"],$email,$subject,$message);
if($success) echo "Письмо отправлено успешно."; bool sendMailAttachments ( string sender, string recipient, string subject, string message [, array attachments [, bool html]] )
Данный метод отличается от предыдущего лишь тем, что позволяет вкладывать в текст письма одно или более файлов-вложений. Вложения оформляются в формате Disposition=attachment, с MIME-типом application/octet-stream. Это наиболее безопасный и наименее "подозрительный" способ передачи файлов в письмах.
Список вложений указывается параметром attachments. Он имеет вид ассоциативного массива, ключи которого − имена файлов, под которыми вложения будут добавлены в письмо, а значения − содержимое файлов-вложений. Обратите внимание, что содержимое вложений указывается напрямую, в виде бинарных строк. Они не обязаны быть предварительно сохранены в файловой системе сервера. Их содержимое может быть как прочитано из файла, так и сформировано "на лету" − как вам удобнее.
Метод возвращает значение true, если письмо было успешно отправлено, и false в противном случае.
Пример:
// Отправка прайса и оферты на адрес $email
// 1. Подготовка заголовка и текста письма
$subject="Прайс и оферта";
$message="Получайте ваши документы.";
// 2. Подготовка вложений
$attachments=array(
"Прайс-лист.doc"=>$fileSystem->openFile("/files/documents/price.dat"),
"Договор-оферта.doc"=>$fileSystem->openFile("/files/documents/agreement.dat"));
// 3. Отправка письма
$success=$mailSystem->sendMailAttachments(
$settings["siteAdminEmail"],$email,$subject,$message,$attachments);
if($success) echo "Письмо отправлено успешно.";