我正在使用以下phpmailer功能发送1000+邮件
<?php
function sendMail($sendTo,$Subject,$Body){
require_once 'PHPMailer/PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.example.com;smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'newsletter@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->From = 'newsletter@example.com';
$mail->FromName = 'xyz';
$mail->WordWrap = 50;
$mail->isHTML(true);
$mail->addAddress($sendTo);
$mail->Subject = $Subject;
$mail->Body = ( stripslashes( $Body ) );
$mail->AltBody = 'Please Use a Html email Client To view This Message!!';
if(!$mail->send()) {
$return = 'Message could not be sent.';
// echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
$return = 'Message has been sent!';
}
return $return;
}
这是我用来调用函数的代码
foreach ($emails as $email) {
$subject = "sample subject";
$body = "sample body";
sendMail($email, $subject, $body);
}
$ emails数组的大小是1000+ 有更快更好的方法吗?
答案 0 :(得分:8)
您应该从reading the docs provided with PHPMailer开始,在那里找到this example。
特别要注意的是,请确保使用SMTPKeepAlive
- 您可能会发现按域排序列表可以最大限度地提高连接重用率。
正如zerkms所说,你应该提交给本地邮件服务器以获得最佳性能,但令人惊讶的是,在PHPMailer中使用mail
或sendmail
选项并不总是比SMTP更快到本地主机,主要是因为postfix&#39 ; sendmail二进制文件打开了一个到localhost的同步SMTP连接 - postfix&#39;由于这个原因,docs建议将SMTP发送到localhost以获得最佳性能。
如果您要发送到localhost,请不要使用身份验证或加密,因为开销并没有为您带来任何好处,但如果您使用的是远程服务器,请使用端口587上的tls而不是过时ssl在465港口。
通常要避免直接向最终用户发送 - PHPMailer中的SMTP客户端有些愚蠢 - 它根本不处理排队,因此任何具有灰名单或交付延迟以进行流量控制的域都将无法交付。最好的方法是使用SMTP到附近的MTA并将队列处理留给它。您也可以从中退回,这样您就可以从列表中删除错误的地址。
答案 1 :(得分:1)
未经测试,但这应该可行。
基本上,它重用原始对象(从而减少了内存分配)。
require_once 'PHPMailer/PHPMailerAutoload.php';
class BatchMailer {
var $mail;
function __construct () {
$this->mail = new PHPMailer;
$this->mail->isSMTP();
$this->mail->Host = 'smtp.example.com;smtp.example.com';
$this->mail->SMTPAuth = true;
$this->mail->Username = 'newsletter@example.com';
$this->mail->Password = 'password';
$this->mail->SMTPSecure = 'ssl';
$this->mail->SMTPKeepAlive = true;
$this->mail->Port = 465;
$this->mail->From = 'newsletter@example.com';
$this->mail->FromName = 'xyz';
$this->mail->WordWrap = 50;
$this->mail->isHTML(true);
$this->mail->AltBody = 'Please use an HTML-enabled email client to view this message.';
}
function setSubject ($subject) {
$this->mail->Subject = $subject;
}
function setBody ($body) {
$this->mail->Body = stripslashes($body);
}
function sendTo ($to) {
$this->mail->clearAddresses();
$this->mail->addAddress($to);
if (!$this->mail->send()) {
// echo 'Mailer Error: ' . $this->mail->ErrorInfo;
return false;
} else {
return true;
}
}
}
$batch = new BatchMailer;
$batch->setSubject('sample subject');
$batch->setBody('sample body');
foreach ($emails as $email) {
$batch->sendTo($email);
}
答案 2 :(得分:-1)
通过cgi将函数放入c ++。 c ++邮件程序比首先访问整个http框架要强大得多。 http://www.cplusplus.com/forum/windows/86562/ 但是PhP已经为它的关联数组使用了哈希表,因此你不会再使用哈希表来获取速度。所以你真的在你的网络框架中最大化了。 将它放到系统级功能中,c是您最快/最精简的选择。 除非你真的有汇编语言才能。