Проверить, правильно ли работает wp_mail?
-
-
Остались вопросы: что такоеmv_mail_token (),что он возвращает,откуда берется константа sender_signature и что она содержит?Now the remaining questions are: What is `mv_mail_token()` and what does it return and where does the constant `sender_signature` come from and what does it contain?
- 0
- 2013-06-23
- kaiser
-
Кайзер,послушайте,пожалуйста,попробуйте ответить на вопросы ... wp_mail_token () возвращает строку,а sender_signature - хорошо.Kaiser, listen, please try to answer the questions ... wp_mail_token() returns a string and sender_signature does at well.
- 1
- 2013-06-24
- helle
-
[суть отладки] (https://gist.github.com/franz-josef-kaiser/4063197)[debug gist](https://gist.github.com/franz-josef-kaiser/4063197)
- 2
- 2013-06-24
- kaiser
-
5 ответ
- голосов
-
- 2015-11-01
Wordpress использует класс PHPMailer для отправки электронной почты через функцию PHP
mail
.Поскольку функция PHP
mail
после выполнения возвращает очень мало информации (только TRUE или FALSE),я предлагаю временно сократить вашу функциюmv_optin_mail
до минимума,чтобы проверить,функцииwp_mail
работают.Пример:
$mailResult = false; $mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' ); echo $mailResult;
Поскольку вы уже протестировали функцию PHP
mail
,почта должна прибыть.Если это не так,проблема заключается в других операторах вашей функции или в классе PHPMailer.
В подобных случаях я обычно переименовываю свою функцию примерно так:
function mv_optin_mail_backup( $id, $data ) {
И добавьте временную функцию с тем же именем,чтобы возиться с ней вот так:
function mv_optin_mail( $id, $data ) { $mailResult = false; $mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' ); 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; // Force it to use Username and Password to authenticate $phpmailer->Port = 25; // $phpmailer->Username = 'yourusername'; // $phpmailer->Password = 'yourpassword'; // Additional settings… //$phpmailer->SMTPSecure = "tls"; // Choose SSL or TLS, if necessary for your server $phpmailer->setFrom( "[email protected]", "From Name" ); $phpmailer->addAddress( "[email protected]", "Your name" ); $phpmailer->Subject = "Testing PHPMailer"; $phpmailer->Body = "Hurray! \n\n Great."; if( !$phpmailer->send() ) { echo "Mailer Error: " . $phpmailer->ErrorInfo; } else { echo "Message sent!"; } }
Wordpress relies on the PHPMailer class to send email through PHP's
mail
function.Since PHP's
mail
function returns very little information after execution (only TRUE or FALSE), I suggest temporarily stripping down yourmv_optin_mail
function to a minimum in order to see if thewp_mail
functions works.Example:
$mailResult = false; $mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' ); echo $mailResult;
Since you've tested PHP's
mail
function already, the mail should arrive.If it does not, the problem lies in the other statements of your function or in the PHPMailer class.
In cases like this, I usually rename my function to something like:
function mv_optin_mail_backup( $id, $data ) {
And add a temporary function with the same name to mess around with like so:
function mv_optin_mail( $id, $data ) { $mailResult = false; $mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' ); echo $mailResult; }
When I have figured out what the problem is, I start using the backup version again.
To send a mail using PHPMailer directly you can do something like this (not for production, just for debugging):
add_action( 'phpmailer_init', 'my_phpmailer_example' ); function my_phpmailer_example( $phpmailer ) { $phpmailer->isSMTP(); //$phpmailer->Host = 'smtp.example.com'; // $phpmailer->SMTPAuth = true; // Force it to use Username and Password to authenticate $phpmailer->Port = 25; // $phpmailer->Username = 'yourusername'; // $phpmailer->Password = 'yourpassword'; // Additional settings… //$phpmailer->SMTPSecure = "tls"; // Choose SSL or TLS, if necessary for your server $phpmailer->setFrom( "[email protected]", "From Name" ); $phpmailer->addAddress( "[email protected]", "Your name" ); $phpmailer->Subject = "Testing PHPMailer"; $phpmailer->Body = "Hurray! \n\n Great."; if( !$phpmailer->send() ) { echo "Mailer Error: " . $phpmailer->ErrorInfo; } else { echo "Message sent!"; } }
-
- 2017-05-21
Вы можете использовать действие wp_mail_failed,чтобы поймать ошибку отправки.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/
You can use the 'wp_mail_failed' action to catch a send error.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/
-
- 2015-11-01
То,что я обычно делаю,чтобы проверить,правильно ли
wp_mail()
отправляет электронные письма,- это просто зарегистрироваться на моем веб-сайте с другим адресом электронной почты и посмотреть,приходит ли электронное письмо.Если это так,это означает,что WordPress правильно отправляет электронные письма (он используетwp_mail()
для отправки регистрационных писем),и вам следует проверить свою функцию отправки почты на наличие ошибок.Для этого,как предложил @Tobias,вы должны удалить все из своей функции отправки почты и оставить только базовые:function wpse_100047() { echo wp_mail( '[email protected]', 'WP Mail Test', 'Mail is working' ); }
Кроме того,электронные письма,отправленные WordPress (поскольку все электронные письма,отправленные функцией PHP
mail()
,могут быть заблокированы некоторыми почтовыми серверами (или помечены как спам),поэтому они всегдахорошая идея использовать SMTP (несколько плагинов,которые это делают) для электронной почты на действующем веб-сайте.What I usually do to test if
wp_mail()
is sending e-mails properly is just registering on my website with another e-mail address and seeing if the e-mail arrives. If it does, it means that WordPress is properly sending e-mails (it useswp_mail()
to send registration e-mails) and you should inspect your mail sending function for any errors. To do that, as @Tobias suggested, you should strip everything from your mail sending function and only leave the basic:function wpse_100047() { echo wp_mail( '[email protected]', 'WP Mail Test', 'Mail is working' ); }
Additionally, the e-mails sent by WordPress (as all e-mails sent by PHP's
mail()
function might be blocked by some e-mail servers (or marked as spam) so it's always a good idea to use SMTP (multiple plugins that do that) for e-mails on the live website. -
- 2014-04-22
Я бы начал с включения WP_DEBUG в wp-config и посмотрел,показывает ли это что-нибудь о вашем коде.или код функции wp_mail.Вот и все для отладки прямо из коробки с WP.
Кроме того,вы можете использовать Easy WP SMTP и включить отладку и/или настроить ееиспользовать SMTP.На WordPress.org есть похожие плагины,но я знаю,что у этого есть хороший вариант отладки.Если что-то вроде GMail работает,вы будете знать,что это настройка сервера,а не этот код.
I would start by enabling WP_DEBUG in wp-config and see if that shows you anything about your code or the code for the wp_mail function. That is about it for debugging right out of the box with WP.
Also, you can use Easy WP SMTP and enable debugging and/or set that up to use SMTP. There are similar plugins on WordPress.org but I know this one has a good debug option. If something like GMail works then you'll know it is a server setting and not this code.
-
- 2020-04-14
В этом документе содержались очень интересные предложения.
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
В частности,при работе с виртуальной машиной Azure конфигурация 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
Эта команда возвращает логическое значение "включено" или "выключено". Если он выключен,мы можем включить его:
sudo setsebool -P httpd_can_sendmail 1 sudo setsebool -P httpd_can_network_connect 1
Если вы запускаете PHP-FPM черезfastcgi,вы может потребоваться применить это к демонуfpm,а не к httpd.
Very interesting suggestions were in this document.
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
In particular working with Azure Virtual Machine the SELinux config was blocking the outgoing connections.
If you see an error like
SMTP -> ERROR: Failed to connect to server: Permission denied (13)
, you may be running into SELinux preventing PHP or the web server from sending email. This is particularly likely on RedHat / Fedora / Centos. Using thegetsebool
command we can check if the httpd daemon is allowed to make a connection over the network and send an email:getsebool httpd_can_sendmail getsebool httpd_can_network_connect
This command will return a boolean on or off. If it's off, we can turn it on:
sudo setsebool -P httpd_can_sendmail 1 sudo setsebool -P httpd_can_network_connect 1
If you're running PHP-FPM via fastcgi, you may need to apply this to the fpm daemon rather than httpd.
Я пытаюсь использовать
wp_mail
(тестирование на локальном компьютере),но почта не приходит. Вphp.ini
установленsmtp_port = 25
,аphpmail()
пока работает.Вот код моей почтовой функции:
Я не получаю ошибок. Есть ли способ переключить регистрацию ошибок для Wordpress?
noreply_address
- этоnoreply@root