Вопрос или проблема
Я использую wp_mail() для отправки электронной почты с использованием ajax. Мой код для отправки письма выглядит следующим образом.
add_action( 'wp_ajax_send_confirmation_email', 'wpse_sendmail' );
add_action( 'wp_ajax_nopriv_send_confirmation_email', 'wpse_sendmail' );
function wpse_sendmail() {
if(isset($_GET['is_email']) && $_GET['is_email'] == true){
$temp_dir = get_template_directory_uri();
$url = $temp_dir."/confirm_email.php?id=".$_REQUEST['id']."&key=".$_REQUEST['key'];
$message = "Имя пользователя: ".$_REQUEST['name']."Нажмите на ссылку ниже, чтобы подтвердить вашу электронную почту: ".$url;
$subject = "Ссылка для подтверждения электронной почты";
$headers = "From: [email protected]" . "\r\n";
if ( wp_mail( $_REQUEST['email'], $subject, $message, $headers ) ) {
echo "1";
} else {
echo "0";
}
}
}
А код AJAX выглядит следующим образом
add_action('wp_footer','my_scripts');
function my_scripts(){
?>
<script type="text/javascript">
jQuery("#send").click(function(e){
e.preventDefault(); // если нажатый элемент является ссылкой
//...
var confirm_email=jQuery("#confirm_email").val();
var confirm_key=jQuery("#confirm_key").val();
var user_email="<?php echo $current_user->user_email;?>";
var display_name="<?php echo $current_user->display_name;?>";
var user_id='<?php echo $current_user->ID;?>';
var data = { 'action':'send_confirmation_email', 'email':'confirm_email','key':'confirm_key','name':'display_name','id':'user_id','is_email':'true' };
jQuery.post('<?php echo admin_url('admin-ajax.php'); ?>', data, function(response) {
if(response=="1"){
jQuery(".confirm_email_section").html("<span class="alert alert-success">Ссылка для подтверждения отправлена на вашу электронную почту. Проверьте ваш почтовый ящик<span>");
}
else{
jQuery(".confirm_email_section").html("<span class="alert alert-danger">Произошла ошибка<span>");
}
});
});
</script>
<?php
}
Каждый параметр, переданный через ajax, получает значение в вышеуказанной функции wpse_sendmail(), но письмо не отправляется. Она всегда возвращает false. И электронная почта в тоже время не отправляется через функцию mail() в functions.php но работает в отдельном файле. Я не знаю, что идет не так. Если кто-то сможет мне помочь, я буду благодарен.
И не будет никаких шансов, что это сработает таким образом…
В вашем JS вы заполняете данные вот так:
var data = {
'action':'send_confirmation_email',
'email':'confirm_email',
'key':'confirm_key',
'name':'display_name',
'id':'user_id',
'is_email':'true'
};
А позже, в вашем обратном вызове AJAX в PHP, вы используете это так:
wp_mail( $_REQUEST['email'], $subject, $message, $headers );
Таким образом, вы пытаетесь отправить сообщение электронной почты, используя “confirm_email” в качестве адреса получателя. Это невозможно, и это не сработает 😉
Пожалуйста, проверьте add_action( 'wp_ajax_send_confirmation_email', 'wpse_sendmail' );
, это должно быть add_action( 'wp_ajax_wpse_sendmail', 'wpse_sendmail' );
, так как у вас называется функция
Ответ или решение
Для решения вашей проблемы с отправкой электронной почты через функцию wp_mail()
при использовании AJAX, давайте подробнее разберем ваш код и выявим основные ошибки.
-
Ошибка с передачей параметров: В вашем JavaScript-коде вы неправильно передаете переменные в объект
data
. В текущем коде вы передаете строковые литералы'confirm_email'
,'confirm_key'
,'display_name'
, и'user_id'
вместо значения переменных. Вам нужно передать значения этих переменных, а не их имена. Исправьте код следующим образом:var data = { 'action': 'send_confirmation_email', 'email': confirm_email, // убираем кавычки 'key': confirm_key, // убираем кавычки 'name': display_name, // убираем кавычки 'id': user_id, // убираем кавычки 'is_email': 'true' };
-
Ошибка с именем действия: Также убедитесь, что вы используете корректное имя действия в
add_action
. В вашем примере вы правильно указали ‘wp_ajax_send_confirmation_email’, если используете это же имя в AJAX вызове. Пожалуйста, проверьте, чтобы всё совпадало:add_action('wp_ajax_send_confirmation_email', 'wpse_sendmail'); add_action('wp_ajax_nopriv_send_confirmation_email', 'wpse_sendmail');
-
Заголовок письма: Убедитесь, что заголовок указания ‘From’ корректен. В вашем коде он как-то неполный. Убедитесь, что используется именно обычный адрес без
mailto
, например:$headers = "From: Your Name <your-email@example.com>" . "\r\n";
-
Проверка отправки: Раз вы упомянули, что
mail()
не работает вfunctions.php
, это может указывать на наличие проблем с конфигурацией серверной почты. Проверьте настройки вашего хостинга относительно отправки почты. Вы можете использовать плагины, такие как "WP Mail SMTP", чтобы легко настраивать SMTP для отправки электронной почты, что будет надежнее, чем использовать встроенную функциюmail()
. -
Отладка: Добавьте отладочные сообщения для проверки, действительно ли функция
wp_mail()
вызывается. Например, вы можете записать в лог ошибок:error_log("Attempting to send email to " . $_REQUEST['email']);
Если вы все проверили и исправили, а проблема осталась, попробуйте протестировать, используя разные адреса электронной почты и проверьте наличие ошибок в логах сервера.
Если все вышеперечисленное не помогает, обратитесь к вашему хостинг-провайдеру, потому что проблема может быть связана с настройками сервера.