wp_mail()在一个循环中,只发送到最后一个地址(wp_mail() in a loop, on

2019-10-18 22:02发布

我使用的一个插件,可以让你的电子邮件发送到x的人量。 所有你所要做的就是输入自己的“名”和“电子邮件地址”。 这些条目被命名friend_name[0] friend_email[0]分别。 有+-用于添加和删除输入字段按钮。 在数$key上升和下降相对于字段数。 我已确认所有的$keys更改报名表上。

当提交表单,并通过循环处理时,电子邮件发送的所有,但只有到最后的电子邮件进入。 所以,如果我进入5名和5的电子邮件,他们用这些数据发送:

名称:李四1 电子邮件:JohnDoe5@gmail.com

名称:李四2 电子邮件:JohnDoe5@gmail.com

名称:李四3 电子邮件:JohnDoe5@gmail.com

名称:李四4 电子邮件:JohnDoe5@gmail.com

名称:李四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';
    }

Answer 1:

foreach ( $friends as $key => $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( .... )
    }
}


文章来源: wp_mail() in a loop, only sending to last address