Библиотека PHPMailer. Отправка почты через SMTP

Библиотека PHPMailer. Отправка почты через SMTP

От автора: отправка почты с сайта на email – это довольно обыденная и несложная задача. Для этого в PHP предусмотрена функция mail(), которой достаточно передать несколько параметров, и ваше письмо уйдет на указанную электронную почту. Но вот дойдет ли?

скачать исходникискачать урок

Именно на этот вопрос мы и попробуем найти ответ в этом уроке.

Причина, по которой отправленное письмо может быть не получено адресатом – это антиспамовые фильтры. Почтовые сервисы, как могут, пытаются бороться с получением спама. Также антиспамовые фильтры не очень «любят» письма, отправленные функцией mail(). В результате этого письмо попадет в папку Спам, в лучшем случае, или же попросту будет удалено антиспамовым фильтром.

Как же здесь быть? Выход прост: можно отправлять почту через SMTP популярных почтовых сервисов. Например, через gmail.com. Для этого всего-то нужно иметь почтовый ящик того почтового сервиса, протокол которого будем использовать. В уроке я буду использовать сервис mail.ru, поскольку там гораздо проще завести тестовый почтовый ящик. Однако, если вы захотите использовать сервис gmail.com, то порядок действий будет одним и тем же.

Для того, чтобы не писать весь код с нуля, мы воспользуемся популярной библиотекой PHPMailer, позволяющей выполнить, пожалуй, любую задачу, связанную с отправкой почты.

В видео версии урока вы найдете подробное комментирование процесса отправки почты. Для примера мы отправим 2 типа писем на различные почтовые сервисы: это будет письмо формата HTML и письмо с вложением. Как вы увидите, процесс использования библиотеки PHPMailer предельно прост.

На этом я с вами прощаюсь. Удачи и до новых встреч!

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: , ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (30)

  1. Дмитрий

    Великолепный урок! Спасибо вам большое!

  2. Александр

    Хороший урок, благодарю!

  3. murad

    у меня все правда но дает ошибку — Письмо не может быть отправлено. Ошибка: SMTP connect() failed.

    • Андрей Кудлай

      Опишите конкретнее проблему на нашем форуме: на каком сервере пробуете, приложите исходный код.

  4. Ilya

    Сделайте пжлст продолжение этого урока, только как дополнение — отправка через SMTP, с прикруткой своего домена (что бы в отправителе был не сервер SMTP, а например user@mydomain.ru) и желательно с подтверждением домена по DKIM, что бы с спам не кидало.
    Спасибо.

  5. андрей

    Здравствуйте, не от рабатывается проверка условия вот в этой часть кода(уведомления об отправки песьма):

    function(res){
    if( res == 1 )….
    ……..}

    alert (res)

    Вы даёт:
    CLIENT -> SERVER: ……..
    CLIENT -> SERVER: ……..
    CLIENT -> SERVER: ……..
    ……
    …..
    CLIENT -> SERVER: ……..
    CLIENT -> SERVER: ……..
    CLIENT -> SERVER: ……..
    1

    Единица идёт последней строкой.

    Как мне правельно праверить ответ сервера if( res == 1 )

    • Андрей Кудлай

      Здравствуйте, Андрей.
      Что-то я ничего из выложенного кода не понял… судя по наличию кода на JS, подозреваю, что хотите прикрутить асинхронную отправку писем. Если я прав, то посмотрите этот урок — Библиотека PHPMailer. Отправка писем средствами AJAX. Если все же делаете что-то другое, тогда создайте тему на нашем форуме, там удобнее решать вопросы, связанные с кодом.

  6. Андрей

    Здравствуйте, ошибся уроком хотел задать вопрос здесь: Библиотека PHPMailer. Отправка писем средствами AJAX.

    Ошибка была в том что в PHP-части не убрал вот это $mail->SMTPDebug = 1;

  7. Александр

    Здравствуйте, Андрей! Подскажите пожалуйста, а как можно сделать функцию уведомления о новом комментарие на @mail к определённой статье на сайте?
    Как сделать это в целом по логике понятно: например в БД хранить конфиг для каждого пользователя о том, отправлять ли ему на @mail сообщение о новом комментарии к статье на сайте или нет.
    Но как сделать, например, если пользователь хочет получать уведомления только к конкретной статье? Например, только к статье №1, а новые комменты к статье №2 ему уже не нужны. Хранить в БД настройку конфига по каждой статье, думаю не совсем рационально! Что если на сайте тысячи статей, а пользователь хочет получать уведомления только, скажем для десяти из них?!
    Подскажите логику! Так, как сделано у Вас на сайте: мне приходят на почту письма о новых комментариях к статьям, только по тем, напротив которых я отмечал галочку «Уведомить меня об ответах на мой комментарий по e-mail.».

    • Андрей Кудлай

      Здравствуйте, Александр.
      Как вариант, можно создать таблицу подписки, в которой будут храниться ID статей и ID пользователей, подписанных на статью. При добавлении нового комментария из этой таблицы получаем всех пользователей, оформивших подписку к этой статье, и отправляем им уведомления.

      • Александр

        Спасибо за ответ, Андрей! А как бы Вы посоветовали тогда лучше хранить данные id пользователей?
        1) для каждого пользователя отдельная строка в таблице, например id статьи(4) — id_user (5), id статьи (4) -id_user(6) и т.д. с типом поля id_user(«int»);
        2) id статьи(4) — ячейка таблицы в виде строки id пользователей через разделитель, с типом поля id_user(«text»);
        3) id статьи(4) — ячейка таблицы в виде массива (сериализованные данные) id пользователей в массиве, с типом поля id_user(«BLOB»);

        • Андрей Кудлай

          Первый вариант и по ID статьи получаем всех пользователей. Что-то вроде такого: SELECT user_id FROM subscription WHERE article_id = $article_id. В итоге получим ID всех юзеров, которым нужно отправить письма. Ну а объединив с таблицей пользователей, можем обойтись одним запросом, примерно такого вида:
          SELECT subscription.user_id, users.email FROM subscription LEFT JOIN users ON subscription.user_id = users.user_id WHERE article_id = $article_id

          • Александр

            Спасибо за ответы и за советы! Всегда всё чётко, быстро и по существу! Буду действовать! :-)

          • Андрей Кудлай

            Пожалуйста)

  8. Сергей

    Спасибо за прекрасный урок и библиотеку, Андрей.
    В уроке был описан способ для MAIL.RU, но вот с GMAIL возникла ошибка SMTP connect() failed. Дело в том что google блокирует доступ новым устройствам и приложениям. Чтобы исправить данную проблему откройте страницу http://www.google.com/accounts/DisplayUnlockCaptcha и выполните вход с именем пользователя и паролем Gmail. Если необходимо, введите буквы, изображенные на искаженной картинке.
    Доступ предоставлен
    Теперь вы можете войти в свой аккаунт Google с помощью нового устройства или приложения.
    PhpMailer больше ошибки не выдает и письмо отправляются с gmail-a

  9. Сергей

    Спасибо!!! Все работает!!! Три дня тщетных поисков нормального варианта и наконец-то ВЫ !!! А-а-а-а-а-а ))))

    Хочу выразить всем участникам WebForMySelf огромное человеческое спасибо за труд, за выдержку, за понимание. Отдельное спасибо — для Андрея Кудлай. Помните, по вашим стопам идут много новичков! Вы в ответе за тех, кого приручили. )))

    P.S. Пожелание (наблюдение). Рассмотрите возможность увеличения списка доступных к бесплатному просмотру/скачиванию уроков представленных курсов, которые раньше были на платной основе, сверх списка «заманушных» уроков. Обоснование — моральное устаревание материала, нахождение материала на других ресурсах в открытом доступе и т.д. Например: курс состоит из 52 уроков, из которых 4 «заманушных», остальные — платные. Даже если каждый месяц открывать по одному платному уроку, то это будет происходить в течение (52-4)/12=4 года. Я просто указываю направление, а вы подумайте.
    Еще раз — огромное спасибо!

    • Андрей Кудлай

      Пожалуйста, Сергей)
      Относительно пожелания-наблюдения… уже думаем ;)

  10. Дмитрий

    Здравствуйте! У при отправке не выдает никаких ошибок, но страница грузится бесконечно, т.е. не может загрузиться. Постоянно вращается загрузка

    • Андрей Кудлай

      Здравствуйте. Возможно не удается получить ответ от почтового сервиса. Возможно что-то не так с настройками Вашего сервера. Сложно сказать что не так, не работая с Вашим кодом на Вашем сервере. Попробуйте поменять почтовый сервер (google, yandex, mail). Если не поможет, тогда нужно смотреть, скорее всего что-то с сервером.

  11. ti.vogliamo.bene.angelo@yandex.ru

    Здравствуйте. в связи с чем может быть такая ошибка?

    Письмо не может быть отправлено. Ошибка: SMTP connect() failed.
    Все делалось по данному уроку, но, увы, не работает.

    • Андрей Кудлай

      Здравствуйте. В ошибке говорится об ошибке соединения. Проверьте настройки соединения, а также убедитесь, что в PHP включено расширение php_openssl и на сервере включен OpenSSL. Все это возможные причины.

  12. Абай

    Здраствуйте! В майл ру выдает такое сообщение: Ваше сообщение не доставлено. Mail failure, не отправляется письмо.

    • Андрей Кудлай

      Здравствуйте.
      Включите расширенную отладку и посмотрите подробное сообщение об ошибке.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree