如何在CPT页面中使用wp_mail

时间:2018-12-12 作者:Noufal Binu

我有一个CPT,在CPT中我有一个联系表格。联系人表单直接发送到WordPress仪表板,现在我正在尝试实现当用户提交联系人表单时,他们将在其电子邮件地址中收到一条“感谢联系我们”消息(用户在表单中填写电子邮件)我是WordPress的新手;PHP。我正在使用Ajax表单验证&;传递数据。$email = sanitize_email($_POST[\'email\']);. 此变量数据从用户电子邮件地址捕获,然后发送他们的电子邮件地址感谢电子邮件。非常感谢您的帮助。

EDIT

我可以通过电子邮件发送到WordPress网站托管的电子邮件id,例如:[email protected]另一个Gmail,hotmail,像电子邮件一样实时验证程序不工作。我检查了一个小插件check email 它不是smtp,但可以向任何电子邮件提供商发送电子邮件。我不知道我怎么了,我尽了全力。

public function submit_testimonial()
    {

        if (! DOING_AJAX || ! check_ajax_referer(\'testimonial-nonce\', \'nonce\') ) {
            return $this->return_json(\'error\');
        }

        $name = sanitize_text_field($_POST[\'name\']);
        $package = sanitize_text_field($_POST[\'package\']);
        $phone = sanitize_text_field($_POST[\'phone\']);
        $date = sanitize_text_field($_POST[\'date\']);
        $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\' => \'testimonial\',
            \'meta_input\' => array(
                \'_zon_testimonial_key\' => $data
            )
        );

        $postID = wp_insert_post( $args );


        if ($postID) {
            $headers = "MIME-Version: 1.0\\r\\n" .
            "From: " . $current_user->user_email . "\\r\\n" .
            "Content-Type: text/plain; charset=\\"" . get_option(\'blog_charset\') . "\\"\\r\\n";
            $to = $email;
            $title = "Test email from";
            $body = "Hello " .  $name . " Your ZonPackage " . $package . " Booking Confirmed ." ;
            $subject ="Zon Package Booking";
            wp_mail( $to, $subject, $body, $headers );
        }




        if ($postID) {
            return $this->return_json(\'success\');

        }

    }

    public function return_json( $status ) {
        $return = array(
            \'status\' => $status
            );
            wp_send_json($return);

    }

2 个回复
最合适的回答,由SO网友:butlerblog 整理而成

我修改了您的代码以解决一些问题,但问题可能不是您的代码。

首先,你回来得太早了。发送电子邮件之前,成功返回原始代码。我将其移到了末尾,以便它根据您是否有帖子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 );
        }
    
    请记住,这可能无法完全解决您的问题。如果您的“发件人”地址没有与发送域匹配的域,您可能仍然看起来像“垃圾邮件”,并被拒绝。此外,请确保检查您的垃圾邮件文件夹,以查看您的邮件是否已收到,但已标记为垃圾邮件。

  • SO网友:Greg Winiarski

    如果帖子保存在数据库中,则mail() 也没有wp_mail() 函数未运行,因为函数在此结束

    if ($postID) {
        return $this->return_json(\'success\');
    }
    
    剪切这三行代码并将其粘贴到return $this->return_json(\'error\');

    此外,您不需要wp\\u die()函数,因为wp\\u send\\u json()将运行exit;为了你。

    相关推荐

    在AJAX调用中加载oEmbedded IFRAME

    我正在尝试加载通过ajax加载的oembed短代码。问题是,oembed短代码似乎很有效,因为我有一个blockquote而不是instagram链接。但是,blockquote没有被iframe替换。应该有一个javascript函数来搜索blockquotes并用iframe替换它,但它没有被激发,因为我没有加载所有页面?有人知道怎么发射这个吗?谢谢