我修改了您的代码以解决一些问题,但问题可能不是您的代码。
首先,你回来得太早了。发送电子邮件之前,成功返回原始代码。我将其移到了末尾,以便它根据您是否有帖子ID在末尾设置一个值(成功或错误),然后返回。这样,您也可以获得邮件功能。
你不太可能两者都需要wp_mail()
和mail()
. 如果你这么做是因为你认为wp_mail()
不起作用,那真的没用。wp_mail()
使用phpMailer库如果尚未进行任何自定义,phpMailer将使用mail()
- 所以这些最终都是一样的,除非在没有WP的情况下运行,在这种情况下,您会得到错误,因为函数wp_insert_post()
将是未定义的。
此外,文档wp_send_json()
表示您不需要wp_die()
因为它在函数中为您处理这些。
以下是您的代码和这些更改:
public function submit_contact() {
if (! DOING_AJAX || ! check_ajax_referer(\'contact-nonce\', \'nonce\') ) {
return $this->return_json(\'error\');
}
$name = sanitize_text_field( $_POST[\'name\'] );
$phone = sanitize_text_field( $_POST[\'phone\'] );
$email = sanitize_email( $_POST[\'email\'] );
$message = sanitize_textarea_field( $_POST[\'message\'] );
$data = array(
\'name\' => $name,
\'package\' => $package,
\'phone\' => $phone,
\'email\' => $email,
\'date\' => $date,
\'date\' => $message,
\'approved\' => 0,
\'featured\' => 0,
);
$args = array(
\'post_title\' => $name,
\'post_content\' => $message,
\'post_author\' => 1,
\'post_status\' => \'publish\',
\'post_type\' => \'contact\',
\'meta_input\' => array(
\'_zon_contact_key\' => $data
)
);
$postID = wp_insert_post( $args );
if ( $postID ) {
wp_mail( \'[email protected]\', \'The subject\', \'The message\' );
}
$return_val = ( $postID ) ? \'success\' : \'error\';
return $return_val;
}
public function return_json( $status ) {
$return = array(
\'status\' => $status
);
wp_send_json($return);
}
If you\'re still not getting emails, 我会在邮件方面做一些故障排除。如果插入了帖子但没有电子邮件,则表明您的代码正常工作,这可能是邮件发送的问题,而不是您的代码。
如果您使用共享主机,则需要检查通过脚本发送电子邮件的规则。WP将从发送”[email protected]“默认情况下。一些主机要求“发件人”地址是真实的电子邮件。因此请检查该地址。此外,您已经设置了此代码,以便使用简单的主题和邮件正文进行测试。发送主机可能会拒绝,因为基于正文如此短,它认为这是垃圾邮件。”。
Note: I updated and clarified this section
我的怀疑是,如果您输入电子邮件记录器,您可能会发现
wp_mail()
正在运行(并记录)邮件,就好像邮件已发送,但您仍然没有收到它。如果是这样,那是因为您的主机拒绝了发送。
通过设置为通过SMTP发送,很容易避免所有这些事情。这将避免大多数问题。有很多方法可以做到这一点,使用插件或代码。互联网上有很多例子-this is just one of them.
如果您不能使用SMTP,那么您可能需要使用WP的默认邮件头等来解决其他可能的电子邮件问题。这是an article with more information on that kind of troubleshooting.
UPDATE #2 - Address Email Not Being Received
根据您的更新,您的问题是未收到电子邮件。依我看,这可能是因为你设置标题的方式。因此,您的电子邮件被拒绝。
正如我在原始答案中所述,您最好设置通过SMTP帐户发送。这将帮助您避免许多潜在问题。
无论您是否这样做,您都需要修复标头问题。除非绝对需要,否则不要弄乱标题。我建议你把它完全去掉。
如果必须保留它,则需要修复以下问题:
除非您正在更改某些内容,否则不要声明它
$当前\\u用户未定义将标头作为数组值传递标题中的“发件人”值格式不正确Unless you\'re changing something, don\'t declare it. wp_mail()
设置所有未声明的默认值。我建议您一定要删除mime类型声明和内容类型。
$current_user
is undefined 在您发布的代码中。添加以下内容以确保已定义:
$current_user = wp_get_current_user();
Pass headers as array values.
wp_mail()
接受字符串或数组,但如果它是字符串,则会分解为数组,因此您也可以从数组开始。
"From" value in the header is malformed 你拥有它的方式。除地址外,您还必须有“发件人”名称。它需要采用以下格式:
"From: The From Name <[email protected]>"
如果您没有“姓名”,请替换电子邮件地址:
$headers[] = \'From: \' . $current_user->user_email . \'<\' . $current_user->user_email . \'>\';
解决了这些问题后,我建议:
if ($postID) {
$current_user = wp_get_current_user();
$headers[] = \'From: \' . $current_user->user_email . \'<\' . $current_user->user_email . \'>\';
$to = $email;
$title = "Test email from";
$body = "Hello " . $name . " Your ZonPackage " . $package . " Booking Confirmed ." ;
$subject ="Zon Package Booking";
wp_mail( $to, $subject, $body, $headers );
}
请记住,这可能无法完全解决您的问题。如果您的“发件人”地址没有与发送域匹配的域,您可能仍然看起来像“垃圾邮件”,并被拒绝。此外,请确保检查您的垃圾邮件文件夹,以查看您的邮件是否已收到,但已标记为垃圾邮件。