Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Framework:尝试使用Zend Mail Transport发送多封带有附件的电子邮件时发生致命错误_Php_Email_Zend Framework_Smtp_Attachment - Fatal编程技术网

Php Zend Framework:尝试使用Zend Mail Transport发送多封带有附件的电子邮件时发生致命错误

Php Zend Framework:尝试使用Zend Mail Transport发送多封带有附件的电子邮件时发生致命错误,php,email,zend-framework,smtp,attachment,Php,Email,Zend Framework,Smtp,Attachment,我不完全理解这一切是如何运作的,但我得到了一个错误: 致命错误:第213行的/Users/andrew/Sites/myApp/library/Zend/Mail/Transport/Smtp.php中允许的内存大小为8388608字节(尝试分配261858字节) 我正在运行MAMP的Mac上本地运行此代码。不确定这是否与此有关。这是我的代码,基本上: $config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login

我不完全理解这一切是如何运作的,但我得到了一个错误:

致命错误:第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);

然而,即使这样做,我也需要指定“内存限制”。你能用这个给我指一下正确的方向吗?有什么我没做的吗?

我猜你的pdf大约是250KB?每发送一封电子邮件,您都会将其读入内存一次。不要。读一次。:)它也可能是Zend框架中的一种编码方式

  • 在循环之前调用file_get_contents()一次
  • 只要您的服务器能够处理,就可以将内存限制设置得更高(我可以说是32-128 MB)
  • unset()您的变量-应该强制php对其进行GC(理论上)
  • 您可以重用$message对象(丑陋的hack,但如果Zend进行某种文件编码并且使用大量内存,则可以节省字节)

我还将创建一个cron任务来发送电子邮件,并确保每个电子邮件(或对它的引用)都与状态一起存储在数据库中。这样,如果遇到另一个内存限制或bug,您就不会发送重复的邮件。

我猜您的pdf大约是250KB?每发送一封电子邮件,您都会将其读入内存一次。不要。读一次。:)它也可能是Zend框架中的一种编码方式

  • 在循环之前调用file_get_contents()一次
  • 只要您的服务器能够处理,就可以将内存限制设置得更高(我可以说是32-128 MB)
  • unset()您的变量-应该强制php对其进行GC(理论上)
  • 您可以重用$message对象(丑陋的hack,但如果Zend进行某种文件编码并且使用大量内存,则可以节省字节)

我还将创建一个cron任务来发送电子邮件,并确保每个电子邮件(或对它的引用)都与状态一起存储在数据库中。这样,如果遇到另一个内存限制或bug,您就不会发送重复的邮件。

无需为每条邮件创建新的附件。只需创建一次,然后在每次发送时附加它

$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);
}

没有必要为每条邮件创建新的附件。只需创建一次,然后在每次发送时附加它

$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
  }

这也可能有帮助:

我在内存限制和通过一个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
  }

这也可能有帮助:

这里有很多很棒的建议!但是,(没有设置内存限制),并且只发送一封电子邮件,我仍然会收到错误。这个错误是否意味着内存限制当前设置为8Mb,并且超过了250K?我在本地运行这个(使用MAMP),所以我想知道…如果我在代码中将它设置为32Mb,这会比我的服务器的容量小吗?设置这个值,而不是找到更好的解决方案,这会对我造成伤害吗?8M太少了。实际上,从PHP5.2.0开始,默认的PHP内存限制是16M。除非你有一台非常低端的服务器/计算机,否则将其设置为32M应该根本不是问题。就我个人而言,我的工作站和服务器(分别为4G/2G内存)都运行128M。至于您当前的内存限制是什么,ini\U get(‘内存限制’)。至于您当前的使用情况,请选择memory\u get\u peak\u usage()和memory\u get\u usage()。至于做了什么伤害?不。使用量仍然在可接受的范围内。这里有很多很棒的建议!但是,(没有设置内存限制),并且只发送一封电子邮件,我仍然会收到错误。这个错误是否意味着内存限制当前设置为8Mb,并且超过了250K?我在本地运行这个(使用MAMP),所以我想知道…如果我在代码中将它设置为32Mb,这会比我的服务器的容量小吗?设置这个值,而不是找到更好的解决方案,这会对我造成伤害吗?8M太少了。实际上,从PHP5.2.0开始,默认的PHP内存限制是16M。除非你有一台非常低端的服务器/计算机,否则将其设置为32M应该根本不是问题。就我个人而言,我的工作站和服务器(分别为4G/2G内存)都运行128M。至于您当前的内存限制是什么,ini\U get(‘内存限制’)。至于您当前的使用情况,请选择memory\u get\u peak\u usage()和memory\u get\u usage()。至于做了什么伤害?Imho,没有。使用量仍然在可接受的参数范围内。