На форум часто приходят новички, которые спрашивают, как отправить письмо на E-mail, в связи с чем, одним прекрасным утром, я решил написать этот пост. Привет, друг! Давай я тебе расскажу, как правильно отправлять письма на E-Mail. Дело в том, что скрипты, которые ты находишь в интернете не "работают", а "прокатывают". И такие письма могут запросто загреметь в спам, где никогда не будут прочитаны или даже вообще не дойти. А ты ведь не для этого отправляешь письма? К счастью, кто-то до тебя уже разобрался в этом вопросе и решил задачу наилучшим образом. + есть практики, к которым уже пришли разработчики и тебе не нужно заново набивать эти шишки. Просто возьми опыт тех, кто уже состоялся. И самая правильная практика отправки писем - использовать SMTP. Думаю, ты не станешь спорить с тем, что Yandex и Google лучше всех разбираются в отправке письм? Нам нужно просто передать параметры письма сервису, заточенному на это, и он всё сделает как надо. Давай приступим. Первым делом скачиваем последнюю версию библиотеки PHPMailer: https://github.com/PHPMailer/PHPMailer Из каталога src берем два файла: PHPMailer.php и SMTP.php. Эти файлы помещаем в свой проект, например, в папку PHPMailer Открываем оба файла и в самом верху удаляем строку: PHP: namespace PHPMailer\PHPMailer; И у одного и у второго файла. Эти заморочки нам ни к чему. Для удобства в той же папке создадим файл mail.php, в котором напишем небольшой класс. Я буду использовать параметры соединения для Яндекс почты. mail.php: PHP: require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/PHPMailer.php'); require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/SMTP.php'); class mail extends PHPMailer { public function __construct(){ $this->isSMTP(); $this->isHTML(true); $this->CharSet = 'UTF-8'; $this->Host = 'ssl://smtp.yandex.ru'; $this->SMTPSecure = 'SSL'; $this->Port = 465; $this->SMTPAuth = true; $this->Username = 'ЛОГИН_ОТ_ПОЧТЫ'; // логин - до @yandex.ru $this->Password = 'ПАРОЛЬ_ОТ_ПОЧТЫ'; $this->setFrom('mail@exemple.ru', 'Name'); // почта и имя отправителя (эта информация будет приходить получателю. Почту я всегда указываю реальную.) } } Этот класс нужен для того, чтобы не писать каждый раз параметры, которые не меняются. Теперь всё что нужно для отправки письма - это подключить файл mail.php и написать несколько строк кода: PHP: require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/mail.php'); $email = 'mail@example.com'; // почта получателя $subject = 'Тема письма'; $html = ' <html> <head><title>'.$subject.'</title></head> <body> <p>Текст письма</p> </body> </html> '; $mail = new mail(); $mail->addAddress($email); $mail->Subject = $subject; $mail->Body = $html; // $mail->addAttachment('/путь/к/файлу/файл', 'имя_файла'); // приложить файл, если нужно (можешь даже несколько) $mail->send(); // возвращает true/false в зависимости от результата На html письма есть серьёзные ограничения по сравнению в привычным HTML5. Об этом можно почитать в интернете по запросу в google "верстка писем". Метод addAttachment вторым параметром принимает имя файла, с которым файл придет получателю в письме. Т е ты можешь указать имя файла отличное от оригинального. Вот и всё. Теперь ты умеешь отправлять письма правильно. Поздравляю
Прикол в том, что мучить пых SMTP-отправкой – это самый неправильный вариант. Но для шареда сойдет, так что зачет.
добавь аргументов) --- Добавлено --- я тебя понял ты имеешь в виду, что на VPS лучше поднять SMTP сервак и отправлять через него?
Нужно подумать Для меня это настолько очевидная вещь, что как-то не задумывался о том, что кому-то это еще нужно аргументировать. Не обязательно сервак. Для SMTP-отправки достаточно клиента.
К сожалению, у меня это не сработало. Может быть, связано с тем, что это для яндекса, а я пытался отправить почту в гугл? Но для гугла я фактически поменял только вот эту строку: $this->Host = 'ssl://smtp.yandex.ru'; на: $this->Host = 'ssl://smtp.google.com'; И ещё хочу здесь поинтересоваться. Что выполняют эти две функции? Они необходимы? $this->isSMTP(); $this->isHTML(true); Впрочем, у меня и без них почта не отправилась.
@alexphp, набираю в поисковике «google smtp». О, чудо, вижу в топе ссылку на https://support.google.com/a/answer/176600?hl=ru Разворачиваю спойлеры и вижу всю необходимую инфу по вашему вопросу. Правда, это может касаться только пользователей G Suite. Вам что влом создать ящик на Яндексе для подобных пересылок?
ну какбэ ясно по английски написано Это SMTP и это HTML да, эти методы нужны. У гугла всё чуть более заморочено. Во первых в любом случае нужно всё правильно указать в конфигах, но даже при это гугл может посчитать Ваше приложение не надёжным и не сработать. В настройках GMAIL можно разрешить работу с ненадежными приложениями, но только в том случае, если на аккаунте не включена двухфакторная аунтефикация. Вот такая длинная цепочка, которая может привести в никуда Можете, конечно, почитать как сделать своё приложение надёжным (я не читал), но можете просто не вникая в это всё создать аккаунт яндекса и настроить через него. Так же можно создать аккаунт гугла, не включать двухфакторную аунтефикацию, разрешить работу с ненадежными приложениями и работать с ним.
У Яши тоже нужно специально включать или хотя бы проконтролировать возможность доступа со стороны «приложений» (это сейчас норма). Конкретно про двухфакторную там в настройках вроде не сказано. Видимо, предполагается, что если разрешаете доступ, то двухфакторной само собой не будет.
Ну типа для браузерного пхп скрипта моветон коннектиться к внешним ресурсам, потому что это может занять несколько секунд, особенно если письмо с файлом. Под линуксом практически безраздельно рассылкой писем занимаемся Postfix . Он принимает письма в свою очередь как локальный SMTP и далее в фоновом режиме отправляет указанным в конфигурации образом - через яшу, гугл или как ещё угодно. Must know и must have в общем.