我们可以在PHP邮件程序中编译和存储消息作为草稿,然后再发送每条消息吗?
答案 0 :(得分:6)
可以用PHPMailer来做到这一点。在使用您通常需要发送消息的所有内容配置PHPMailer实例后,请不要调用send()
- 而是调用preSend()
(构造消息)然后使用{{{}获取消息内容1}},例如
getSentMIMEMessage()
然后 $mail->preSend();
$message = $mail->getSentMIMEMessage();
将包含完整的RFC822消息,您可以将其粘贴到数据库,队列或稍后发送的任何内容中。要稍后进行实际发送,您可以直接使用PHPMailer's SMTP class。要了解如何驾驶该课程,请查看PHPMailer's smtpSend()
功能。
答案 1 :(得分:2)
我不这么认为PHPMailer支持此功能。但是你可以使用DB Table来做到这一点。在数据库中创建一个表来存储消息,收件人,来自标题等,然后由PHPMailer从CRON作业发送它们。
答案 2 :(得分:0)
PHPMailer不支持这一点,因为它保留了Object中的Email消息,该消息将在脚本结束后消失(HTTP协议以这种方式工作)。
如果你想发送后者(比如15分钟后),你需要确实使用CRON作业并制作一个脚本查看数据库并发送电子邮件。
如果你想在剧本的生命周期内发送它们(在标签之后发送),你可以简单地做一系列电子邮件并在最后foreach
点击它们
答案 3 :(得分:0)
您需要创建
这就是全部。
答案 4 :(得分:0)
我在尝试自己做这个问题时偶然发现了这个问题 - 我希望将PHPMailer对象存储在数据库中以便稍后从不同的服务器发送,以便有一个邮件队列来限制每秒发送的电子邮件数量以及发送错误时回送消息。
解决方案很简单 - 而不是
$phpmailerObject->send();
做一个:
$phpmailerObject->preSend();
然后序列化数据库中的对象。如果要稍后保存邮件,请获取数据库条目,反序列化对象,然后执行:
$phpmailerObject->postSend();
在内部,如果发送()一个对象实例,PHPMailer只执行preSend()和postSend()。在保存对象之前使用preSend()非常重要,因为您将使用所有附件和数据创建mime标头和正文。如果在具有不同设置的其他服务器上执行preSend(),则可能找不到附件文件/图像,并且会出现错误。 postSend()仅使用"编译"发送数据。电子邮件。
我还建议使用" true"创建每个PHPMailer实例。在构造函数中(以启用异常)并将trySend()包装在try / catch-block中以处理任何发送/ SMTP错误。我学到了很难的方法。
答案 5 :(得分:0)
此时PHPMailer库具有getSentMIMEMessage
函数,该函数以紧凑的方式保存消息,但库尚未发送保存的电子邮件消息。
因此,目前最好的方法是将序列化PHPMailer对象,将字符串保存在数据库或文件中,并在需要发送后恢复它。
以下是我创建的用于对无法在脚本中发送的邮件进行排队的函数。
$ file应包含完整路径和文件名。
function sendQueuedMailFile($file) {
$rfcMail = file_get_contents($file);
$phpMailerObj = new PHPMailer();
$phpMailerObj = unserialize( $rfcMail );
if ( $phpMailerVar->postSend() ) {
// If sent correctly, delete file
unlink( $queue_folder . $fichero );
}
}
此函数将phpMailer对象保存到队列文件中。 phpMailer对象应该具有所有地址,主题,内容以及在调用此函数之前执行普通邮件发送所需的值。
function queuePHPMailerToFile($phpMailerObj, $file) {
$phpMailerObj->PreSend();
$phpMailerObj->GetSentMIMEMessage();
$rfcMail = serialize($phpMailerObj);
file_put_contents($file, $rfcMail);
}
您可以将queuePHPMailerToFile函数用于队列邮件,以便以后发送或保存此时无法发送的邮件,并在您下次尝试发送一封电子邮件时尝试发送。
这是将它用于队列失败消息的示例。 queuePath应包含您要保存排队邮件的文件夹。
if ( $phpMailerObj->Send() ) {
// Mail sent ok, trying to look for queued emails
sendEmailQueue($queuePath);
} else {
// Some problem detected, saving mail for next time
queuePHPMailerToFile($phpMailerObj, $queuePath . DIRECTORY_SEPARATOR . date("Y-m-d_Hisu") . "_" . rand(0, 999999) . ".txt");
}
为了结束这个,它是重新发送排队文件的功能
function sendEmailQueue($queuePath) {
if ( is_dir($queuePath) ) {
if ( $dh = opendir($queuePath) ) {
while ( ($file = readdir($dh)) !== false ) {
if ( ($file == '.') or ( $file == '..' ) ) continue;
sendQueuedMailFile($queuePath . DIRECTORY_SEPARATOR . $file);
}
}
}
}