Php отправка почты через yandex smtp. Отправка почты через SMTP с локального сервера

Главная / Установка программ

PHPMailer - очень удобная и популярная библиотека для отправки e-mail сообщений с вашего сайта. В этой статье рассказаны основные настройки библиотеки и приведены примеры кода для отправки сообщений. PHPMailer имеет в своем ассортименте пожалуй всё, что можно пожелать от работы с почтой: отправка разными способами, через разные серверы в т.ч. через smtp, возможность шифровать и подписывать ваши письма, чтобы не попадали в спам и многое другое.

Скачать библиотеку PHPMailer можно с https://github.com/PHPMailer/PHPMailer (кнопка "Clone or download").

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

Отправка писем через функцию mail() с помощью PHPMailer

Если вы хотите отправлять письма со своего хостинга через свой почтовый сервер, то всё довольно просто и будет выглядеть примерно так:

// Подключаем библиотеку PHPMailer use PHPMailer\PHPMailer\PHPMailer; require "PHPMailer/PHPMailer.php"; // Создаем письмо $mail = new PHPMailer(); $mail->setFrom("[email protected]", "Иван Иванов"); // от кого (email и имя) $mail->addAddress("[email protected]", "Вася Петров"); // кому (email и имя) $mail->Subject = "Тест"; // тема письма // html текст письма $mail->msgHTML("

Здравствуйте!

Это тестовое письмо.

"); // Отправляем if ($mail->send()) { echo "Письмо отправлено!"; } else { echo "Ошибка: " . $mail->ErrorInfo; }

Как видим, всё довольно просто: подключаем библиотеку, заполняем от кого, кому, тему и текст письма и отправляем. Отправка писем таким способом будет работать только с почтовых адресов вашего домена (если только они не привязаны к другим почтовикам).

Отправка писем через SMTP с помощью PHPMailer на примере Yandex и Google

Можно так же отправить письмо через другой почтовик, например, через Яндекс . Код будет выглядеть примерно так:

// Подключаем библиотеку PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; require "PHPMailer/PHPMailer.php"; require "PHPMailer/SMTP.php"; // Создаем письмо $mail = new PHPMailer(); $mail->isSMTP(); // Отправка через SMTP $mail->Host = "smtp.yandex.ru"; // Адрес SMTP сервера $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = "login"; // ваше имя пользователя (без домена и @) $mail->Password = "password"; // ваш пароль $mail->SMTPSecure = "ssl"; // шифрование ssl $mail->Port = 465; // порт подключения $mail->setFrom("[email protected]", "Иван Иванов"); // от кого $mail->addAddress("[email protected]", "Вася Петров"); // кому $mail->Subject = "Тест"; $mail->msgHTML("

Здравствуйте!

Это тестовое письмо.

"); // Отправляем if ($mail->send()) { echo "Письмо отправлено!"; } else { echo "Ошибка: " . $mail->ErrorInfo; }

Отправка писем через Google имеет один нюанс: нужно в аккаунте google разрешить доступ ненадежным приложениям . Для этого нужно зайти в свой аккаунт https://myaccount.google.com , перейти в безопасность, зайти в раздел "Ненадежные приложения, у которых есть доступ к аккаунту" и там переключить в "Разрешено". На момент написания статьи это страница https://myaccount.google.com/u/0/lesssecureapps .

$mail->Host = "smtp.gmail.com"; // Адрес SMTP сервера $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = "login"; // ваше имя пользователя $mail->Password = "password"; // ваш пароль $mail->SMTPSecure = "ssl"; // шифрование ssl $mail->Port = 465; // порт подключения

Если первый раз запускаете программу отправки через smtp, тогда желательно перед отправкой дополнительно использовать $mail->SMTPDebug = 1; чтобы получать все сообщения клиента и smtp-сервера, т.е. на экран выведется весь процесс подключения, авторизации и т.д., что очень полезно для отладки вашей программы.

Отправка письма с вложением с помощью PHPMailer

Здесь всё довольно просто, нужно лишь использовать метод addAttachment . Приведу пример, заодно продемонстрировав еще несколько дополнительных возможностей:

// Подключаем библиотеку PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require "PHPMailer/PHPMailer.php"; require "PHPMailer/Exception.php"; // Создаем письмо $mail = new PHPMailer; $mail->CharSet = "UTF-8"; $mail->setFrom("[email protected]", "Иван Иванов"); // от кого $mail->addReplyTo("[email protected]", "Иван Иванов"); // обратный адрес $mail->addAddress("[email protected]", "Вася Петров"); // кому $mail->Subject = "Тест"; // тема $mail->msgHTML(file_get_contents("contents.html"), __DIR__); // получаем "тело" письма из файла $mail->AltBody = "Письмо обычным текстом"; // письмо обычным текстом, если клиент не поддерживает html $mail->addAttachment("my_file.txt"); // прикрепляем один файл $mail->addAttachment("phpmailer.jpg"); // прикрепляем второй файл // Отправляем if ($mail->send()) { echo "Письмо отправлено!"; } else { echo "Ошибка: " . $mail->ErrorInfo; }

Адресов получателей можно добавить несколько с помощью addAddress. Или, если необходимо, можно наоборот, очистить все адреса получателей методом clearAddresses() . Очистить все вложения можно с помощью clearAttachments() .

Так же можно использовать AddEmbeddedImage чтобы добавить в письмо вложение (обычно изображения), которое предназначено для использования в html-коде и не будет доступно для скачивания. Пример использования картинки в письме, не доступной для скачивания:

// Подключаем библиотеку PHPMailer use PHPMailer\PHPMailer\PHPMailer; require "PHPMailer/PHPMailer.php"; //Создаем письмо $mail = new PHPMailer; $mail->IsHTML(true); $mail->setFrom("[email protected]", "Иван Иванов"); $mail->addAddress("[email protected]", "Вася Петров"); $mail->Subject = "Test"; $mail->AddEmbeddedImage("phpmailer.jpg","testImage"); $mail->Body = "

Изображение в html-коде

"; // Отправляем $mail->send();

Таким образом, вы можете отправлять письма с изображениями , которые есть только в теле письма, но их нельзя скачать как вложение. Эти изображения можно использовать в любом месте html-кода письма, нужно лишь указывать вместо url-адреса cid изображения, который вы использовали в AddEmbeddedImage.

Отправка подписанного и зашифрованного письма через PHPMailer

По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:

$mail->SMTPSecure = false; $mail->SMTPAutoTLS = false;

Чтобы подписать письмо подписью DKIM , необходимо выполнить несколько действий:

  • Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
  • Добавить DNS-запись для домена типа TXT с публичным ключом
  • Настроить DKIM подпись в PHPMailer перед отправкой письма

Теперь опишу каждый шаг немного подробнее.

Генерация приватного и публичного ключей

Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:

Openssl genrsa -out test-private.pem 1024 openssl rsa -in test-private.pem -out test-public.pem -pubout

Соответственно, test-private.pem и test-public.pem - это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.

Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:

$domain = "test.ru"; // ваш домен $privatekeyfile = "test-private.pem"; // имя файла, в который будет записан приватный ключ $publickeyfile = "test-public.pem"; // имя файла, в который будет записан публичный ключ if (file_exists($privatekeyfile)) { echo "

Using existing keys

"; $privatekey = file_get_contents($privatekeyfile); $publickey = file_get_contents($publickeyfile); } else { echo "

Create keys"; $pk = openssl_pkey_new([ "digest_alg" => "sha256", "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ]); openssl_pkey_export_to_file($pk, $privatekeyfile); $pubKey = openssl_pkey_get_details($pk); $publickey = $pubKey["key"]; file_put_contents($publickeyfile, $publickey); $privatekey = file_get_contents($privatekeyfile); } echo "

Private key (keep this private!):

" . $privatekey . "
"; echo "

Public key:

" . $publickey . "
";

Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи.

Добавление DNS-записи с публичным ключом

DNS-запись нужна, чтобы почтовые серверы, которые будут получать ваши письма, смогли проверить подпись на письме, прочитав DNS-запись вашего домена. Как правило, DNS-запись можно добавить в панели управления вашим доменом, либо в панели управления хостингом. Если не знаете, как добавить запись, обратитесь в поддержку вашего хостинг-провайдера.

Нужно добавить DNS-запись следующего вида:

Имя записи: mail._domainkey.test.ru. (в конце точка ".")

TTL: 3600 (или какое будет по-умолчанию)

Тип записи: TXT

Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ

В имени записи test.ru нужно заменить на имя вашего домена. Слова "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ" вы заменяете на текст, который вы получили на предыдущем шаге после "Public key", без "-----BEGIN PUBLIC KEY-----" и "-----END PUBLIC KEY-----", только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку , чтобы переводов строки не было.

Настройка подписи DKIM в PHPMailer и отправка письма

Теперь осталось лишь сделать несколько настроек PHPMailer перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:

// Подключаем библиотеку use PHPMailer\PHPMailer\PHPMailer; require "PHPMailer/PHPMailer.php"; // Создаем письмо $mail = new PHPMailer; $mail->CharSet = "UTF-8"; $mail->setFrom("[email protected]"); $mail->addAddress("[email protected]"); $mail->Subject = "Это тест"; $mail->msgHTML("

Это тест

"); // Настройка DKIM подписи $mail->DKIM_domain = "test.ru"; $mail->DKIM_private = "test-private.pem"; $mail->DKIM_selector = "mail"; // Отправляем $mail->send();

Разумеется, test.ru вы должны поменять на имя своего домена, а test-private.pem на полный путь и имя файла приватного ключа, который был создан на этапе генерации ключей.

Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.

Чтобы определенный сайт имел возможность качественно и продуктивно работать, к его созданию стоит подойти максимально ответственно и взвешенно. Особого внимания заслуживает выбор системы, которая будет использоваться при создании интернет-магазина. Дело в том, что коммерческая платформа, специализирующаяся на продажах товаров или услуг, должна позволять реализовать весь необходимый функционал и быть удобной в использовании, как для администраторов, занимающихся обслуживанием и наполнением сайтов, так и для клиентов интернет-магазинов. Многие люди и компании, которые встают перед вопросом подбора подходящей для себя CMS, анализируют: что выбрать Magento или OkayCMS. Давайте сравним особенности и возможности данных движков для сайтов.

При работе над собственным сайтом, человеку или компании предстоит приложить большие усилия - только в таком случае можно рассчитывать на положительные результаты и получение действительно эффективного инструмента. Одним из основополагающих вопросов, который предстоит решить еще до того, как начинать создание сайта, будет тот, как определиться с наиболее подходящим вариантом CMS. Далее мы сравним две CMS: Joomla или OkayCMS, обратим внимание на особенности каждой из них.

Наличие собственного сайта - одно из основополагающих требований для эффективного, успешно работающего бизнеса. Статистика однозначно свидетельствует в пользу возрастания числа покупок различных товаров и заказов услуг через интернет. Принимая это во внимание, большинство коммерческих компаний уже осознают необходимость наличия собственного сайта. Впрочем, одного только факта наличия интернет ресурса еще недостаточно, чтобы рассчитывать на его эффективность, рентабельность и ожидаемую для бизнеса пользу.

При подготовке к созданию собственного сайта или открытию интернет-магазина, необходимо принять во внимание и проанализировать немало вопросов, а также решить различные задачи. Только в таком случае можно рассчитывать на то, что ваш проект принесет положительные результаты и сможет в полной мере оправдать возлагаемые ожидания. Среди различных вопросов, связанных с разработкой интернет-магазина, особого внимания заслуживает вопрос выбора CMS. Чтобы вам было проще определиться с оптимальным для себя движком, в рамках

Планируя создание собственного сайта для будущего интернет-магазина, достаточно большое число человек и даже специализирующихся на продажах компаний становятся перед непростым и чрезвычайно важным выбором: на какой из существующих CMS остановиться. Если вы размышляете о том, что выбрать: PrestaShop или OkayCMS, предлагаем ознакомиться с данной статьей, в которой мы сравним две эти системы для создания интернет-сайтов, в частности, интернет-магазинов.

2019-08-05

Здравствуйте, уважаемый посетитель!

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

Итак, после того, как в последней статье мы подключили почту своего домена к одному из почтовых сервисов, теперь посмотрим, как можно отправлять email с сайта. Причем так, чтобы наши письма не попадали в СПАМ, а надежно, с высокой степенью вероятности, доставлялись до наших адресатов.

Вообще, для отправки писем в PHP существует встроенная функция mail(). Но следует отметить, что несмотря на простоту такого способа (в этом случае для отправки писем достаточно указать всего одну строку кода с определенными параметрами), применение такого варианта имеет существенный недостаток, связанный с проблемой СПАМа.

Дело в том, что фильтры антиСПАМа почтовых серверов на стороне получателя не очень жалуют письма, отправленные через функцию mail(). И в большинстве случаев такие сообщения фильтруются, либо вообще удаляться, не доходя до адресата.

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

Такой способ называется отправкой почты через SMTP с авторизацией. Который мы сегодня и рассмотрим на примере отправки формы обратной связи. Причем для этого будем использовать довольно известную и популярную библиотеку PHPMailer, позволяющую достаточно просто организовать отправку писем через SMTP.

  • Как мы будем отправлять письма обратной связи
  • Создаем форму обратной связи
  • Устанавливаем библиотеку PHPMailer
  • Формируем скрипт отправки почты через SMTP
  • Проверяем отправку email
  • Исходные файлы сайта

Как мы будем отправлять письма обратной связи

Перед тем, как приступить к практической работе по отправке писем обратной связи, сначала определимся, как мы это будем это делать.

Форма обратной связи предназначена для того, чтобы пользователь для связи с администратором сайта мог передать свое сообщение. Обычно, такая форма состоит из нескольких полей и кнопки "Отправить".

В принципе, для отправки email достаточно использовать всего лишь несколько полей, которые дают достаточную информацию о пользователе и содержании сообщения, такие как:

  • "Имя" - для ввода имени отправителя сообщения;
  • "E-mail" - для адреса электронной почты отправителя;
  • "Тема сообщения";
  • "Текст сообщения".

Хотя можно добавить и другие. Например, номер телефона, если, действительно, в этом есть необходимость.

В нашем случае такие письма будут отправляться на адрес администратора сайта с реального почтового ящика с авторизацией на том почтовом сервисе, к которому подключен наш домен.

Так как в предыдущей статье мы остановились на проверке подключения доменной почты к сервису Яндекс.Почта, то и оправлять почту будем для этого варианта. Хотя это не принципиально. Ниже будут отмечены те опции, при изменении которых можно будет отправлять email через почтовый сервер Mail.ru.

В качестве реального почтового ящика, с которого будут отправляться письма, будем использовать аккаунт вновь созданного пользователя доменной почты, скажем с адресом [email protected]. А отправлять эти письма будем на почтовый ящик администратора [email protected], который ранее мы создали в предыдущей статье.

Таким образом отправителем письма из формы обратной связи будет являться почтовый ящик [email protected]., а получателем - [email protected]. При этом вся информация о пользователе, отправившем сообщение с его содержанием будет передаваться в теле отправленного письма.

Создаем форму обратной связи

После того, как мы определились с самим порядком отправки писем, теперь создадим форму обратной связи, с помощью которой будем это делать.

Ниже показан HTML-код такой формы, который мы разместим на странице "Контакты" (файл kontakty.php в каталоге articles).

    "article" >

    Контакты

    Обратная связь

    "contact" action ="#" method ="post" >

    Форма обратной связи

    По всем вопросам, обращениям и деловым предложениям Вы можете связаться через приведенную ниже форму обратной связи.

    "contact-block" >

    "contact-input" >

    "text" id ="contact-name" name ="contact-name" title ="Имя должно быть на русском и содержать не менее 3 символов" pattern ="{3,}" required >

  1. "empty-contact" >

    "contact-input" >

    "email" id ="contact-email" name ="contact-email" required >

  2. "contact-subject" >

  3. "contact-comment" >

  4. "contact-button" >

    "submit" name ="contact-button" value ="Отправить" >

Рис.1 HTML-код формы обратной связи

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

Таким образом нужная форма создана. И теперь можно перейти к вопросам обработки и отправки данных в виде почтового сообщения.

Устанавливаем библиотеку PHPMailer

Как ранее отмечалось, для отправки почты мы будем использовать библиотеку PHPMailer, которая позволит существенно упростить отправку email через протокол SMTP с авторизацией на стороннем почтовом сервисе.

Для ее установки требуется скачать необходимые файлы. Это можно сделать с веб-сервиса GitHub, используя для этого Composer (пакетный менеджер зависимостей для PHP). Либо просто, скачать необходимые файлы обычным образом.

скриншот 73

Ниже показана страница веб-сервиса GitHub, где отмечена ссылка на обычное скачивание библиотеки PHPMailer.

Кроме этого, последнюю версию 6.0.7, которая была сохранена на момент написания данной статьи, можно скачать из прилагаемых материалов .

В любом случае полученный архивный файл следует распаковать, после чего извлеченную папку PHPMailer-master со всем содержимом поместить в корень сайта. При этом, для простоты, можно ее переименовать в PHPMailer. Ниже показано содержимое папки PHPMailer, помещенной в корневой каталог сайта.

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

Формируем скрипт отправки почты через SMTP

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

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

Но если этого будет недостаточно, то можно воспользоваться и документаций, в которой имеется описание всех свойств и методов данной библиотеки.

скриншот 74

Ниже приведен код скрипта отправки почты из формы обратной связи через SMTP с авторизацией. Где все строки, относящиеся к PHPMailer, даны с пояснения и выделены светлым фоном.

Остальная часть, включая фрагменты, касающиеся получения и обработки данных из формы, которые нам ранее уже приходилось использовать в других обработчиках, обозначены темным фоном. Достаточно подробно о них говорилось ранее в статье , посвященной, как раз, вопросам получения и проверке данных из формы в PHP. Где также рассказывалось об универсальной пользовательской функции проверки и обработки данных формы check_symbol() .

Данный скрипт разместим в том же файле kontakty.php, в котором ранее мы сформировали форму обратной связи.

    //----Скрипт отправки почты через SMTP с использованием PHPMailer----

    //Импорт классов PHPMailer в глобальное пространство имен. Они должны быть в верхней части скрипта, а не внутри функции

    use PHPMailer\PHPMailer\PHPMailer ;

    use PHPMailer\PHPMailer\Exception ;

    if (!empty ($_POST["contact-button" ])) {

    $name = $_POST["contact-name" ];

    $name = check_symbol ($name, "Имя" , "1" , "/^+\z/iu" );

    $email = $_POST["contact-email" ];

    $email = check_symbol ($email, "E-mail" , "1" , "/^+@(+\.)+{2,6}\z/i" );

    $subject = $_POST["contact-subject" ];

    $subject = check_symbol ($subject, "Тема сообщения" , "1" , "0" );

    $comment = $_POST["contact-comment" ];

    $comment = check_symbol ($comment, "Текст сообщения" , "1" , "0" );

    if (!empty ($GLOBALS["alert" ])) {

    $alert = "Данные из формы не отправлены. Обнаружены следующие ошибки: \n" .$alert;

    include "alert.php" ;

    else {

    //Подключение библиотеки

    require "PHPMailer/src/PHPMailer.php" ;

    require "PHPMailer/src/Exception.php" ;

    require "PHPMailer/src/SMTP.php" ;

    $mail = new PHPMailer (); //Инициализация класса

    $from = "[email protected]" ; //Адрес почты, с которой идет отправка письма

    $to = "[email protected]" ; //Адрес получателя

    $mail -> isSMTP (); //Применение протокола SMTP

    $mail -> Host = "smtp.yandex.ru" ;//Адрес почтового сервера

    $mail -> SMTPAuth = true ; //Включение режима авторизации

    $mail -> Username = "[email protected]" ; //Логин от доменной почты, подключенной к стороннему почтовому сервису (в данном случае в Яндекс.Почта)

    $mail -> Password = "27MrDon89" ; //Пароль от доменной почты

    $mail -> SMTPSecure = "ssl" ; //Протокол шифрования

    $mail -> Port = "465" ; //Порт сервера SMTP

    $mail -> CharSet = "UTF-8" ; //Кодировка

    $mail -> setFrom ($from, "Администратор" ); //Адрес и имя отправителя

    $mail -> addAddress ($to, "Администратор" ); //Адрес и имя получателя

    $mail -> isHTML (true ); //Установка формата электронной почты в HTML

    $mail -> Subject = "Отправлена форма обратной связи" ; //Тема письма (заголовок)

    $mail -> Body = "

    Имя отправителя: $name

    Адрес отправителя: $email

    Тема сообщения: $subject

    Содержание сообщения: $comment

    " ; //Содержимое письма

    $mail -> AltBody = "Текст альтернативного письма" ; //Альтернативное письмо в случае, если почтовый клиент не поддерживает формат HTML

    $mail -> SMTPDebug = 0 ; //Включение отладки SMTP: 0 - выкл (для штатного использования), 1 = сообщения клиента, 2 - сообщения клиента и сервера

    if ($mail -> send ()) {

    $alert = "Сообщение отправлено" ; //Вывод сообщения в диалоговом окне браузера об успешной отправке письма

    else {

    $alert = "Ошибка, письмо не может быть отправлено: " .$mail -> ErrorInfo ; //Вывод сообщения об ошибке

    include "alert.php" ;

Рис.5 Скрипт для отправки email через SMTP с авторизацией

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

1. В связи с тем, что письмо оправляется со стороннего почтового сервиса, то здесь применены настройки, соответствующие конкретному SMTP серверу. В данном случае, для варианта использования сервера Яндекс.Почта применены следующие значения свойств:

  • Свойство Host (поз.28) - Адрес почтового сервера со значением smtp.yandex.ru;
  • Свойство SMTPSecure
  • Свойство Port

Эти значения свойств были взяты со страницы Яндекс.Помощь, приведенной на следующем скриншоте.

Но такую информацию можно получить и из других ресурсов. Для этого достаточно в поисковике ввести соответствующий запрос, например: "smtp сервер яндекс". Где можно найти большое количество ссылок по этому вопросу.

Аналогичным образом значения настроек можно получить и по другим SMTP серверам. Ниже показан скриншот страницы Помощи Mail.ru, где отображены настройки SMTP сервера почтового сервиса Mail.ru.

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

  • Свойство Host (поз.28) - Адрес почтового сервера (smtp.mail.ru);
  • Свойство SMTPSecure (поз.32) - Протокол шифрования (ssl);
  • Свойство Port (поз.33) - Порт сервера SMTP (465).

Подобный подход следует применять и для других почтовых сервисов.

2. В свойстве Username (поз.30) необходимо указывать полный адрес почтового ящика доменной почты. В данном случае в качестве логина от почтового ящика, с которой идет отправка писем, используется "[email protected]".

Однако, если для отправки писем использовать учетную запись не доменной почты, а адрес, относящийся непосредственно к почтовому сервису, например "[email protected]", то тогда логином должна является только часть адреса до знака "@". В этом случае логин имел бы значение "feedback".

3. В PHPMailer предусмотрено свойство SMTPDebug (поз.50), которое позволяет отображать на экране браузера различный уровень ошибок. Такая возможность значительно упрощает нахождение проблем при отладке скрипта.

Обычно, в штатном режиме, при установленном значении 0, вывод подробной информации об ошибке отключен. Но при возникновении проблем с отправкой почты, либо при отладке, для вывода более содержательной информации об ошибке, возможно использовать другие значения.

Для того, чтобы посмотреть, как это выглядит на практике, временно внесем в настройки какую-нибудь ошибку. Например, в пароль от доменной почты (свойство Password , поз.31). А также для вывода подробной информации об ошибке, временно установим в свойстве SMTPDebug (поз.50) значение 1. После, когда все будет отлажено и проверено, отключим режим отладки SMTP, заменив 1 на 0.

В завершающей части скрипта, после указания всех необходимых свойств и методов, для отправки письма применен метод send() ) (поз.51). И если письмо будет отправлено, и метод send() для объекта $mail вернет true, то в диалоговом окне браузера через переменную $alert будет выведено сообщение об успешной отправке почты (поз.52).

В случае же, если почта по каким-либо причинам не смогла быть отправлена, и соответственно, метод не смог вернуть истину, то такое состояние будет сопровождаться соответствующим сообщением об ошибке (поз.55).

Проверяем отправку email

После того, как мы составили скрипт отправки почты, естественно, нужно посмотреть на результат нашего "творчества". Все ли мы здесь учли, и не наделали ли каких-либо ошибок.

Для этого попробуем, как и было задумано, отправить из формы обратной связи сообщение от пользователя администратору сайта. Ниже показан скриншот формы обратной связи с заполненными полями до ее отправки.

А здесь показан результат отправки формы.

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

Но, так как сейчас свойству SMTPDebug (поз.50) присвоено значение 1, то мы сможем посмотреть подробную информацию о возникшей ошибки и выяснить причину ее возникновения.

На следующем скриншоте видно, что при попытке соединения обнаружена ошибка аутентификации, означающая использование неправильного логина или пароля.

После устранения несоответствия пароля (ранее использовался неправильный пароль для возможности проверки вывода дополнительной информации об ошибке), снова попытаемся отправить почту.

На этот раз, как будто, все прошло удачно, и мы получили сообщение об успешной отправке почты. По всей видимости, кроме заведомо введенной временной ошибки в пароль от доменной почты, никаких других оплошностей мы не допустили.

Но для того, чтобы убедиться, что письмо действительно было доставлено до адресата, войдем в почту с адресом [email protected] и посмотрим на результат.

Как видно, письмо с адреса [email protected], с которого мы отправляли почтовое сообщение с именем "Обратная связь" до администратора сайта благополучно дошло. При этом в теле письма имеется все то содержимое, которое мы формировали в скрипте с использованием данных, полученных из формы обратной связи, а именно:

  • Имя отправителя: Николай;
  • Адрес отправителя: [email protected];
  • Тема сообщения: Проверка отправки почты;
  • Содержание сообщения: Тестовое сообщение.

Теперь, после успешной проверки отправки почты можно будет отключить режим отладки SMTP, назначив свойству SMTPDebug (поз.50) значение 0.

Таким образом мы выполнили задачу по созданию инструмента отправки почты через SMTP с авторизацией с использованием стороннего почтового сервера.

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

Исходные файлы сайта

Исходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

  • Файлы каталога www
  • Таблицы базы данных MySQL

В PHP достаточно популярно использовать скрипты которые автоматизируют процесс отправки писем. В данной статье мы рассмотрим простой скрипт который выполняем отправку писем на почту получателей по средствам SMTP(Simple Mail Transfer Protocol ). Было бы слишком просто ограничится только этим функционалом, скрипт поддерживает и вложения то есть, вы сможете прикрепить pdf, txt или doc файл в своем письме.

Настройка скрипта довольно проста, от вас требуется только данные отправителя логин, пароль от электронной почты с которого будут отправляться письма.

Скрипт работает с классом km_smtp_class.php, класс хорош тем, что поддерживает разные протоколы SSL и TLS которые предоставляют защищенную передачу данных.

Вот и сам скрипт:

"smtp.mail.ru", "SMTP_port" => "25", "SMTP_email" => "[email protected]", "SMTP_pass" => "1111111", "SMTP_type" => "null"); // Email получателя $Receiver = "[email protected]"; // Тема сообщения $Subject = "Отправляем письмо из PHP"; // Текст сообщения (в HTML) $Text = "Привет!
Сообщение отправлено из скрипта Mowshon Сайт: http://сайт"; // Вложение в письме - адрес к файлу $Attachment = ""; /* $mail = new KM_Mailer(сервер, порт, пользователь, пароль, тип); */ /* Тип может быть: null, tls или ssl */ $mail = new KM_Mailer($SenderConfig["SMTP_server"], $SenderConfig["SMTP_port"], $SenderConfig["SMTP_email"], $SenderConfig["SMTP_pass"], $SenderConfig["SMTP_type"]); if($mail->isLogin) { // Прикрепить файл if($Attachment) {$mail->addAttachment($Attachment);} // Добавить ещё получателей $mail->addRecipient("[email protected]"); $mail->addRecipient("[email protected]"); /* $mail->send(От, Для, Тема, Текст, Заголовок = опционально) */ $SendMail = $mail->send($SenderConfig["SMTP_email"], $Receiver, $Subject, $Text); // Очищаем список получателей $mail->clearRecipients(); $mail->clearCC(); $mail->clearBCC(); $mail->clearAttachments(); } else { echo "Возникла ошибка во время подключения к SMTP-серверу"; } ?>

Настройка скрипта лежим в основном на массиве $SenderConfig , тут мы должны указать SMTP:сервер, порт, логин и пароль от электронной почты. Опишем каждый ключ массива:

SMTP_server - адрес SMTP сервера (индивидуальный адрес для разных почт)

Почта Mail.ru : smtp.mail.ru порт: 25, 587 и 465 (с шифрованием SSL)

Почта Yandex : smtp.yandex.ru порт: 25, 587 465 (SSL порт)

Почта Rambler : mail.rambler.ru порт: 25, 587 465 (SSL порт)

Почта Yahoo : smtp.mail.yahoo.com SSL-порт: 465

(Если понадобится адрес smtp серверов которые нет в списке - пишите в комментариях)

SMTP_port - Мы его сверху уже описали для каждого smtp сервера.

SMTP_email - точнее было бы user но для ясности написал email, указываем адрес электронной почты.

SMTP_pass - Пароль от электронной почты которая была указана как значение в ключе SMTP_email


SMTP_type - По умолчанию NULL. Протокол по которому будут отправлены письма. Протоколы: SSL и TLS

Вложения в письмо можно добавить просо указывая полный адрес к файлу в переменную $Attachment (/var/patch/to/file/File.pdf)

Если будут вопросы пишите их в комментариях ниже.

Поскольку отправка анонимных сообщений с серверов виртуального Windows-хостинга запрещена, отправку писем следует производить через SMTP-сервер , для чего так же возможно использовать и нашу почтовую систему.

Как отправлять письма, используя PHP?

С помощью любого класса PHP, поддерживающего авторизацию на smtp-сервере . Например, можно использовать набор классов PHPMailer.

Также вы можете воспользоваться нашим примером, в котором реализована отправка писем с использованием smtp-сервера , для которого требуется авторизация. Поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

// Если нужно показать лог SMTP-сессии, то можно раскомментировать следующую строчку. // $_SERVER["debug"] = true; function MailSmtp ($reciever , $subject , $content , $headers , $debug = 0 ) { $smtp_server = "smtp.сайт" ; // адрес SMTP-сервера $smtp_port = 25 ; // порт SMTP-сервера $smtp_user = "[email protected]" ; // Имя пользователя для авторизации на SMTP-сервере $smtp_password = "pAsSwORd" ; // Пароль для авторизации на SMTP-сервере $mail_from = "[email protected]" ; // Ящик, с которого отправляется письмо $sock = fsockopen ($smtp_server , $smtp_port , $errno , $errstr , 30 ); $str = fgets ($sock , 512 ); if (! $sock ) { printf ("Socket is not created\n" ); exit(1 ); } smtp_msg ($sock , "HELO " . $_SERVER [ "SERVER_NAME" ]); smtp_msg ($sock , "AUTH LOGIN" ); smtp_msg ($sock , base64_encode ($smtp_user )); smtp_msg ($sock , base64_encode ($smtp_password )); smtp_msg ($sock , "MAIL FROM: <" . $mail_from . ">" ); smtp_msg ($sock , "RCPT TO: <" . $reciever . ">" ); smtp_msg ($sock , "DATA" ); $headers = "Subject: " . $subject . "\r\n" . $headers ; $data = $headers . "\r\n\r\n" . $content . "\r\n." ; smtp_msg ($sock , $data ); smtp_msg ($sock , "QUIT" ); fclose ($sock ); } function smtp_msg ($sock , $msg ) { if (! $sock ) { printf ("Broken socket!\n" ); exit(1 ); } if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) { printf ("Send from us: %s
" , nl2br (htmlspecialchars ($msg ))); } fputs ($sock , " $msg \r\n" ); $str = fgets ($sock , 512 ); if (! $sock ) { printf ("Socket is down\n" ); exit(1 ); } else { if (isset($_SERVER [ "debug" ]) && $_SERVER [ "debug" ]) { printf ("Got from server: %s
" , nl2br (htmlspecialchars ($str ))); } $e = explode (" " , $str ); $code = array_shift ($e ); $str = implode (" " , $e ); if ($code > 499 ) { printf ("Problems with SMTP conversation.

Code %d.
Message %s
"
, $code , $str ); exit(1 ); } } } ?>

Скачать пример готового скрипта с функцией MailSmtp(): smtpauth.php.sample

Использовать описанную выше функцию MailSmtp() можно для прямой замены функции mail(), рассмотрим пример самой простой формы на PHP:

// Заголовки сообщения, в них определяется кодировка сообщения, поля From, To и т.д. $headers = "MIME-Version: 1.0\r\n" ; $headers .= "Content-type: text/html; charset=windows-1251\r\n" ; $headers .= "To: $to \r\n" ; $headers .= "From: Имя отправителя " ; // mail ($to, $subject, $message, $headers); require_once "smtpauth.php" ; MailSmtp ($to , $subject , $message , $headers ); } ?>
Кому: 
 Тема: 
 Текст: 
 
 

Для того, чтобы данная форма заработала без функции mail(), мы включили файл smtpauth.php через require_once и вызвали функцию MailSmtp(), описанную в нем, с аналогичными для mail() аргументами. При этом сам вызов mail() мы закомментировали в коде, чтобы избежать ошибки при выполнении скрипта.

Как отправлять письма, используя ASP.NET?

Если вы используете версию 2.0, то используя класс MailMessage System.Net.Mail ), хорошо описанный .

Ниже приведены примеры его использования для языков «C#» и «VisualBasic»:

Пример для языка «C#»:

<% @Page Language="c#" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% MailMessage message = new MailMessage(); // создание нового письма message.To.Add ("[email protected]"); // добавление адреса получателя message.From = new MailAddress("from@domain.tld ", "Имя_отправителя"); // указание имени и адреса отправителя message.Subject = "Тема письма"; // указание темы письма message.BodyEncoding = System.Text.Encoding.UTF8; // указание кодировки письма message.IsBodyHtml = false; // указание формата письма (true - HTML, false - не HTML) message.Body = "Текст письма"; // указание текста (тела) письма SmtpClient client = new SmtpClient("smtp.сайт",25); // создание нового подключения к серверу "smtp.сайт" client.DeliveryMethod = SmtpDeliveryMethod.Network; // определяет метод отправки сообщений client.EnableSsl = false; // отключает необходимость использования защищенного соединения с сервером client.UseDefaultCredentials = false; // отключение использования реквизитов авторизации "по-умолчанию" client.Credentials = new NetworkCredential("postmaster@domain.tld ", "***password***"); // указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере client.Send(message); // отправка сообщения %>

Скачать пример готовой формы, демонстрирующей использование данного метода: MailForm.aspx .

Пример для языка «VisualBasic»:

<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Net.Mail" %> <% @Import Namespace="System.Net" %> <% Dim smtpMssg AS new MailMessage smtpMssg.From = New MailAddress ("admin@domain.tld ", "Имя_отправителя") smtpMssg.To.Add ("[email protected]") " добавление адреса получателя smtpMssg.Subject = "Тема письма" " указание темы письма smtpMssg.Body = "Текст письма" " указание текста (тела) письма smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 " указание кодировки письма smtpMssg.IsBodyHtml = false " указание формата письма (true - HTML, false - не HTML) Dim SmtpMail As New SmtpClient("smtp.сайт", 25)" объявление нового объекта типа "SmtpClient" SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network " указание метода доставки письма SmtpMail.UseDefaultCredentials = False " отключение использования реквизитов авторизации "по-умолчанию" SmtpMail.EnableSsl = False " отключает необходимость использования защищенного соединения с сервером SmtpMail.Credentials = new NetworkCredential("postmaster@domain.tld ", "***password***") " указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере SmtpMail.Send(smtpMssg) " отправка сообщения %>

Также существует устаревший (и не рекомендуется к использованию) класс SmtpMail (используется пространство имен System.Web.Mail ). Ниже приведен пример его использования для языка «VisualBasic»:

<% @Page Language="VB" Debug="true" %> <% @Import Namespace="System.Web" %> <% @Import Namespace="System.Web.Mail" %> <% Dim smtpMssg = new MailMessage " объявление нового объекта типа "MailMessage" smtpMssg.From = "Имя_отправителя domain.tld >" " указание имени и адреса отправителя smtpMssg.To = "admin@domain.tld " " указание адреса получателя smtpMssg.BodyFormat = MailFormat.Text " указание формата письма smtpMssg.BodyEncoding = Encoding.UTF8 "указание кодировки письма smtpMssg.Subject = "Тема письма" " указание темы письма smtpMssg.Body = "Текст письма" " указание текста письма smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1) " указание необходимости SMTP-авторизации на сервере smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "admin@domain.tld ") " имя пользователя для авторизации smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "***password***") " пароль для авторизации SmtpMail.SmtpServer = "smtp.сайт" " указание адреса SMTP-сервера SmtpMail.Send(smtpMssg) " отправка сообщения %>

Как отправлять письма, используя ASP?

Обратите внимание, что при использовании нашего smtp-сервера требуется авторизация, поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

<% iConfig = Server.CreateObject("CDO.Configuration") Set iConfig = Server.CreateObject("CDO.Configuration") With iConfig.Fields .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.сайт" .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "ru" .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "postmaster@domain.tld " .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password" .Update End With Set cdoMessage = CreateObject("CDO.Message") With cdoMessage Set .Configuration = iConfig .From = "Test user domain.tld >" .To = "User " .Subject = "Hello, User" .TextBody = "I write this message from ASP script." .Send End With Set cdoMessage = Nothing Set iConfig = Nothing %>

Некоторые CMS уже имеют встроенные средства для отправки корреспонденции или соответствующие модули, рассмотрим самые популярные из них.

Wordpress

Для данной CMS существует специальный модуль «WP Mail SMTP », пример его конфигурации описан на странице модуля .

Обратите внимание на иллюстрацию в примере, в условиях нашей почтовой системы требуется использовать 25-й порт и SSL-шифрование не требуется.

Joomla

В панели администрирования перейдите в раздел «Общие настройки», выберете вкладку «Сервер». В поле «Почта» требуется выбрать способ отправки как «SMTP-сервер », в полях «Адрес SMTP-сервера » и «SMTP-логин » и «SMTP-пароль » укажите соответствующие реквизиты почтовой системы, например: smtp.сайт, ящик@ваш_домен и соответствующий пароль.

Drupal

Эта CMS так же имеет собственный модуль для работы с SMTP-сервером , основанный на базе PHPMailer. Загрузить данный модуль можно на его странице на сайте CMS Drupal, описание установки модуля доступно в архиве с ним.

NetCat

Данная CMS не имеет встроенных функций для работы с SMTP-сервером . Для отправки почты скриптами сайта мы можем предложить использовать наше решение, для его подключения необходимо выполнить следующие действия:

  • Скачать с нашего сайта архив с необходимыми файлами (send_auth_mail.php и mail.inc.php ) и распаковать его на компьютере;
  • Отредактировать файл send_auth_mail.php из архива, указав в нём реквизиты подключения к нужному SMTP-серверу:

    • $mail_smtpServer = "smtp.сайт" ; (адрес SMTP-сервера )
    • $mail_port = "25" ; (порт для подключения)
    • $mail_username = "[email protected]" ; (имя пользователя для авторизации на SMTP-сервере )
    • $mail_password = "Password" ; (пароль для авторизации на SMTP-сервере )
  • Создать резервную копию файла domain.tld/www/netcat/admin/mail.inc.php ;
  • Загрузить файлы send_auth_mail.php и mail.inc.php на виртуальную площадку в директорию domain.tld/www/netcat/admin/

domain.tld следует заменить на имя вашего домена.

Предлагаемое решение работает со всеми модулями NetCat, которые используют стандартные функции данной CMS для отправки почты.

© 2024 ermake.ru -- Про ремонт ПК - Информационный портал