Отправка массовых сообщений с помощью php mailer с ajax

#php #email #phpmailer

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

Вопрос:

Мне нужна помощь в отправке массовых сообщений электронной почты. Это этот scanario. Выпадающий список содержит категории писем, которые нужно получить. Затем выбранное (значение) передается через функцию, которая получает все электронные письма по выбранному значению из базы данных. И электронные письма передаются в метод addAddress почтовой программы. SQL-запрос работает нормально, но в моих заголовках отображается только выбранное значение из сетевого сеанса, а не все возвращенные электронные письма. Я включаю как коды php, так и коды ajax, а также заголовки ответов.

Блокировка PHP

 $accountid = $_POST['accountid'];


$selectedstatus = $_POST['bulkrecipients']; //From dropdown 
$emailtype = $_POST['emailtype'];
$subject = sanitize_text($_POST['bulksubject']);

$message = sanitize_text($_POST['bulkmessage']);

//Pass recipientemails to function and extract individual emails.
$getemails = getAllEmailsFromStatus($selectedstatus , $_SESSION['username']);

$name = 'Tester';

$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPKeepAlive = true;
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = "";
$mail->Password = '';
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
$mail->isHTML(true);
$mail->setFrom('testproject222', $name);
$mail->Subject = ("$subject");
$mail->Body = $message;


foreach ($getemails as $row) {

    try {

        $mail->addAddress($row['email']);
    } catch (Exception $ex) {
        echo 'Invalid address skipped: ' . htmlspecialchars($row['email']) . '<br>';
        continue;
    }


    try {
        if ($mail->send()) {
            $status = "success";
            $response = "Email is sent";

            //Save the contact details to db.        
            saveAllEmployerEmails($accountid , $subject, emailtype, $message );
        
        } else {
            $status = "failed";
            $response = 'Something is wrong ' . $mail->ErrorInfo;
        }

        exit(json_encode(array("status" => $status, "response" => $response)));
    } catch (Exception $ex) {
        echo 'Mailer Error (' . htmlspecialchars($row['email']) . ') ' . $mail->ErrorInfo . '<br>';
        $mail->getSMTPInstance()->reset();
    }
    $mail->clearAddresses();
    $mail->clearAttachments();
}
  

Ajax

        function sendBulk() {
                    var url = "./inc/emailjobs.php";
                    var accountid = $("#accountid");
                    var emailtype = $("#emailtype");                   
                    var recipientemails = $("#bulkrecipients");
                    var bulksubject = $("#bulksubject");
                    var bulkmessage = $('#'   'bulkmessage').html( tinymce.get('bulkmessage').getContent() );
                   
                    if (isNotEmpty(recipientemails) /*amp;amp; isNotEmptyTextArea("bulkmessage")*/) {
                        $.ajax({
                            url: url,
                            method: 'POST',
                            cache: false,
                            dataType: 'json',
                            beforeSend: function () {
 
                                $('#bulksendbtn').text("Sending...");
                            },
                            data: {
                                accountid: accountid.val(),
                                emailtype: emailtype.val(),
                                bulksubject: bulksubject.val(),
                                bulkrecipients: recipientemails.val(),
                                bulkmessage: bulkmessage.val()
                            }
                            , success: function (response) {
                                $('#bulkemailForm')[0].reset();
                                $('.bulksendmessage').text("Emails Sent.");
                                $('#bulksendbtn').text("Sent");
                            },
                        });
                    }
                }
  

Данные заголовка формы ответа

 accountid: 2
emailtype: bulk
bulksubject: Test
bulkrecipients: shortlisted
bulkmessage: <p>Testing... </p>
  

Вместо «короткого списка» для массовых получателей я ожидаю адреса электронной почты. Я надеялся увидеть 2 возвращенных письма. Предполагается, что «короткий список» используется для получения электронных писем для этой категории (короткий список).

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

1. О каком «заголовке» вы говорите? Что вы пытались отладить проблему?

2. @NicoHaase из консоли. Ajax вернул заголовки.

3. Что вы подразумеваете под «с консоли»? Можете ли вы поделиться более подробной информацией, отредактировав свой вопрос?

4. Хорошо, сойдет. Извините, я имел в виду раздел сети, после проверки страницы. ie формирует данные из раздела заголовков.

Ответ №1:

Ваш код выглядит в целом правильно, но это сбивает с толку:

 $mail->setFrom('Test', $name);
//$mail->From = ("$email");
  

$email не определено и Test не является допустимым адресом from . У меня есть подозрение, что вы пытаетесь использовать произвольный пользовательский адрес электронной почты в качестве адреса отправки. Это не будет работать с Gmail, потому что Gmail не позволяет устанавливать произвольные адреса из; это позволит вам отправлять только от имени владельца учетной записи (то, что вы указали Username ), или псевдонимы, которые вы задали в настройках gmail. Если вы попытаетесь использовать что-либо еще, оно просто проигнорирует это и вместо этого будет использовать адрес вашей учетной записи. Это то, что вы имели в виду под «только выбранным значением из сетевого сеанса»?

Для gmail это вполне разумно, поскольку почти по определению все, что угодно, кроме адреса вашей учетной записи, может быть подделкой, и это никому не нравится.

Если вы хотите отправить электронное письмо, ответы на которое будут отправляться на адрес, указанный пользователем, используйте свой собственный адрес в адресе from и используйте адрес, отправленный пользователем, в качестве ответа. Смотрите Пример контактной формы, поставляемой с PHPMailer, о том, как это сделать.

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

1. Я использую одно электронное письмо в качестве адреса from (обратите внимание, у меня есть готовый и работающий скрипт для отправки отдельных писем) Я сделал несколько правок перед публикацией (моя ошибка). Под «только выбранным значением из сетевого сеанса» я подразумевал возвращаемое значение с помощью идентификатора bulkrecipients. Я получаю только выбранное значение, а не электронные письма

2. Блок массового кода работает сейчас, но теперь отправляется только одному получателю вместо 2 электронных писем, извлеченных из базы данных, возвращаемых функцией. ‘getAllEmailsForInterviewStatus(…)’