Ошибка отправки contact-form

Автор BSD-shnik, 12 марта 2016, 08:36:31

« назад - далее »

Виталий

<?php
ini_set
('display_errors', 'On');
error_reporting(E_ALL); 

require(
dirname(__FILE__).'/config/config.inc.php');
include_once(
_PS_SWIFT_DIR_.'swift_required.php');

$smtp_server = '';
$smtp_port = ''; // 25
$smtp_encryption = false; // true
$smtp_login = '';
$smtp_password = '';
$content = 'Here is the message.';
$subject = 'Message subject'; 
//array('receiver@domain.org', 'other@domain.org' => 'A name')
$to = 'other@domain.org';
//array('john@doe.com' => 'John Doe')
$from = 'john@doe.com';

// Create the Transport
$transport = Swift_SmtpTransport::newInstance($smtp_server, $smtp_port)
  ->
setUsername($smtp_login)
  ->
setPassword($smtp_password);

/*
You could alternatively use a different transport such as Sendmail or Mail:

// Sendmail
$transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

// Mail
$transport = Swift_MailTransport::newInstance();
*/

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance($subject)
  ->
setFrom($from)
  ->
setTo($to)
  ->
setContentType("text/html; charset=UTF-8")
  ->
setBody($content, 'text/html')
  ;

// Send the message
if ($mailer->send($message, $failures))
{
echo "Sent";
}
else
{
echo "Failures:";
print_r($failures);
}
?>


Для проверки отправки почты, сохраняете в файл в корне сайта, например, mail.php. Меняте переменные "smtp_", "to", "from" на свои данные. Открываете этот файл в браузере. Если почта не уходит, проверяете лог ошибок сайта.
Cоздание интернет сайтов Webstudio UwK

BSD-shnik

Виталий

Спасибо, но данный скрипт отправляет сообщения, подобно mail(), но мне нужна отправка только по SMTP.

coder

Про обратную зону интересно.

Есть новая вводная. Засниффил сессию, выяснились любопытные детали.

...
SSL 277 Client Hello
TLSv1 1484 Server Hello
190 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
322 New Session Ticket, Change Cipher Spec, Encrypted Handshake Message
189 Application Data
146 Application Data,
189 Application Data
TLSv1 93 Encrypted Alert

TCP 56 465 Б├▓ 15670 [ACK] Seq=4555 Ack=1072 Win=7504 Len=0 TSval=4251498818 TSecr=9336018
TCP 56 465 Б├▓ 15670 [FIN, ACK] Seq=4555 Ack=1072 Win=7504 Len=0 TSval=4251498818 TSecr=9336018



Вывод - ошибка шифрования на уровне приложения.  Выполнен приём ключа, создан билет сессии, начат обмен данными на уровне приложений..... но какая-то ошибка на стороне Prestashop,  FIN, ACK от сервера.

Что могло вызвать ошибку? Проблема с буферизацией? .... мрак.

Виталий

Цитата: BSD-shnik от 17 июня 2016, 18:23:32
Виталий
Спасибо, но данный скрипт отправляет сообщения, подобно mail(), но мне нужна отправка только по SMTP.
Это и есть имитация отправки почты с помощью библиотеки SwiftMailer (все как в prestashop) по своим параметрам SMTP сервера, только без учета ошибок в самой cms prestashop.
Отправка прошла без ошибок, значит проблема в системных файлах prestashop, отправка не прошла, проблема в используемой библиотеки SwiftMailer. Ошибки сервера сохраняются в логе ошибок сайта. После тестирования сразу будет ясно в каком направлении двигаться.
Cоздание интернет сайтов Webstudio UwK

kvestin80

Цитата: Виталий от 17 июня 2016, 16:46:34
<?php
ini_set
('display_errors', 'On');
error_reporting(E_ALL); 

require(
dirname(__FILE__).'/config/config.inc.php');
include_once(
_PS_SWIFT_DIR_.'swift_required.php');

$smtp_server = '';
$smtp_port = ''; // 25
$smtp_encryption = false; // true
$smtp_login = '';
$smtp_password = '';
$content = 'Here is the message.';
$subject = 'Message subject'; 
//array('receiver@domain.org', 'other@domain.org' => 'A name')
$to = 'other@domain.org';
//array('john@doe.com' => 'John Doe')
$from = 'john@doe.com';

// Create the Transport
$transport = Swift_SmtpTransport::newInstance($smtp_server, $smtp_port)
  ->
setUsername($smtp_login)
  ->
setPassword($smtp_password);

/*
You could alternatively use a different transport such as Sendmail or Mail:

// Sendmail
$transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

// Mail
$transport = Swift_MailTransport::newInstance();
*/

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance($subject)
  ->
setFrom($from)
  ->
setTo($to)
  ->
setContentType("text/html; charset=UTF-8")
  ->
setBody($content, 'text/html')
  ;

// Send the message
if ($mailer->send($message, $failures))
{
echo "Sent";
}
else
{
echo "Failures:";
print_r($failures);
}
?>


Для проверки отправки почты, сохраняете в файл в корне сайта, например, mail.php. Меняте переменные "smtp_", "to", "from" на свои данные. Открываете этот файл в браузере. Если почта не уходит, проверяете лог ошибок сайта.

То что нужно. Не мог понять почему у меня почта не работает после обновления престашоп. Страно что путь к Swift у меня такой - /tools/swift/Swift/Swift.php. Я так понимаю, что с ним и была проблема, так как когда заменил на такой   - /tools/swift/swift_required.php, то ошибок нестало.
Это в престе так намудрили или только у меня такие проблемы?

BSD-shnik

#34
Виталий

Ясно, спасибо за пояснение, проверю.
Однако, причём тут библиотеки? Соединение то устанавливается, обмен данными идёт..... библиотека здесь явно ни причём. Ошибка шифрования - вот причина.
Думаю, с новыми алгоритмами или протоколами шифрования проблема..... STARTTLS и всё такое.

А скрипт Ваш в какой версии Престашоп должен работать? Случайно не в 1.5? Ему ведь класс Swift_SmtpTransport нужен, а в 1.6 его нет и быть не должно.   

DarinSr

Swift_SmtpTransport есть в Prestashop версии 1.6

Prestashop 1.6 класс /classes/Mail.php
$connection = Swift_SmtpTransport::newInstance($configuration['PS_MAIL_SERVER'], $configuration['PS_MAIL_SMTP_PORT'], $configuration['PS_MAIL_SMTP_ENCRYPTION'])
                    ->setUsername($configuration['PS_MAIL_USER'])
                    ->setPassword($configuration['PS_MAIL_PASSWD']);

BSD-shnik

#36
DarinSr
Странно, у меня вместо этого
$connection = new Swift_Connection_SMTP.......

Версия Prestashop 1.6.0.14
-------------------------------------------------------
У Prestashop действительно была проблема со STARTTLS, но исправлена ли она? Поддерживаются ли новые протоколы шифрования?
https://www.prestashop.com/forums/topic/451298-non-starttls-email-service-to-use-with-presta-smtp/

Думаю, проблема не решена и способ решить её один - хостовый SMTP сервер.


DarinSr

У вас в /tools/swift/ какие файлы и папки?

Adik

Цитата: BSD-shnik от 19 июня 2016, 11:46:26
Версия Prestashop 1.6.0.14
-------------------------------------------------------
У Prestashop действительно была проблема со STARTTLS, но исправлена ли она? Поддерживаются ли новые протоколы шифрования?
https://www.prestashop.com/forums/topic/451298-non-starttls-email-service-to-use-with-presta-smtp/

Думаю, проблема не решена и способ решить её один - хостовый SMTP сервер.
На этом же форуме, только во фр. версии ответ по этой проблеме
ЦитироватьLe problème vient de la très vieille version de swiftmailer 3.3.2 qui date d'octobre 2007 qui ne sait pas gérer TLS.
La solution est de mettre la dernière version de swiftmailer et de modifier le fichier /classes/Mail.php pour tenir compte de la dernière version de swiftmailer.
....
La version 1.6.5 inclut la dernière version de swiftmailer 5.x
Par conséquent mon fix n'est plus nécessaire.
Mettez à jour votre prestashop et le TLS marchera.
Обновить нужно swiftmailer. Кстате в prestashop 1.6.1.5 это наконец-то сделали. Полностью сменили стуртуру swiftmailer и обновили саму библиотеку. Не понятно только почему не до последней версии, пятая но не последний релиз. Хотя можно и самому обновить.
Вывод, нужно обновлять prestashop и проблем не будет.

Виталий

Цитата: BSD-shnik от 18 июня 2016, 16:30:15
Виталий
Ясно, спасибо за пояснение, проверю.
Однако, причём тут библиотеки? Соединение то устанавливается, обмен данными идёт..... библиотека здесь явно ни причём. Ошибка шифрования - вот причина.
Думаю, с новыми алгоритмами или протоколами шифрования проблема..... STARTTLS и всё такое.
А скрипт Ваш в какой версии Престашоп должен работать? Случайно не в 1.5? Ему ведь класс Swift_SmtpTransport нужен, а в 1.6 его нет и быть не должно.
Этот код для версии prestashop 1.6.1.5. Только с этой версии можно использовать
include_once(_PS_SWIFT_DIR_.'swift_required.php');
В более ранних версиях нужно скачать swiftmailer 5.x, распаковать в корень сайта и заменить путь к файлу swift_required.php.

Проблемы с STARTTLS как раз из-за устаревшей библиотеки swiftmailer. Это она отвечает за возможности использования различных методов шифрования при отправки почты.

Вам нужно обновить Prestashop до версии 1.6.1.6.
Cоздание интернет сайтов Webstudio UwK

BSD-shnik

Adik
Виталий

Спасибо, попробую. Опасаюсь, что https слетит...... но это не смертельно.