В PHP у нас в основному є 2 способи відправки листів:
mail()
, яка має досить багато обмежень,mail()
повинна використовувати SMTP-сервер, що є дуже простим способом відправки пошти через SMTP-сервер.Ідея використання цього проста: ви викликаєте функцію:
mail('jan@barasek.com', 'Тема', 'Текст повідомлення...');
А PHP сам зробить відправку.
Внутрішня відправка працює шляхом зчитування конфігурації з файлу php.ini
і пошуку SMTP-сервера за замовчуванням для доставки пошти. Для цього необхідна попередня конфігурація веб-сервера.
Основний підводний камінь функції mail()
полягає в тому, що програмісту доводиться самому розбиратися у всій логіці. Це передбачає, наприклад, викидання заголовків про шифрування, прив'язку сертифікатів до шифрування повідомлень тощо.
У разі невдалої відправки повертається значення false
, яке ми повинні перехопити і обробити самостійно. Конкретну помилку ми можемо дізнатися обмежено, викликавши, наприклад, error_get_last()
:
if (@mail($to, $subject, $message) === false) {throw new \Exception('Не можу відправити пошту:'. (@error_get_last()['повідомлення'] ?? ''));}
Зверніть увагу, що ми не вказали адресу, з якої хочемо надсилати пошту, та кодування, яке буде використовуватися.
Всі ці налаштування потрібно передавати через заголовки.
Якщо все ж таки потрібно використовувати функцію mail()
(наприклад, через хостинг), рекомендую використовувати пакет nette/mail
і сервіс SendmailMailer
, який добре справляється з відправкою пошти.
SMTP розшифровується як "Простий протокол передачі пошти", що (як ви незабаром побачите) дуже вірно.
SMTP, на відміну від mail()
, є більш просунутим протоколом з розширеними можливостями налаштування не тільки з боку PHP, але і безпосередньо на поштовому сервері.
Підтримка SMTP на хостах у 2018 році відмінна.
SMTP в основному працює за рахунок того, що PHP спочатку встановлює з'єднання з SMTP-сервером (для цього потрібно розширення php_openssl.dll
в PHP, яке у вас, ймовірно, вже активне), аутентифікується (перевіряє правильність облікових даних для входу в систему) під час з'єднання, а потім ми можемо спілкуватися з сервером аналогічно тому, як це відбувається з базою даних - тобто відправляти окремі запити, але при цьому весь час тримати єдине з'єднання. Великою перевагою SMTP є пряма підтримка шифрування (відомого як TLS
).
Мені часто потрібно відправляти електронні листи з localhost, коли я тестую щойно написаний додаток.
Для чайових:.
На Mac ситуація проста, оскільки сервер MAMP якимось "чарівним" чином знаходить поточний обліковий запис Apple Mail і повідомлення завжди надсилаються з поточного облікового запису.
Однак, ви не завжди можете покладатися на таку поведінку, і це гарна ідея, щоб створити власне рішення. Якщо у вас є підключення до Інтернету і обліковий запис Google, дуже легко використовувати обліковий запис Gmail, до якого можна підключитися безпосередньо з PHP і відправляти пошту через нього.
Якщо ви використовуєте пакет nette/mail
, то конфігурація проста:
mail:smtp: truehost: smtp.gmail.comusername: janbarasek@gmail.compassword: *********secure: ssl
Пароль не є паролем для входу до вашого облікового запису (це було б небезпечно, і ви не змогли б використовувати, наприклад, двофакторну автентифікацію).
Потрібно використовувати так званий "пароль додатку", що реалізаційно означає, що ви реєструєте свій додаток безпосередньо у своєму обліковому записі Google, якому присвоюється якийсь випадково згенерований пароль, який ви вводите в PHP і через який можна пересилати.
Детальна інструкція знаходиться на сайті Google.
Через хостинг Wedos можна надсилати лише 500 листів на день, і я деякий час боровся з SMTP-з'єднанням.
Через пакет nette/mail
це робиться так (робоче рішення):
mail:smtp: truehost: smtp-*******.wedos.netusername: jan@barasek.compassword: ******secure: tlsport: 587
Параметр host
відрізняється для кожного хостингу і знаходиться в електронному листі, який Wedos надсилає при реєстрації хостингу.
Ім'я користувача представляє поштову скриньку, з якої будуть відправлятися листи. Поштова скринька повинна існувати. При відправці пошти в PHP нам також потрібно встановити відправку на ту ж адресу (в Nette методом ->setFrom()
).
Якщо ми не заповнимо конфігурацію точно і правильно, будуть викидатися різні повідомлення про помилки і листи не зможуть бути відправлені.
При перевищенні кількості відправлених повідомлень буде згенеровано виключення з повідомленням про перевищення ліміту.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk