Отправка массовой рассылки с помощью phpmailer - PullRequest
4 голосов
/ 13 октября 2011

Я новичок в Phpmailer, и я использую его для отправки массовых писем более тысячи человек из аккаунта noreply.Код работает нормально, когда я отправляю электронное письмо одному или двум людям, но когда я отправляю его всем (включая меня), оно переходит в спам.Еще одна проблема заключается в деталях электронного письма, в котором показаны идентификаторы всех людей, которым оно было отправлено, что я не хочу.Код выглядит следующим образом:

//date_default_timezone_set('America/Toronto');

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php  if not already loaded

$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host          = "smtp1.site.com;smtp2.site.com";
$mail->SMTPAuth      = true;// enable SMTP authentication
$mail->SMTPKeepAlive = true;// SMTP connection will not close after each email sent
$mail->Host          = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port          = 26;                    // set the SMTP port for the server
$mail->Username      = "yourname@yourdomain"; // SMTP account username
$mail->Password      = "yourpassword";        // SMTP account password
$mail->SetFrom('noreply@mydomain.com', 'List manager');
$mail->AddReplyTo('list@mydomain.com', 'List manager');
$mail->Subject       = 'Newsletter';
$ids = mysql_query($select, $connection) or die(mysql_error());
while ($row = mysql_fetch_row($ids)) {
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$mail->AddAddress($row[0]);
$mail->Send();//Sends the email
}

Ответы [ 3 ]

12 голосов
/ 13 октября 2011

Как указывает JoLoCo, метод AddAddress() просто добавляет новый адрес в существующий список получателей. И поскольку вы делаете это как цикл добавления / отправки, вы отправляете чертовски много дубликатов первому получателю, на одну меньше второму и т. Д. *

Что вам нужно:

while($row = mysql_fetch_row(...)) {
   $mail->AddAddress($row[0]);
   $mail->send();
   $mail->ClearAllRecipients(); // reset the `To:` list to empty
}

С другой стороны, поскольку это приводит к тому, что на вашем почтовом сервере много одиночных писем, другой вариант - создать одно ЕДИНСТВЕННОЕ письмо и BCC всех получателей.

$mail->AddAddress('you@example.com'); // send the mail to yourself
while($row = mysql_fetch_row(...)) {
   $mail->AddBCC($row[0]);
}
$mail->send();

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

3 голосов
/ 13 октября 2011

Я думаю, что вы добавляете новый адрес к уже отправленному электронному письму - поэтому первое электронное письмо будет отправлено одному человеку, второе отправленное электронное письмо будет отправлено тому же самому человеку, плюс другому, третье - этим двум плюс еще один, и так далее.

Кроме того, я не думаю, что вам нужно каждый раз устанавливать AltBody и MsgHTML.

Сначала вы должны добавить все адреса в поле BCC, а затем отправить.

Так что попробуй ...

// rest of code first
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$mail->AddAddress("you@example.com")

$ids = mysql_query($select, $connection) or die(mysql_error());
while ($row = mysql_fetch_row($ids)) {
  $mail->AddBCC($row[0]);
}

$mail->Send();//Sends the email
2 голосов
/ 13 октября 2011

Используйте BCC (Blind Carbon Copy), чтобы скрыть список получателей. Что касается проблемы со спамом, то от провайдера электронной почты получателей зависит, что будет спамом, а что нет, и существует множество факторов.

...