За последние 24 часа нас посетили 18516 программистов и 1581 робот. Сейчас ищут 1159 программистов ...

Правильная отправка E-Mail для новичка

Тема в разделе "Решения, алгоритмы", создана пользователем TeslaFeo, 9 апр 2019.

  1. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    На форум часто приходят новички, которые спрашивают, как отправить письмо на E-mail, в связи с чем, одним прекрасным утром, я решил написать этот пост.

    Привет, друг!

    Давай я тебе расскажу, как правильно отправлять письма на E-Mail.

    Дело в том, что скрипты, которые ты находишь в интернете не "работают", а "прокатывают".
    И такие письма могут запросто загреметь в спам, где никогда не будут прочитаны или даже вообще не дойти. А ты ведь не для этого отправляешь письма?

    К счастью, кто-то до тебя уже разобрался в этом вопросе и решил задачу наилучшим образом.
    + есть практики, к которым уже пришли разработчики и тебе не нужно заново набивать эти шишки. Просто возьми опыт тех, кто уже состоялся.

    И самая правильная практика отправки писем - использовать SMTP.
    Думаю, ты не станешь спорить с тем, что Yandex и Google лучше всех разбираются в отправке письм? :)
    Нам нужно просто передать параметры письма сервису, заточенному на это, и он всё сделает как надо.

    Давай приступим.

    Первым делом скачиваем последнюю версию библиотеки PHPMailer:
    https://github.com/PHPMailer/PHPMailer

    Из каталога src берем два файла: PHPMailer.php и SMTP.php.
    Эти файлы помещаем в свой проект, например, в папку PHPMailer

    Открываем оба файла и в самом верху удаляем строку:
    PHP:
    1. namespace PHPMailer\PHPMailer;
    И у одного и у второго файла. Эти заморочки нам ни к чему.

    Для удобства в той же папке создадим файл mail.php, в котором напишем небольшой класс.
    Я буду использовать параметры соединения для Яндекс почты.

    mail.php:

    PHP:
    1. require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/PHPMailer.php');
    2. require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/SMTP.php');
    3.  
    4. class mail extends PHPMailer {
    5.     public function __construct(){
    6.         $this->isSMTP();
    7.         $this->isHTML(true);
    8.         $this->CharSet = 'UTF-8';
    9.         $this->Host = 'ssl://smtp.yandex.ru';
    10.         $this->SMTPSecure = 'SSL';
    11.         $this->Port = 465;
    12.         $this->SMTPAuth = true;
    13.         $this->Username = 'ЛОГИН_ОТ_ПОЧТЫ'; // логин - до  @yandex.ru
    14.         $this->Password = 'ПАРОЛЬ_ОТ_ПОЧТЫ';
    15.         $this->setFrom('mail@exemple.ru', 'Name'); // почта и имя отправителя (эта информация будет приходить получателю. Почту я всегда указываю реальную.)
    16.     }
    17. }
    Этот класс нужен для того, чтобы не писать каждый раз параметры, которые не меняются.
    Теперь всё что нужно для отправки письма - это подключить файл mail.php и написать несколько строк кода:
    PHP:
    1. require_once($_SERVER['DOCUMENT_ROOT'].'/PHPMailer/mail.php');
    2.  
    3. $email = 'mail@example.com'; // почта получателя
    4. $subject = 'Тема письма';
    5. $html = '
    6. <html>
    7. <head><title>'.$subject.'</title></head>
    8. <body>
    9. <p>Текст письма</p>
    10. </body>
    11. </html>
    12. ';
    13.  
    14. $mail = new mail();
    15. $mail->addAddress($email);
    16. $mail->Subject = $subject;
    17. $mail->Body = $html;
    18. // $mail->addAttachment('/путь/к/файлу/файл', 'имя_файла'); // приложить файл, если нужно (можешь даже несколько)
    19. $mail->send(); // возвращает true/false в зависимости от результата
    На html письма есть серьёзные ограничения по сравнению в привычным HTML5.
    Об этом можно почитать в интернете по запросу в google "верстка писем".

    Метод addAttachment вторым параметром принимает имя файла, с которым файл придет получателю в письме. Т е ты можешь указать имя файла отличное от оригинального.

    Вот и всё. Теперь ты умеешь отправлять письма правильно. Поздравляю :)
     
    #1 TeslaFeo, 9 апр 2019
    Последнее редактирование: 9 апр 2019
    alexphp, artoodetoo и romach нравится это.
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.835
    Симпатии:
    651
    Прикол в том, что мучить пых SMTP-отправкой – это самый неправильный вариант. Но для шареда сойдет, так что зачет.
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    добавь аргументов)
    --- Добавлено ---
    я тебя понял
    ты имеешь в виду, что на VPS лучше поднять SMTP сервак и отправлять через него?
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.835
    Симпатии:
    651
    Нужно подумать :) Для меня это настолько очевидная вещь, что как-то не задумывался о том, что кому-то это еще нужно аргументировать.

    Не обязательно сервак. Для SMTP-отправки достаточно клиента.
     
  5. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    К сожалению, у меня это не сработало. Может быть, связано с тем, что это для яндекса, а я пытался отправить почту в гугл? Но для гугла я фактически поменял только вот эту строку:
    $this->Host = 'ssl://smtp.yandex.ru';
    на:
    $this->Host = 'ssl://smtp.google.com';

    И ещё хочу здесь поинтересоваться. Что выполняют эти две функции? Они необходимы?
    $this->isSMTP();
    $this->isHTML(true);
    Впрочем, у меня и без них почта не отправилась.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.835
    Симпатии:
    651
    @alexphp, набираю в поисковике «google smtp». О, чудо, вижу в топе ссылку на
    https://support.google.com/a/answer/176600?hl=ru

    Разворачиваю спойлеры и вижу всю необходимую инфу по вашему вопросу. Правда, это может касаться только пользователей G Suite.

    Вам что влом создать ящик на Яндексе для подобных пересылок?
     
    alexphp нравится это.
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    ну какбэ ясно по английски написано
    Это SMTP и это HTML :)
    да, эти методы нужны.

    У гугла всё чуть более заморочено.
    Во первых в любом случае нужно всё правильно указать в конфигах, но даже при это гугл может посчитать Ваше приложение не надёжным и не сработать.
    В настройках GMAIL можно разрешить работу с ненадежными приложениями, но только в том случае, если на аккаунте не включена двухфакторная аунтефикация. Вот такая длинная цепочка, которая может привести в никуда :)

    Можете, конечно, почитать как сделать своё приложение надёжным (я не читал), но можете просто не вникая в это всё создать аккаунт яндекса и настроить через него.
    Так же можно создать аккаунт гугла, не включать двухфакторную аунтефикацию, разрешить работу с ненадежными приложениями и работать с ним.
     
    alexphp нравится это.
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.835
    Симпатии:
    651
    У Яши тоже нужно специально включать или хотя бы проконтролировать возможность доступа со стороны «приложений» (это сейчас норма). Конкретно про двухфакторную там в настройках вроде не сказано. Видимо, предполагается, что если разрешаете доступ, то двухфакторной само собой не будет.
     
    alexphp нравится это.
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А если включена (как и должно быть), то приложению можно будет выдать персональный пароль.
     
    alexphp нравится это.
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Ну типа для браузерного пхп скрипта моветон коннектиться к внешним ресурсам, потому что это может занять несколько секунд, особенно если письмо с файлом. Под линуксом практически безраздельно рассылкой писем занимаемся Postfix . Он принимает письма в свою очередь как локальный SMTP и далее в фоновом режиме отправляет указанным в конфигурации образом - через яшу, гугл или как ещё угодно. Must know и must have в общем.
     
    alexphp и TeslaFeo нравится это.