簡體   English   中英

Zend Framework:嘗試使用Zend Mail Transport發送帶附件的多封電子郵件時出現致命錯誤

[英]Zend Framework: Fatal error when trying to use Zend Mail Transport to send multiple emails with attachments

我不完全理解這一切是如何工作的,但我收到了這個錯誤:

致命錯誤:第213行的/Users/andrew/Sites/myApp/library/Zend/Mail/Transport/Smtp.php中允許的內存大小為8388608字節(試圖分配261858字節)

我在運行MAMP的Mac上本地運行此代碼。 不確定這是否與它有關。 這是我的代碼,基本上:

$config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login', 'username' => 'username', 'password' => 'password');
    $smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);

    foreach ($subscribers as $subscriber) {
        $message = new Zend_Mail('utf-8');
        $message->setFrom('my@mailinglist.com', 'Mailing List')
                ->addTo($subscriber->email)
                ->setSubject($subject)
                ->setBodyText($body);
        $attachment = $message->createAttachment(file_get_contents($filepath));
        $attachment->type = 'application/pdf';
        $attachment->filename = $filename;
        $message->send($smtpConnection);
    }

但是,訂閱者越多,這個數字最終得到的越多,這個修復只會幫助這么久:

ini_set("memory_limit","12M");

我需要弄清楚如何發送一封帶有附件的電子郵件給幾百個人。 這是我想出來的其他東西,但是只設置密件抄送而不是地址似乎有點笨拙:

$message = new Zend_Mail('utf-8');
    $message->setFrom('my@mailinglist.com', 'Mailing list')
            ->setSubject($subject)
            ->setBodyText($body);
    $attachment = $message->createAttachment(file_get_contents($filepath));
    $attachment->type = 'application/pdf';
    $attachment->filename = $filename;

    foreach ($subscribers as $subscriber) {
        $message->addBcc($subscriber->email);
    }
    $message->send($smtpConnection);

但是,即使這樣做,我也需要指定“memory_limit”。 你能指點我正確的方向嗎? 有什么我不做的事嗎?

我猜你的pdf大概是250K字節? 您發送的每封電子郵件都會將其讀入內存。 別。 閱讀一次。 :)它也可能是Zend框架中的編碼事物。

  • 在循環之前調用file_get_contents() 一次
  • 只要您的服務器可以處理它就設置內存限制更高(我說的是32-128 MB)
  • unset()你的變量 - 應該強制php到GC它(理論上)
  • 您可以重用$ message對象(丑陋的黑客,但如果Zend執行某種文件編碼並且它使用大量內存,則可以節省字節)

我還會發送電子郵件,並確保每封電子郵件(或對其的引用)與狀態一起存儲在數據庫中。 這樣,如果您遇到另一個內存限制或錯誤,您將不會發送重復的郵件。

無需為每條消息創建新附件。 只需創建一次,然后在每次發送時附加它。

$config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login', 'username' => 'username', 'password' => 'password');
$smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);

$attachment = new Zend_Mime_Part(file_get_contents($filepath));
$attachment->type = 'application/pdf';
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->filename = $filename;

foreach ($subscribers as $subscriber) {
    $message = new Zend_Mail('utf-8');
    $message->setFrom('my@mailinglist.com', 'Mailing List')
            ->addTo($subscriber->email)
            ->setSubject($subject)
            ->setBodyText($body);
    $message->addAttachment($attachment);
    $message->send($smtpConnection);
}

我有內存限制的類似問題,並通過一個SMTP連接發送大量的消息。 Zend_Mail_Protocol_Abstract將其內部日志保存在內存中。 日志中記錄了所有郵件請求。 日志隨着每條消息的發送而成長。 你有時需要調用$ protocol-> resetLog()。 (這取決於每條消息的數據量。您可以通過memory_get_usage()PHP函數檢查內存使用情況。)嘗試這樣的事情:

  $transport = new Zend_Mail_Transport_Smtp();
  $protocol = new Zend_Mail_Protocol_Smtp('localhost');
  $protocol->connect();
  $protocol->helo('localhost');
  $transport->setConnection($protocol);
  foreach(){
    $mail = new Zend_Mail('utf-8');
    ...
    $protocol->rset();
    $mail->send($transport);
    $protocol->resetLog();  // you don't need to resetLog for each message
  }

這也可能有用: http//framework.zend.com/manual/en/zend.mail.multiple-emails.html

暫無
暫無

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

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