PHP отправка почты для нескольких пользователей, выбранных из базы данных

#php #mysql #sql #email #mysqli

#php #mysql #sql #Адрес электронной почты #mysqli

Вопрос:

Итак, я использую PHP следующим образом:

 if(isset($userID)) {    

$premium = $con->prepare("
SELECT Email
FROM tblName as d       
WHERE Rank = $rank and Type = $type
"); 
$premium->execute();

$premium->bind_result($email);


} else {
    echo "There is no User ID detected, try to refresh browser.";   
}

while ($premium->fetch()) { 

    # SUBJECT (Subscribe/Remove)
     $subject = "New Resume";

    # RESULT PAGE
    $location = "http://www.website.com";

    $sender = "info@website.com";

    # MAIL BODY
    $message = '<html><body>';    
    $message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
    $message .= "</table>";
    $message .= "</body></html>";

    $cc = "ss@gmail.com";
    $headers = "From: " . $sender . "rn";
    $headers = "BCC: " . $cc . "rn";
    $headers .= "Reply-To: ". strip_tags($_POST['Email']) . "rn";
    $headers .= "MIME-Version: 1.0rn";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1rn";

    $to = $email;

    mail( $to, $subject, $message, $headers) or die ("Mail could not be sent.");
}
header("Location: http://website.com/");
die(); 

mysqli_close($link);
  

Но это не отправка электронной почты для каждого выбранного пользователя. Как правильно я мог бы использовать цикл? Должен ли я использовать foreach или улучшать while цикл? Как я могу подать заявку arrays в этом случае? Может ли кто-нибудь направить меня по правильному пути? Спасибо!

Комментарии:

1. Вы упускаете из prepared statements виду возможность прямого встраивания переменных в заполнители sql — use и присваиваете переменные, входящие bind_param в mysqli или bindParam в pdo. Начальная headers строка перезаписывается 2-й строкой $headers ="BCC: " . $cc . "rn";

2. у вас много ошибок в вашем коде

3. @mohade спасибо за ответ, я хотел бы услышать любые предложения по улучшению кода.

4. $ to = $email откуда вы получаете $email и каково его содержимое… второй $headers перезаписал первый, который ему нужен (.)

5. @mohade $email происходит от bind_results

Ответ №1:

Поскольку вы используете BCC, не используйте цикл для отправки почты. перебирайте результат вашего запроса, собирайте все идентификаторы получателей и отправляйте почту за один вызов.

BCC: слепая копия для третичных получателей, которые получают сообщение. Первичные и вторичные получатели не могут видеть третичных получателей. В зависимости от программного обеспечения электронной почты третичные получатели могут видеть только свой собственный адрес электронной почты в BCC, или они могут видеть адреса электронной почты всех основных и вторичных получателей.

Комментарии:

1. Спасибо за ответ, я не буду использовать BCC в рабочем режиме, я использовал его только для целей тестирования прямо сейчас.

Ответ №2:

Я добился этого, используя циклы foreach.

Перед использованием циклов foreach сохраните все адреса электронной почты в одном массиве и выполните итерацию по массиву, чтобы сократить время выполнения.

Вы могли бы пойти другим путем, выполнив итерацию по всем данным, полученным из базы данных.

Ваш выбор.

Комментарии:

1. Спасибо за ответ, но я не знаю, как правильно использовать массивы для этого.

2. Использование $emails= $premium->fetch_assoc()

3. Это не будет перезаписываться bind_result($email); ? Мне все еще нужно while ($premium->fetch()) { } ?

4. Вам больше не понадобятся все это

Ответ №3:

Вы должны использовать fetch_assoc() in the while, поскольку, если вы используете это, он будет извлекать все записи одну за другой, а затем позволит отправлять почту в соответствии с требованиями, которые вам нужны.

И вам нужно объединить заголовок во второй строке здесь, потому что он перезапишет инструкции

Заменить:

 $headers = "From: " . $sender . "rn";
$headers = "BCC: " . $cc . "rn";
  

с:

 $headers = "From: " . $sender . "rn";
$headers .= "BCC: " . $cc . "rn";
  

Ответ №4:

Подготовленные инструкции должны использовать заполнители для безопасного назначения переменных перед выполнением

Как было указано в комментарии — если вы назначаете каждого получателя в поле BCC, вы можете собирать адреса электронной почты в цикле, но отправлять электронное письмо после цикла. Таким образом, каждый получатель увидит TO адрес, но ни один из других получателей.

 if( isset( $userID, $rank, $type, $_POST['Email'] ) ) {  

    /* create sql with placholders and prepare */
    $sql='select email from tblname where rank=? and type=?';
    $premium = $con->prepare( $sql );

    /* Only proceed if the prepared statement succeeded */
    if( $premium ){

        /* bind the variables to the placeholders and execute */
        $premium->bind_param('ss',$rank,$type);
        $premium->execute();
        $premium->bind_result( $email );



        $to = "ss@gmail.com";
        $bcc= array( $to );
        $subject = "New Resume";
        $location = "http://www.website.com";
        $sender = "info@website.com";   

        /* collect all email addresses and add to BCC */
        while( $premium->fetch() ) {
            $bcc[]=$email;
        }

        /* close the prepared statement */
        $premium->close();

        /* Close the db connection */
        $link->close();


        $message = '
        <html>
            <body>
                <table rules="all" style="border-color: #666;" cellpadding="10"></table>
            </body>
        </html>';

        $headers = "From: " . $sender . "rn";
        $headers .= "BCC: " . implode( ',', $bcc ) . "rn";
        $headers .= "Reply-To: ". strip_tags( $_POST['Email'] ) . "rn";
        $headers .= "MIME-Version: 1.0rn";
        $headers .= "Content-Type: text/html; charset=ISO-8859-1rn";



        $status=@mail( $to, $subject, $message, $headers );




        die( header( "Location: " . ( $status ? 'http://website.com/?mailsent=true' : 'http://website.com/?mailsent=false' ) ) ); 
    } 
} else {
    echo "There is no User ID detected, try to refresh browser.";   
}