WSMailer
WSMailer — встроенный почтовый класс CMS WebSource для отправки email сообщений через SMTP или встроенную функцию PHP mail().Поддерживает
- отправку через SMTP с авторизацией
- автоматический fallback на
mail(), если SMTP недоступен - текстовые и HTML-письма
- автоматическую генерацию текстовой версии для HTML-писем
- вложения
- MIME-заголовки и кодировку UTF-8
- проверку SMTP-соединения через
ping() - получение информации о последнем транспорте и SMTP-ошибке
Быстрый старт
$mailer = new WSMailer([
'smtp-host' => 'smtp.example.com',
'smtp-login' => 'robot@example.com',
'smtp-pass' => 'secret',
'from-email' => 'robot@example.com',
'from-name' => 'WebSource',
'smtp-secure' => 'tls',
'smtp-port' => 587
]);
$mailer->sendHtml(
'user@example.com',
'Добро пожаловать',
'<h1>Здравствуйте!</h1><p>Ваш аккаунт создан.</p>'
);Конфигурация
Конфигурация формируется из двух источников:
- настроек из базы данных
optionsс типомemail - массива
$config, переданного в__construct()
Переданные параметры объединяются с настройками из базы данных. Для предсказуемого переопределения используйте те же имена ключей, которые сохранены в настройках.
Параметры конфигурации
| Параметр | Тип | Описание |
|---|---|---|
smtp / smtp-host |
string |
Адрес SMTP-сервера. |
login / smtp-login |
string |
Логин SMTP. |
pass / smtp-pass |
string |
Пароль SMTP. |
email / from-email |
string |
Email отправителя. Обязателен в итоговой конфигурации. |
name / from-name |
string |
Имя отправителя. |
reply-to |
string |
Email для ответа. По умолчанию совпадает с from-email. |
smtp-secure |
string |
Тип шифрования: ssl, tls или пустое значение. |
smtp-port |
number |
Порт SMTP. По умолчанию 465 для ssl, в остальных случаях 587. |
charset / input-charset |
string |
Исходная кодировка текста. По умолчанию utf-8. |
timeout |
number |
Таймаут SMTP-соединения в секундах. Минимум 5. |
ehlo-host |
string |
Значение для команды EHLO. Если не задано, вычисляется автоматически. |
Если smtp-secure не задан, порт 465 автоматически включает ssl, а порт 587 включает tls. Для другого порта пустое значение оставляет соединение без шифрования.
Инициализация
__construct(array $config = [])
Создаёт экземпляр класса и подготавливает итоговую конфигурацию.
$mailer = new WSMailer();$mailer = new WSMailer([
'from-email' => 'robot@example.com',
'from-name' => 'WebSource'
]);Отправка писем
sendText(string $to, string $subject, string $text, array $attachments = []) : void
Отправляет текстовое письмо.
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
to |
string |
Email получателя. |
subject |
string |
Тема письма. |
text |
string |
Текст письма. |
attachments |
array |
Массив вложений. |
Пример:
$mailer->sendText(
'user@example.com',
'Проверка почты',
'Это тестовое письмо.'
);sendHtml(string $to, string $subject, string $html, array $attachments = [], ?string $text = null) : void
Отправляет HTML-письмо.
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
to |
string |
Email получателя. |
subject |
string |
Тема письма. |
html |
string |
HTML-содержимое письма. |
attachments |
array |
Массив вложений. |
text |
string|null |
Текстовая версия письма. Если не передана, будет создана автоматически из HTML. |
Пример:
$html = $mailer->mailHtmlTemplate(
'<h1>Восстановление доступа</h1><p>Перейдите по ссылке для продолжения.</p>',
'Если вы не запрашивали это письмо, просто проигнорируйте его.'
);
$mailer->sendHtml(
'user@example.com',
'Восстановление доступа',
$html
);Проверка соединения
ping() : void
Проверяет доступность SMTP-сервера.
Если SMTP не настроен, метод просто завершится без ошибки.
Пример:
$mailer->ping();Получение состояния
getLastTransport() : string
Возвращает транспорт, через который было отправлено последнее письмо.
Возможные значения:
smtpmail
Пример:
$mailer->sendText('user@example.com', 'Test', 'Hello');
$transport = $mailer->getLastTransport();getLastSmtpError() : ?string
Возвращает текст последней SMTP-ошибки, если во время отправки через SMTP произошёл сбой.
Если SMTP-ошибки не было, возвращает null.
Пример:
try {
$mailer->sendText('user@example.com', 'Test', 'Hello');
} catch (Throwable $e) {
$smtpError = $mailer->getLastSmtpError();
}HTML-шаблон письма
mailHtmlTemplate(string $html, ?string $footerText = null) : string
Формирует HTML-обёртку письма в стиле WebSource.
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
html |
string |
Основное HTML-содержимое письма. |
footerText |
string|null |
Текст в нижней части письма. |
Возвращает:
| Параметр | Тип | Описание |
|---|---|---|
return |
string |
Готовый HTML-шаблон письма. |
Пример:
$html = $mailer->mailHtmlTemplate(
'<h1>Добро пожаловать</h1><p>Спасибо за регистрацию.</p>',
'Команда WebSource'
);Вложения
Каждое вложение передаётся как элемент массива.
Формат:
[
'path' => '/absolute/path/to/file.pdf',
'name' => 'manual.pdf',
'mime' => 'application/pdf'
]Поддерживаемые ключи:
| Ключ | Тип | Описание |
|---|---|---|
path / url |
string |
Путь к файлу. Обязательный параметр. |
name |
string |
Имя файла в письме. Если не задано, используется имя исходного файла. |
mime / type |
string |
MIME-тип файла. Если не задан, определяется автоматически. |
Пример:
$mailer->sendText(
'user@example.com',
'Документы',
'Во вложении находится файл.',
[
[
'path' => '/var/www/files/report.pdf',
'name' => 'report.pdf',
'mime' => 'application/pdf'
]
]
);Исключения
Класс может выбрасывать стандартные исключения PHP:
| Исключение | Когда возникает |
|---|---|
InvalidArgumentException |
Неверный email, пустая тема, неверная конфигурация, отсутствует путь к вложению. |
RuntimeException |
Не удалось подключиться к SMTP, прочитать вложение, записать данные в сокет или отправить письмо через mail(). |
Ограничения и замечания
- класс работает только с одним получателем за один вызов
- в публичном API нет отдельных методов для
CCиBCC - SMTP-аутентификация реализована через
AUTH LOGIN ping()проверяет соединение и запуск TLS, но не проверяет SMTP-авторизацию и отправку письма- при HTML-отправке текстовая версия письма создаётся автоматически, если
textне передан - вложения должны существовать на диске и быть доступны для чтения
- если
from-emailне задан явно, класс пытается определить его изsmtp-loginилиsendmail_from
Что использовать
Используйте sendText(), если:
- письмо должно содержать только обычный текст
- не нужна HTML-вёрстка
Используйте sendHtml(), если:
- письмо должно содержать HTML-разметку
- нужна шаблонная обёртка письма
- нужна автоматическая текстовая версия