Именно эта функция реализована по умолчанию в качестве отправки Email. Данный функционал не требует стороннего сервера для пересылки Email. Для того чтобы проверить корректность данной функции достаточно создать в папке с сайтом файл test.php и разместить туда следующий код:
Где вместо "EMAIL ПОЛУЧАТЕЛЯ" введите Email, на который должно прийти письмо.
Поместите данный файл в корне вашего сайта.
Далее в адресной строке введите www.ВашДомен/test.php . В случае если на указанную почту пришло письмо, то Ваш хостинг корректно работает с функцией отправки писем "Mail PHP" . Не исключено что письмо попало в спам, так что его тоже необходимо проверить.
Если письмо пришло в непонятной кодировке, поменяйте строку: "Проверка отправки почты" на "Проверка отправки почты", "Content-type:text/html;charset=utf-8" .
И повторите отправку письма через адресную строку Вашего браузера.
Если после проделанных манипуляций тестовое письмо не пришло к конечному получателю необходимо обратиться в техподдержку Вашего хостинга.
Из недостатков данного метода стоит отметить не постоянность работы данного способа. Могут возникать перебои в отправки писем на стороне хостинга.
Главный же недостаток данного метода заключается в том, что все письма, пришедшие на email клиентов, не будут распознаваться почтовыми сервисами (gmail, mail.ru, yandex.ru) такими, что были отправлены напрямую с Вашего сайта.
Почтовый сервис Gmail отображает данные письма со знаком вопроса и подписью: "Системе Gmail не удалось подтвердить, что это письмо отправлено из домена ВашДомен Возможно, это спам”.
Чтобы избежать данной ситуации .
SMTP - протокол передачи почты. В общей сложности для настройки передачи почты посредством данного протокола необходим сам SMTP сервер. Наиболее распространенный вариант использования корпоративной (доменной) почты yandex.ru в качестве SMTP сервера https://pdd.yandex.ru/ .
Прежде всего необходим аккаунт (почта) yandex , на основании которой будут созданы почты для Вашего домена: "order@ВашДомен" "info@ВашДомен"… Основной аккаунт нигде не будет виден и используется только лишь для того чтобы в дальнейшем на его основании создавать доменные почты.
После авторизации в своем личном аккаунте yandex создается доменная почта по ссылке https://pdd.yandex.ru/ . Именно эту доменную почту будут видеть пользователи в поле “Отправитель”
Поле "Отправитель" является обязательным при отправки писем посредством SMTP. Используя SMTP в качестве отправки писем, реализуется связка "Домен" - " Email" , тем самым письма распознаются почтовыми сервисами.
Из недостатков данного метода стоит отметить невозможность "подгрузки" портрета доменной почты, так как сами почтовые сервисы пока что не предоставляют данный функционал.
Давно искал решение, чтобы отправлять письма пользователям не через функцию mail() в PHP, а через SMTP почтовых серверов. В интернете информации разнообразной не так много, а то что есть — работает не совсем так, либо вообще не работает. Поэтому я собрал все во едино и написал свой код, основываясь на уже готовые, которые представлены на сайтах.
У меня ответ довольно простой — какое-то время через мой сервер вирусяки отправляли тонны писем, что привело в БАНу моего IP-адреса у многих почтовиков, в частности у gmail.com, а в связи с этим пользователи могли получать письма, поэтому пришлось искать альтернативу, и я ее нашел — это SMTP
Возможно, вас заинтересует, чем же мой скрипт лучше других, которые валяются на просторах?! Отвечу
Вот достоинства моего скрипта, коих я не нашел каком-либо в интернете, но из каждого я взял все необходимо. И так, давайте рассмотрим код.
Function smtpmail($mail_to, $subject, $message, $service="yandex") { $config["smtp_charset"] = "windows-1251"; //кодировка сообщений. (или UTF-8, итд) $config["smtp_from"] = "mashintop.ru"; //Ваше имя - или имя Вашего сайта. Будет показывать при прочтении в поле "От кого" $config["smtp_debug"] = false; //Если Вы хотите видеть сообщения ошибок, укажите true вместо false $config["smtp_port"] = "25"; // Порт работы. Не меняйте, если не уверены. if($service=="yandex") { $config["smtp_searcher"] = "yandex.ru"; $config["smtp_email"] = "[email protected]"; $config["smtp_username"] = "mashintop"; //Смените на имя своего почтового ящика. $config["smtp_host"] = "smtp.yandex.ru"; //сервер для отправки почты $config["smtp_password"] = "moi_parol"; //Измените пароль } elseif($service=="rambler") { $config["smtp_searcher"] = "rambler.ru"; $config["smtp_email"] = "[email protected]"; $config["smtp_username"] = "mashintop"; //Смените на имя своего почтового ящика. $config["smtp_host"] = "smtp.rambler.ru"; //сервер для отправки почты $config["smtp_password"] = "moi_parol"; //Измените пароль } elseif($service=="mail") { $config["smtp_searcher"] = "mail.ru"; $config["smtp_email"] = "[email protected]"; $config["smtp_username"] = "mashintop"; //Смените на имя своего почтового ящика. $config["smtp_host"] = "smtp.mail.ru"; //сервер для отправки почты $config["smtp_password"] = "moi_parol"; //Измените пароль } elseif($service=="gmail") { $config["smtp_searcher"] = "gmail.com"; $config["smtp_email"] = "[email protected]"; $config["smtp_username"] = "alexeybertram"; //Смените на имя своего почтового ящика. $config["smtp_host"] = "smtp.gmail.com"; //сервер для отправки почты $config["smtp_password"] = "moi_parol"; //Измените пароль } $header="Date: ".date("D, j M Y G:i:s")." +0700rn"; $header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config["smtp_from"]."")))."?= <".$config["smtp_email"].">rn"; $header.="X-Mailer: The Bat! (v3.99.3) Professionalrn"; $header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$config["smtp_from"]."")))."?= <".$config["smtp_email"].">rn"; $header.="X-Priority: 3 (Normal)rn"; $header.="Message-ID: <172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn"; $header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("")))."?= <$mail_to>rn"; $header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode("".$subject."")))."?=rn"; $header.="MIME-Version: 1.0rn"; $header.="Content-Type: text/html; charset=windows-1251rn"; $header.="Content-Transfer-Encoding: 8bitrn"; $smtp_conn = fsockopen("".$config["smtp_host"]."", $config["smtp_port"],$errno, $errstr, 10); if(!$smtp_conn) {print "соединение с серверов не прошло"; fclose($smtp_conn); exit;} $data = get_data($smtp_conn); fputs($smtp_conn,"EHLO ".$config["smtp_searcher"]."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) {print "ошибка приветсвия EHLO"; fclose($smtp_conn); exit;} fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;} fputs($smtp_conn,base64_encode("".$config["smtp_username"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 334) {print "ошибка доступа к такому юзеру"; fclose($smtp_conn); exit;} fputs($smtp_conn,base64_encode("".$config["smtp_password"]."")."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 235) {print "не правильный пароль"; fclose($smtp_conn); exit;} fputs($smtp_conn,"MAIL FROM:".$config["smtp_email"]."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) {print "сервер отказал в команде MAIL FROM"; fclose($smtp_conn); exit;} fputs($smtp_conn,"RCPT TO:".$mail_to."rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250 AND $code != 251) {print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit;} fputs($smtp_conn,"DATArn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 354) {print "сервер не принял DATA"; fclose($smtp_conn); exit;} fputs($smtp_conn,$header."rn".$message."rn.rn"); $code = substr(get_data($smtp_conn),0,3000); if($code != 250) {print "ошибка отправки письма"; fclose($smtp_conn); exit;} fputs($smtp_conn,"QUITrn"); fclose($smtp_conn); } function get_data($smtp_conn) { $data=""; while($str = fgets($smtp_conn,515)) { $data .= $str; if(substr($str,3,1) == " ") { break; } } return $data; } $text_email = "
Вы только что добавили объявление на сайте mashintop.ru. Посмотреть его можно здесьВот и все, готовый скрипт у вас в руках, только скопируйте, поменяйте значения массива $config и все будет отлично работать.
Теперь давайте разберем некоторые элементы, на которые я бы хотел заострить внимание.
Нарпимер, ошибку, которую мы получаем при попытке отправить через SMTP гугл. Изначально мы видим вот такой вот текст ошибки:
Чтобы увидеть что-то более конкретное, давайте немного видоизменим код
Fputs($smtp_conn,"AUTH LOGINrn"); $code = substr(get_data($smtp_conn),0,3000); echo $code; if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;}
И получаем в итогде вполне конкретную ошибку
530 5.7.0 Must issue a STARTTLS command first. x4sm16408296lbn.2 - gsmtp
Что она означает точно — я не знаю, но полагаю, что связанно что-то с защищеннымнезащищенным подключением. Как от нее избавиться — пока не знаю, поэтому gmail остался не побежденным на данный момент.
В некоторых случаях с целью тестирования или диагностики работы почты, почтовому администратору требуется проверить отправку писем через свои сервера Exchange (и не только) с определенных хостов. В том случае, если сервер не требует авторизации (open-relay сервер), отправить почту можно . Однако в большинстве случае почтовые сервера для отправки почты требуют авторизации. В этом примере мы покажем, как в консоли telnet выполнить аутентификацию типа AUTH LOGIN на SMTP сервере и отправить письмо.
AUTH LOGIN – в терминологии Exchange – это базовая аутентификация, когда имя и пароль пользователя передаются по сети в закодированном по алгоритму base64 виде. На большинстве внутренних серверах Exchange администраторы не отключают Basic Authentication . Проверить ее поддержку можно в настройках принимающего коннектора.
Примечание . Обращаем ваше внимание что злоумышленник при доступе к каналу связи может легко перехватить и расшифровать закодированные по Base64 учетные данные пользователя. Поэтому этот способ авторизации рекомендуется использовать исключительно в частных корпоративных сетях.
Для авторизации на почтовом сервер с с помощью AUTH LOGIN, нам нужно преобразовать имя и пароль пользователя, из-под которого будет отправляться письмо в формат Base64. Это можно сделать с помощью скриптов или онлайн сервисов. Я воспользоваться сайтом https://www.base64encode.org/ .
Имя пользователя: testuser@ contoso. com , в кодировке Base64 получилось: dGVzdHVzZXJAY29udG9zby5jb20=
Пароль: $ up3 RsTr) ng — в Base64 JHVwM1 JzVHIpbmc=
Теперь в командой строке с помощью Telnet подключаемся на 25(SMTP) порт нашего почтового сервера (вводимые команды я буду выделять синим цветов):
telnet mail.contoso.com 25
Если это Exchange, он вернет что-то вроде;
Представимся:
ehlo sender.contoso.com
Сервер вернет список поддерживаемых типов авторизаций и возможностей. Как вы видите базовая авторизация (AUTH LOGIN) в списке имеется.
250-mail.contoso.com Hello
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
AUTH LOGIN
Сервер должен ответить:
334 VXNlcm5hbWU6
Теперь вставляем имя пользователя в формате Base64, которое мы закодировали ранее:
dGVzdHVzZXJAY29udG9zby5jb20=
Сервер должен ответить:
334 UGFzc3dvcmQ6.
Теперь пора вставить пароль в формате Base64:
JHVwM1JzVHIpbmc=
Если имя и пароль пользователя верны, сервер ответит.
235 2.7.0 Authentication successful
Если нет:
535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6
Теперь можно заполнить стандартные поля письма:
mail from: [email protected]
250 2.1.0 Sender OK
rcpt to: [email protected]
250 2.1.5 Recipient OK
data
354 Start mail input; end with .
from: TestUserovich
to: TheAdmin < [email protected] >
Subject: Test BASE SMTP Authenticated via Telnet
This is test
.
250 2.6.0
QUIT
221 2.0.0 Closing connection.
Connection closed by foreign host.
На этом все, тестовое письмо должно успешно доставиться в ящик получателя.
Отправка почты через SMTP с локального сервера позволяет протестировать отправку сообщений с сайта находящемся на локальной машине, или проще говоря, локальном сервере. Для этого можно использовать любой почтовый сервис yandex, google или mail.ru.
Прежде всего, SMTP (Simple Mail Transfer Protocol) - это широко используемый сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP. И такими протоколами обладают все популярные почтовые сервисы.
С появлением локальных серверов, отпала необходимость выбора хостинг-провайдера для того чтобы проверить работоспособность отдельных скриптов или cms-систем, а тем более еще и платить за это. Гораздо проще все протестировать на компьютере, ну а затем можно и показать всем что «натворили».
Многие такие сервера имеют уже встроенное программное обеспечение и необходимый функционал по работе с почтой, нужно его только правильно настроить.
Для проверки работоспособности такой почты необходим самый минимум:
Шаблон простенького скрипта который можно скопировать чуть ниже, или скачать еще на сотнях подобных сайтов, необходимо отредактировать.
Для начала нужно поменять в шаблоне скрипта некоторые значения.
to
— меняем на почтовый адрес куда будет отправлено почтовое сообщение.
subject
— тема письма
message
— само сообщение, или тело письма.
Пример моего скрипта:
Можно конечно немного расширить функционал и сделать так, чтобы скрипт выдавал сообщение об отправки почты. Хоть на самом деле отправку производит именно SMTP-сервер, а скрипт лишь формирует сообщение.
Для примера можно написать так:
Все подставленные значения должны быть в кавычках, иначе скрипт выдаст ошибку. После этого можно сохранить скрипт в папку локального сервера.
Например: domains/send/index.php и приступать к настройке отправки почты через SMTP opensrerver.
Почта будет приходить на любой адрес, который будет указан в скрипте вместо значения ‘to’ , но обрабатывать и отправлять эту почту будет именно тот SMTP, который будет указан в настройках openserver.
Сохраняем настройки и после того, как сервер будет перезапущен, можно обратиться к самому скрипту. Из папки «Мои сайты», открыть папку «send» в которой и находится сохраненный ранее скрипт index.php.
Как только произойдет обращение к данному скрипту, в новом окне браузера появится информация о том, что скрипт отработал.
После этого стоит проверить свой почтовый ящик, адрес которого был указан в скрипте, пришло ли письмо.
Если его нет, значит что-то настроено не правильно, либо письмо попало в папку спам.
Все остальные настройки выглядят аналогично, но на всякий случай дополнительная информация не помешает.
Для того, чтобы настроить отправку почты через SMTP mail ru, необходимо просто заменить параметры яндекса на параметры mail ru.
А чтобы не перестраивать каждый раз локальные сервер, лучше всего настроить разные профили openserver. Как это сделать показано в видеоуроке .
В этом случае достаточно будет просто загрузить профиль и все настройки, которые были указаны для данного профиля будут доступны после перезапуска сервера. Очень удобная штука и работает очень просто.
Для каждого профиля (совсем не важно как он будет называться), должны быть сделаны свои настройки, если конечно планируется использование разных по своим параметрам скриптов, cms-систем и приложений.
Если нет, то можно обойтись и настройками по умолчанию.
Что касается SMTP mail ru, то здесь все эдентично.
Меняются данные яндекса на данные mail ru
Для того, чтобы настроить отправку почты через SMTP гугла, стоит чуть постараться.
Во-первых, создание самого профиля в гугле сложнее чем в других системах яндекса и mail ru
Во-вторых, система просто так не пропустит письмо, даже если указать свои данные для входа. Для начала она пришлет письмо в котором и будет вся необходимая информация о дальнейших инструкциях.
В остальном же для гугла настраивается точно так же. Меняются только все данные .
Для настройки отправки почты через другие SMTP, все данные будут примерно одинаковы.
Если у вас все получилось и письма дошли до указанного адресата, значит все сделано правильно. Будет здорово если вы поделитесь своими наработками в комментариях.
Поскольку отправка анонимных сообщений с серверов виртуального Windows-хостинга запрещена, отправку писем следует производить через SMTP-сервер , для чего так же возможно использовать и нашу почтовую систему.
С помощью любого класса 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Скачать пример готового скрипта с функцией 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(), мы включили файл smtpauth.php через require_once и вызвали функцию MailSmtp(), описанную в нем, с аналогичными для mail() аргументами. При этом сам вызов mail() мы закомментировали в коде, чтобы избежать ошибки при выполнении скрипта.
Если вы используете версию 2.0, то используя класс MailMessage System.Net.Mail ), хорошо описанный .
Ниже приведены примеры его использования для языков «C#» и «VisualBasic»:
Скачать пример готовой формы, демонстрирующей использование данного метода: MailForm.aspx .
Также существует устаревший (и не рекомендуется к использованию) класс 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 = "Имя_отправителяОбратите внимание, что при использовании нашего 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Некоторые CMS уже имеют встроенные средства для отправки корреспонденции или соответствующие модули, рассмотрим самые популярные из них.
Для данной CMS существует специальный модуль «WP Mail SMTP », пример его конфигурации описан на странице модуля .
Обратите внимание на иллюстрацию в примере, в условиях нашей почтовой системы требуется использовать 25-й порт и SSL-шифрование не требуется.
В панели администрирования перейдите в раздел «Общие настройки», выберете вкладку «Сервер». В поле «Почта» требуется выбрать способ отправки как «SMTP-сервер », в полях «Адрес SMTP-сервера » и «SMTP-логин » и «SMTP-пароль » укажите соответствующие реквизиты почтовой системы, например: smtp.сайт, ящик@ваш_домен и соответствующий пароль.
Эта CMS так же имеет собственный модуль для работы с SMTP-сервером , основанный на базе PHPMailer. Загрузить данный модуль можно на его странице на сайте CMS Drupal, описание установки модуля доступно в архиве с ним.
Данная CMS не имеет встроенных функций для работы с SMTP-сервером . Для отправки почты скриптами сайта мы можем предложить использовать наше решение, для его подключения необходимо выполнить следующие действия:
Отредактировать файл send_auth_mail.php из архива, указав в нём реквизиты подключения к нужному SMTP-серверу:
domain.tld следует заменить на имя вашего домена.
Предлагаемое решение работает со всеми модулями NetCat, которые используют стандартные функции данной CMS для отправки почты.