Jump to content

Правильная отправка мыла через STMP


Recommended Posts

Все доброго времени суток.

Обратился клиент, не приходят письма о заказах, как выяснилось был заблокирован сервис STMP на сервере из-за (вируса) спама.

 

Правильное решение избавится от php mail.

Качаем swiftmailer https://github.com/swiftmailer/swiftmailer

сохраняем папку lib в /api/lib/

 

Далее находим файл /api/Notify.php

Находим функцию 

function email($to, $subject, $message, $from = '', $reply_to = '')
{

И меняем содержимое 

require_once('lib/swift_required.php');


/**
* $transport = Swift_SmtpTransport::newInstance('smtp.yandex.ru', 465, 'ssl')
* ->setUsername('email@yandex.ru')
* ->setPassword('password');
* Можно создать любой емайл на яндексе и использовать в качестве отправки заказов и * других сообщений
*/

$transport = Swift_SmtpTransport::newInstance('smtp.google.com', 465, 'ssl')
	->setUsername('my@example.com')
	->setPassword('password');

$mailer = Swift_Mailer::newInstance($transport);

$messages = Swift_Message::newInstance($subject)
	->setFrom('my@example.com')
	->setTo($to)
	->setContentType("text/html; charset=UTF-8")
	->setBody($message, 'text/html');

$result = $mailer->send($messages);

И письма будут доходить 100% даже с выключенным сервисом STMP

P.S По мне давно уже никто не использует php mail в качестве отправки писем.

Edited by Чудилла
Link to post
Share on other sites
  • 3 months later...

Все доброго времени суток.

Обратился клиент, не приходят письма о заказах, как выяснилось был заблокирован сервис STMP на сервере из-за (вируса) спама.

 

Правильное решение избавится от php mail.

Качаем swiftmailer https://github.com/swiftmailer/swiftmailer

сохраняем папку lib в /api/lib/

 

Далее находим файл /api/Notify.php

Находим функцию 

function email($to, $subject, $message, $from = '', $reply_to = '')
{

И меняем содержимое 

require_once('lib/swift_required.php');


/**
* $transport = Swift_SmtpTransport::newInstance('smtp.yandex.ru', 465, 'ssl')
* ->setUsername('email@yandex.ru')
* ->setPassword('password');
* Можно создать любой емайл на яндексе и использовать в качестве отправки заказов и * других сообщений
*/

$transport = Swift_SmtpTransport::newInstance('smtp.google.com', 465, 'ssl')
	->setUsername('my@example.com')
	->setPassword('password');

$mailer = Swift_Mailer::newInstance($transport);

$messages = Swift_Message::newInstance($subject)
	->setFrom('my@example.com')
	->setTo($to)
	->setContentType("text/html; charset=UTF-8")
	->setBody($message, 'text/html');

$result = $mailer->send($messages);

И письма будут доходить 100% даже с выключенным сервисом STMP

P.S По мне давно уже никто не использует php mail в качестве отправки писем.

после отправки выплевывает на пустую страницу( ничего с этим не могу поделать

Link to post
Share on other sites

после отправки выплевывает на пустую страницу( ничего с этим не могу поделать

 

включите вывод ошибок php и посмотрите какая ошибка

Edited by mishanya
Link to post
Share on other sites
  • 1 month later...

Правильное решение это свой VPS + настроенные SPF и DKIM!

А это костыли!

 

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

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

Link to post
Share on other sites
  • 2 months later...
  • 5 months later...

Вставил этот скрипт

Отправляю письма через ajax

В обработчике вот такой код:

<?php
    chdir('..');
    require_once('api/Simpla.php');
    $simpla = new Simpla();
    $msg = '<b>Имя:</b> '.$simpla->request->post('username', 'string').'<br /> <b>Телефон или Email</b>: '.$simpla->request->post('tel', 'string').'<br /> <b>Отзыв:</b> '.$simpla->request->post('feed', 'string');
    $simpla->notify->email($simpla->notify->settings->notify_from_email, 'Отзыв с сайта ads-irk.ru.org', $msg, '123');
?>

Но при попытке отправки в консоли показывает ошибку:

500 (Internal Server Error)

Link to post
Share on other sites

Для кого-то такая отправка, возможно, и "правильная".

 

А если чуть проанализировать способ, то видно, то что в новом варианте функции mail  из пяти параметров последние два просто ИГНОРИРУЮТСЯ - ошибка принципиальная. Из-за этого некоторые письма, например, оповещение админу о сообщение со страницы Контакты, будет приходить не в таком удобном виде, как обычно, и написать на него ответ комфортным образом без выискивания и подстановки ручками email отправителя админу не удастся...

 

И не исключено, что в некоторых случаях из-за неуказанного в заголовке значения from отправка может и не сработать...

Link to post
Share on other sites

Вставил этот скрипт

Отправляю письма через ajax

В обработчике вот такой код:

<?php
    chdir('..');
    require_once('api/Simpla.php');
    $simpla = new Simpla();
    $msg = '<b>Имя:</b> '.$simpla->request->post('username', 'string').'<br /> <b>Телефон или Email</b>: '.$simpla->request->post('tel', 'string').'<br /> <b>Отзыв:</b> '.$simpla->request->post('feed', 'string');
    $simpla->notify->email($simpla->notify->settings->notify_from_email, 'Отзыв с сайта ads-irk.ru.org', $msg, '123');
?>

Но при попытке отправки в консоли показывает ошибку:

500 (Internal Server Error)

 

что это за шедевр?

$simpla->notify->settings->notify_from_email

там должно быть 

$simpla->settings->notify_from_email

 

из-за этого 500я ошибка. потому что вы пытаетесь вызвать массив настроек из notify где его нет.

 

вообще лучше оформить это все отдельной ф-ей в api/Notify.php и вызывать ее 

$simpla->notify->review_admin($msg);

 

например. посмотрите как работает Feedback, там все пишется в базу а потом по айди выбирается

Edited by mishanya
Link to post
Share on other sites

что это за шедевр?

$simpla->notify->settings->notify_from_email

там должно быть 

$simpla->settings->notify_from_email

 

из-за этого 500я ошибка. потому что вы пытаетесь вызвать массив настроек из notify где его нет.

 

вообще лучше оформить это все отдельной ф-ей в api/Notify.php и вызывать ее 

$simpla->notify->review_admin($msg);

 

например. посмотрите как работает Feedback, там все пишется в базу а потом по айди выбирается

 

Спасибо Вам в очередной раз)

Link to post
Share on other sites
  • 2 weeks later...

При настройке у меня ошибка 

 


Parse error: syntax error, unexpected T_REQUIRE_ONCE, expecting T_FUNCTION in /..../api/Notify.php on line 15

 

что не так сделал ?

Link to post
Share on other sites

Посадил ошибку в файле Notify.php.  Проверяйте аккуратно...

Та все сделал по инструкции, скачал посылке  swiftmailer  папку lib , закинул по пути /api/lib

Дальше удалил строчку 

 

 

function email($to, $subject, $message, $from = '', $reply_to = '')
{

и добавил вместо нее 

 

require_once('lib/swift_required.php');

 

 

 

/**
* $transport = Swift_SmtpTransport::newInstance('smtp.yandex.ru', 465, 'ssl')
* ->setUsername('email@yandex.ru')
* ->setPassword('password');
* Можно создать любой емайл на яндексе и использовать в качестве отправки заказов и * других сообщений
*/

$transport = Swift_SmtpTransport::newInstance('smtp.google.com', 465, 'ssl')
    ->setUsername('my@example.com')
    ->setPassword('password');

$mailer = Swift_Mailer::newInstance($transport);

$messages = Swift_Message::newInstance($subject)
    ->setFrom('my@example.com')
    ->setTo($to)
    ->setContentType("text/html; charset=UTF-8")
    ->setBody($message, 'text/html');

$result = $mailer->send($messages);
 

Все же верно, вот мой Notify.php http://rgho.st/8ZpmqmHSf

там и ошибку сделать нету где

Edited by Axotn1k
Link to post
Share on other sites

Находим функцию

 

И меняем содержимое

Дальше удалил строчку

 

Согласно инструкции из #1 строчку надо было только НАЙТИ, удалять ее - это и есть ошибка.

 

Удалять надо то, что в ТЕЛЕ функции, то есть строки, обозначенные ниже точками:

 

function email($to, $subject, $message, $from = '', $reply_to = '')

{

.................

.................

.................

.................

}

 

Link to post
Share on other sites

Согласно инструкции из #1 строчку надо было только НАЙТИ, удалять ее - это и есть ошибка.

 

Удалять надо то, что в ТЕЛЕ функции, то есть строки, обозначенные ниже точками:

 

function email($to, $subject, $message, $from = '', $reply_to = '')

{

.................

.................

.................

.................

}

 

 

 

Находим функцию, И меняем содержимое 

Равнозначно заменить функцию на другу, следственно удалить старую, и вставить новую, разве нет ?

Link to post
Share on other sites

Сделал как правильно, заменил только функцию, ошибка

 

 

Fatal error: Uncaught exception 'Swift_TransportException' with message 'Connection could not be established with host smtp.yandex.ru [Connection timed out #110]' in /home/puma1639/public_html/api/lib/classes/Swift/Transport/StreamBuffer.php:269 Stack trace: #0 /home/puma1639/public_html/api/lib/classes/Swift/Transport/StreamBuffer.php(62): Swift_Transport_StreamBuffer->_establishSocketConnection() #1 /home/puma1639/public_html/api/lib/classes/Swift/Transport/AbstractSmtpTransport.php(113): Swift_Transport_StreamBuffer->initialize(Array) #2 /home/puma1639/public_html/api/lib/classes/Swift/Mailer.php(79): Swift_Transport_AbstractSmtpTransport->start() #3 /home/puma1639/public_html/api/Notify.php(40): Swift_Mailer->send(Object(Swift_Message)) #4 /home/puma1639/public_html/api/Notify.php(152): Notify->email('info@site.ru', '???????????? ??...', '<h1 style='font...', 'Andrii Shendiuk...', 'Andrii Shendiuk...') #5 /home/puma1639/public_html/view/FeedbackView.php(51): Notify->email_feedback_admin(275) #6 /home/puma1639/publi in /home/puma1639/public_html/api/lib/classes/Swift/Transport/StreamBuffer.php on line 269
 
Edited by Axotn1k
Link to post
Share on other sites

 

 

'Connection could not be established with host smtp.yandex.ru [Connection timed out #110]'
 

 

 

Это уже ошибка другая. Ошибка не от скрипта, а от соединения со сторонним сервером.

Возможно, дело в настройках хостинга...

Или в неверном логине-пароле (если Вы их задавали)...

Link to post
Share on other sites

Это уже ошибка другая. Ошибка не от скрипта, а от соединения со сторонним сервером.

Возможно, дело в настройках хостинга...

Или в неверном логине-пароле (если Вы их задавали)...

Спасибо, оказалось хостер закрыл доступ к серверу smtp.yandex.ru

написал в саппорт, открыли доступ, и все рабортает!

Link to post
Share on other sites

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

 

В настройках стоит:

 

    ->setFrom(array('info@site.ru' => 'Описание сайта'))
Link to post
Share on other sites

Как раз про этот недостаток и написано в #9.


Попробуйте поменять

    ->setFrom('my@example.com')

на

    ->setFrom($from)

 

Еще можно пробовать менять поле ReplyTo...

Link to post
Share on other sites

Как раз про этот недостаток и написано в #9.

 

Попробуйте поменять

    ->setFrom('my@example.com')

на

    ->setFrom($from)

 

Еще можно пробовать менять поле ReplyTo...

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

 

 

Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given

Edited by Axotn1k
Link to post
Share on other sites

Ошибку-то КАКУЮ? Зачем экономите на написании ПОЛНОГО текста ошибки?

Извините я думала это полный текст ошибки, Вот 

 


Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [Andrei Shenduh <lutsk40@gmail.com>] does not comply with RFC 2822, 3.6.2.' in /home/puma1639/public_html/api/lib/classes/Swift/Mime/Headers/MailboxHeader.php:348 Stack trace: #0 /home/puma1639/public_html/api/lib/classes/Swift/Mime/Headers/MailboxHeader.php(263): Swift_Mime_Headers_MailboxHeader->_assertValidAddress('Andrei Shenduh ...') #1 /home/puma1639/public_html/api/lib/classes/Swift/Mime/Headers/MailboxHeader.php(106): Swift_Mime_Headers_MailboxHeader->normalizeMailboxes(Array) #2 /home/puma1639/public_html/api/lib/classes/Swift/Mime/Headers/MailboxHeader.php(63): Swift_Mime_Headers_MailboxHeader->setNameAddresses(Array) #3 /home/puma1639/public_html/api/lib/classes/Swift/Mime/SimpleMimeEntity.php(592): Swift_Mime_Headers_MailboxHeader->setFieldBodyModel(Array) #4 /home/puma1639/public_html/api/lib/classes/Swift/Mime/SimpleMessage.php(213): Swift_Mime_SimpleMimeEntity->_setHeaderFieldModel('From', Array) #5 /home/p in /home/puma1639/public_html/api/lib/classes/Swift/Mime/Headers/MailboxHeader.php on line 348
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...