【问题标题】:wp_mail() in a loop, only sending to last addresswp_mail() 在一个循环中,只发送到最后一个地址
【发布时间】:2013-11-18 00:22:02
【问题描述】:

我正在使用一个插件,它允许您向x 的人数发送电子邮件。您所要做的就是输入他们的“姓名”和“电子邮件地址”。这些条目分别命名为friend_name[0]friend_email[0]。有 +- 按钮用于添加和删除输入字段。 $key 中的数字相对于字段数上下波动。我已确认报名表上的所有$keys 更改。

当表单提交并通过循环处理时,所有电子邮件都发送,但仅发送到最后输入的电子邮件。因此,如果我输入 5 个姓名和 5 封电子邮件,他们会发送这些数据:

姓名: John Doe 1 电子邮件: JohnDoe5@gmail.com

姓名: John Doe 2 电子邮件: JohnDoe5@gmail.com

姓名: John Doe 3 电子邮件: JohnDoe5@gmail.com

姓名: John Doe 4 电子邮件: JohnDoe5@gmail.com

姓名: John Doe 5 电子邮件: JohnDoe5@gmail.com

这是循环:

function invfr_sendmail() {
$post = ( !empty( $_POST ) ) ? true : false;

if( $post ) {
    $subject = invfr_get_settings( 'subject' );
    $message = invfr_get_settings( 'message' );
    $friends = $_POST['friend_email'];
    $headers = "From:" . $_POST['user_name'] . " <" . $_POST['user_email']. ">" . "\r\n";
    $errors = array();
    foreach ( $friends as $key => $friend ) {
        $name = stripslashes( $_POST['friend_name'][$key] );
        $email = trim( $_POST['friend_email'][$key] );

        // Check name
        if( !$name )
            $errors[] = '#friend_name-' . $key;

        if( !$email )
            $errors[] = '#friend_email-' . $key;

        if( $email && !is_email( $email ) )
            $errors[] = '#friend_email-' . $key;
    }

    // send email 
    if( !$errors ) {
        foreach ( $friends as $key => $friend )
            $mail = wp_mail( $email, invfr_tokens_replacement( $subject, $_POST, $key ), invfr_tokens_replacement( $message, $_POST, $key ), invfr_tokens_replacement( $headers, $_POST, $key ) );
        if( $mail )
            echo 'sent';
    }

【问题讨论】:

    标签: php wordpress email loops


    【解决方案1】:

    您的foreach ( $friends as $key =&gt; $friend ) 循环每次都在重写$name$email 变量,所以最后它们将只有最后一个值。您应该在检查错误后将此数据存储在数组中:

        // Check name and email 
        $data_missing = false;
        if( ! $name ) {
            $errors[] = '#friend_name-' . $key;
            $data_missing = true;
        } 
        if ( ! $email || ! is_email( $email) ) {
            $errors[] = '#friend_email-' . $key;
            $data_missing = true;
        } 
        if ( ! $data_missing ) {
            $email_data[] = array( 'name' => $name, 'email' => $email );
        }
    

    然后,在你的发送邮件部分循环遍历这个数组:

    if ( ! empty( $email_data) ) {
        foreach( $email_data as $data ) {
            $name = $data['name'];
            $email = $data['email'];
            $mail = wp_mail( .... )
        }
    }
    

    【讨论】:

    • 非常感谢您的回复!我会试试这个,让你知道。再次感谢。
    • 这就是我最终对你给我的代码所做的事情:pastebin.com/g5pWQBz2 出现某种错误,但它不是任何类型的记录。我想我有一个部分放在错误的括号中。
    • 看起来不错,希望对你有用。如果有,请点击accept answer。之后,您可以考虑如何处理这些错误,以及是否想对已发送的邮件提供一些反馈。编码愉快!
    • 在添加您的代码时,我错误地删除了 $email 和 $name 变量。这正在工作!除了我认为我必须添加一些关于if( $mail ) echo 'sent'; 的内容,这样它就会停止旋转等等。再次感谢您!
    • 嘿!我遇到了一个小问题。除了成功消息之外,一切都在后台运行。 stackoverflow.com/a/19817876/2076384
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多