簡體   English   中英

使用php發送(相對)大量的html電子郵件

[英]Sending (relatively) large volumes of html e-mail with php

發送大量html電子郵件的最佳方法/類是什么?

(每封郵件都必須包含(從mysql數據庫中獲取)鏈接到其發送地址的信息)

首先,我將所需的信息存儲在臨時表中(不是臨時表,而是完成后刪除的普通表)。

然后,我生成郵件,並隨即刪除已處理的記錄,並將生成的郵件放入“發件箱”表中。

最后,腳本每N分鍾觸發一次,以將M條記錄從“發件箱”表中刪除:它發送一封郵件,然后從發件箱表中刪除該郵件。

為什么使用瞬態表? 因為發生這一切的服務器具有非常嚴格的時間限制。 使用上述方法可以使我部分生成郵件; 您可以安全地重新運行生成階段,而不必擔心會生成重復的郵件。 因此,盡管服務器取消了該工作,但腳本仍在進步。

發送腳本每小時發送(60 / N)* M封郵件,再次在服務器的限制內工作。

我建議使用Pear軟件包Mail( http://pear.php.net/package/Mail )和Mail_Mime( http://pear.php.net/package/Mail_Mime )。

如果需要排隊系統,可以嘗試gearman( http://gearman.org/

我使用Zend_Mail 以下示例(來自docs )顯示了如何通過單個SMTP連接發送多個郵件:

// Create transport
$config = array('name' => 'sender.example.com');
$transport = new Zend_Mail_Transport_Smtp('mail.example.com', $config);

// Set From & Reply-To address and name for all emails to send.
Zend_Mail::setDefaultFrom('sender@example.com', 'John Doe');
Zend_Mail::setDefaultReplyTo('replyto@example.com','Jane Doe');

// Loop through messages
for ($i = 0; $i < 5; $i++) {
    $mail = new Zend_Mail();
    $mail->addTo('studio@example.com', 'Test');

    $mail->setSubject(
        'Demonstration - Sending Multiple Mails per SMTP Connection'
    );
    $mail->setBodyText('...Your message here...');
    $mail->send($transport);
}

// Reset defaults
Zend_Mail::clearDefaultFrom();
Zend_Mail::clearDefaultReplyTo();

您只需要修改循環,即可從數據庫中獲取要發送的每條消息的特定數據。 此外,您將不需要整個框架來使用Zend_Mail

看一下: http : //framework.zend.com/manual/en/zend.mail.multiple-emails.html

我認為第一個考慮因素是可能需要花費一些時間來處理-因此不應該作為同步Web請求進行處理-請參閱

最好的方法來管理長期運行的PHP腳本?

這樣就產生了有關創建HTML電子郵件的各種問題。 您可能想看看其中一種用於生成電子郵件本身的現成軟件包,例如phpmailer。 另外,如果內容非常復雜,則可以考慮使用模板系統將其設置為網頁-但切記限制對它的任何外部訪問。 例如

<?php
if ($_SERVER["REMOTE_ADDR"]!='127.0.0.1') {
   die ('NO ACCESS!');
}
$send_to=$_GET['email'];
$dbh=mysql_connect(...);
....

然后在您的腳本中:

....
$content=file('http://localhost/generate_email.php?email='
    . urlencode($db_row['recipient']));
mail($db_row['recipient'], $subject, $content);

HTH

C。

我喜歡Karim的想法,盡管我會try/catch通過$mail->send($transport)進行try/catch ,這樣您可以跟蹤已發送的內容和未發送的內容,並進行相應記錄或在相關內容中進行標記數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM