Как проверить работу wp_mail в WordPress?

20 мая 2013 г., 13:43:51
Просмотры: 113K
Голосов: 8

Я пытаюсь использовать wp_mail (тестирую на локальной машине), но письма не приходят. В php.ini установлен smtp_port = 25 и функция php mail() пока работает.

  • как проверить работает ли wp_mail
  • что может пойти не так

Вот код моей почтовой функции:

function mv_optin_mail($id, $data){

    $url = $id."-".mv_mail_token($id, $data['token']);

    add_filter( 'wp_mail_content_type', 'set_html_content_type' );
    add_filter( 'wp_mail_charset', 'utf8' );

    $headers[] = 'From: '.sender_signature.' <'.noreply_address.'>';    

    ob_start();
    include("optin-mail.php");
    $html_mail = ob_get_contents();
    ob_end_clean();

    wp_mail( $data['email'], 'Тема письма', $html_mail, $headers );
    remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
    remove_filter( 'wp_mail_charset', 'utf8' );
}

Я не получаю никаких ошибок. Есть ли способ включить логирование ошибок для wordpress?

Значение noreply_address установлено как noreply@root

3
Комментарии

Теперь остались вопросы: Что такое mv_mail_token(), что она возвращает, откуда берется константа sender_signature и что она содержит?

kaiser kaiser
23 июн. 2013 г. 21:01:43

Kaiser, послушай, пожалуйста, попробуй ответить на вопросы... wp_mail_token() возвращает строку, как и sender_signature.

helle helle
24 июн. 2013 г. 11:38:04

отладочный gist

kaiser kaiser
24 июн. 2013 г. 12:02:07
Все ответы на вопрос 6
1
17

Вы можете использовать действие 'wp_mail_failed' для перехвата ошибки отправки.

https://developer.wordpress.org/reference/hooks/wp_mail_failed/

21 мая 2017 г. 09:21:54
Комментарии

и вам нужно добавить это действие до вызова wp_mail().

mike23 mike23
14 июн. 2024 г. 19:09:44
0
13

WordPress использует класс PHPMailer для отправки электронной почты через PHP-функцию mail.

Поскольку PHP-функция mail возвращает очень мало информации после выполнения (только TRUE или FALSE), я предлагаю временно упростить вашу функцию mv_optin_mail до минимума, чтобы проверить, работает ли функция wp_mail.

Пример:

$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'тест отправки почты', 'ура' );
echo $mailResult;

Поскольку вы уже протестировали PHP-функцию mail, письмо должно прийти.

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

В таких случаях я обычно переименовываю свою функцию во что-то вроде:

function mv_optin_mail_backup( $id, $data ) {

И добавляю временную функцию с тем же именем для экспериментов, например:

function mv_optin_mail( $id, $data ) {
    $mailResult = false;
    $mailResult = wp_mail( 'youremail@bla.com', 'тест отправки почты', 'ура' );
    echo $mailResult;
}

Когда я выясню, в чем проблема, я снова начинаю использовать резервную версию.

Для отправки письма напрямую через PHPMailer можно сделать так (не для продакшена, только для отладки):

add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();
    //$phpmailer->Host = 'smtp.example.com';
    //    $phpmailer->SMTPAuth = true; // Принудительно использовать логин и пароль для аутентификации
    $phpmailer->Port = 25;
    //    $phpmailer->Username = 'ваш_логин';
    //    $phpmailer->Password = 'ваш_пароль';

    // Дополнительные настройки…
    //$phpmailer->SMTPSecure = "tls"; // Выберите SSL или TLS, если это необходимо для вашего сервера
    $phpmailer->setFrom( "fromemail@bla.com", "Имя отправителя" );
    $phpmailer->addAddress( "youremail@bla.com", "Ваше имя" );
    $phpmailer->Subject    = "Тестирование PHPMailer";           
    $phpmailer->Body     = "Ура! \n\n Отлично.";
    if( !$phpmailer->send() ) {
        echo "Ошибка отправки: " . $phpmailer->ErrorInfo;
    } else {
        echo "Письмо отправлено!";
    }                       

}       
1 нояб. 2015 г. 16:40:01
0

Обычно я проверяю, правильно ли работает отправка писем через wp_mail(), просто регистрируясь на своём сайте с другим email-адресом и проверяю, приходит ли письмо. Если письмо приходит, значит WordPress корректно отправляет письма (он использует wp_mail() для отправки писем с регистрацией), и вам следует проверить свою функцию отправки писем на наличие ошибок. Как предложил @Tobias, для этого нужно упростить вашу функцию отправки писем, оставив только основное:

function wpse_100047() {
    echo wp_mail( 'youremail@example.com', 'WP Mail Test', 'Mail is working' );
}

Кроме того, письма, отправляемые WordPress (как и все письма, отправляемые функцией PHP mail()), могут блокироваться некоторыми почтовыми серверами (или помечаться как спам), поэтому на рабочем сайте всегда рекомендуется использовать SMTP (есть множество плагинов для этого).

1 нояб. 2015 г. 17:58:46
0

Я бы начал с включения WP_DEBUG в файле wp-config, чтобы посмотреть, покажет ли это что-то о вашем коде или о функции wp_mail. Это основные возможности отладки "из коробки" в WordPress.

Также вы можете использовать плагин Easy WP SMTP, включить отладку и/или настроить его для использования SMTP. На WordPress.org есть похожие плагины, но я знаю, что у этого есть хорошие опции отладки. Если что-то вроде GMail будет работать, вы поймете, что проблема в настройках сервера, а не в этом коде.

22 апр. 2014 г. 04:44:05
0

Если вы хотите остановить выполнение скрипта и просто посмотреть объект $error, попробуйте добавить этот код ПЕРЕД вызовом метода wp_mail():

add_action('wp_mail_failed', function ($error) {
    wp_die("<pre>".print_r($error, true)."</pre>");
});
2 февр. 2021 г. 15:45:13
0

В этом документе были очень интересные предложения.

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

В частности, при работе с Azure Virtual Machine конфигурация SELinux блокировала исходящие соединения.

Если вы видите ошибку типа SMTP -> ERROR: Failed to connect to server: Permission denied (13) , возможно, SELinux запрещает PHP или веб-серверу отправлять электронную почту. Это особенно вероятно на RedHat / Fedora / Centos. С помощью команды getsebool мы можем проверить, разрешено ли демону httpd устанавливать сетевое соединение и отправлять электронную почту:

getsebool httpd_can_sendmail 
getsebool httpd_can_network_connect 

Эта команда вернет булево значение on или off. Если оно off, мы можем включить его:

sudo setsebool -P httpd_can_sendmail 1 
sudo setsebool -P httpd_can_network_connect 1 

Если вы запускаете PHP-FPM через fastcgi, возможно, потребуется применить это к демону fpm, а не к httpd.

15 апр. 2020 г. 00:56:10