PHP Manual

Відправлення електронних листів (функції mail() та SMTP) в PHP

26. 11. 2019

В PHP у нас в основному є 2 способи відправки листів:

  • Нативна функція mail(), яка має досить багато обмежень,
  • або через SMTP-сервер.

Функція 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 розшифровується як "Простий протокол передачі пошти", що (як ви незабаром побачите) дуже вірно.

SMTP, на відміну від mail(), є більш просунутим протоколом з розширеними можливостями налаштування не тільки з боку PHP, але і безпосередньо на поштовому сервері.

Підтримка SMTP на хостах у 2018 році відмінна.

SMTP в основному працює за рахунок того, що PHP спочатку встановлює з'єднання з SMTP-сервером (для цього потрібно розширення php_openssl.dll в PHP, яке у вас, ймовірно, вже активне), аутентифікується (перевіряє правильність облікових даних для входу в систему) під час з'єднання, а потім ми можемо спілкуватися з сервером аналогічно тому, як це відбувається з базою даних - тобто відправляти окремі запити, але при цьому весь час тримати єдине з'єднання. Великою перевагою SMTP є пряма підтримка шифрування (відомого як TLS).

Відправка листів з localhost - просте рішення

Мені часто потрібно відправляти електронні листи з localhost, коли я тестую щойно написаний додаток.

Для чайових:.

На Mac ситуація проста, оскільки сервер MAMP якимось "чарівним" чином знаходить поточний обліковий запис Apple Mail і повідомлення завжди надсилаються з поточного облікового запису.

Однак, ви не завжди можете покладатися на таку поведінку, і це гарна ідея, щоб створити власне рішення. Якщо у вас є підключення до Інтернету і обліковий запис Google, дуже легко використовувати обліковий запис Gmail, до якого можна підключитися безпосередньо з PHP і відправляти пошту через нього.

Якщо ви використовуєте пакет nette/mail, то конфігурація проста:

mail:
smtp: true
host: smtp.gmail.com
username: janbarasek@gmail.com
password: *********
secure: ssl

Пароль не є паролем для входу до вашого облікового запису (це було б небезпечно, і ви не змогли б використовувати, наприклад, двофакторну автентифікацію).

Потрібно використовувати так званий "пароль додатку", що реалізаційно означає, що ви реєструєте свій додаток безпосередньо у своєму обліковому записі Google, якому присвоюється якийсь випадково згенерований пароль, який ви вводите в PHP і через який можна пересилати.

Детальна інструкція знаходиться на сайті Google.

Налаштування пошти на Wedos

Через хостинг Wedos можна надсилати лише 500 листів на день, і я деякий час боровся з SMTP-з'єднанням.

Через пакет nette/mail це робиться так (робоче рішення):

mail:
smtp: true
host: smtp-*******.wedos.net
username: jan@barasek.com
password: ******
secure: tls
port: 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:

Související články

1.
2.
Status:
All systems normal.
2024