发送邮件大附件-ZF2
Sending mail large attachment - ZF2
我刚刚 运行 遇到了一个问题,当从服务器发送附件大于 2.5Mb 的邮件时。发送带有较小附件的电子邮件是可行的,但是一旦达到大约 2 或 2.5Mb 的临界大小,邮件就不再发送了。
无论大小,PDF 文件和合并的目标 PDF 都可以毫无问题地创建。但只有较小的 PDF 文件通过邮件发送。附件太大,连空邮件都不发。
过程如下:
1) php 脚本创建多个 PDF 文件。
2) 这些文件通过gs合并
$finCmd = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='.$pathDest.$pdfFilename.' input1.pdf input2.pdf input3.pdf';
// Create PDF
$execResult = exec($finCmd);
3) 电子邮件正文已创建
protected function setBodyHtmlpart($content, $pdfFilepath = null, $pdfFilename = null) {
$content="<p><span style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\";color:black;'>".$content.'</span></p>';
$html = new MimePart($content.$this->getSignature());
$html->type = "text/html";
$body = new MimeMessage();
if ($pdfFilename != '') {
$pdfAttach = new MimePart(file_get_contents($pdfFilepath.$pdfFilename));
$pdfAttach->type = 'application/pdf';
$pdfAttach->filename = $pdfFilename;
$pdfAttach->encoding = \Zend\Mime\Mime::ENCODING_BASE64;
$pdfAttach->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT;
$body->setParts(array($html, $pdfAttach));
} else {
$body->setParts(array($html));
}
return $body;
}
4) 电子邮件发送:
protected function send($fromAddress, $fromName, $toAddress, $toName, $subject, $bodyParts)
{
// setup SMTP options
$options = new SmtpOptions(array(
'name' => 'XServer',
'host' => 'xServer',
'port' => 25,
'connection_class' => 'plain',
'connection_config' => array(
'username' => 'Xusername',
'password' => 'Xpassword',
),
));
$mail = new Message();
$mail->setBody($bodyParts);
$mail->setFrom($fromAddress, $fromName);
$mail->setTo($toAddress, $toName);
$mail->setSubject($subject);
$transport = new SmtpTransport($options);
$transport->send($mail);
}
欢迎任何提示,因为我完全迷路了。
我认为可能存在竞争问题:exec 未完成,但脚本已尝试发送邮件并取消。但我至少会收到一封空邮件。
编辑:
然后更改 Mime\Mime::ENCODING_BASE64 发送邮件,但 PDF 文件已损坏。
看来问题出在 mime 编码上。
所有选项:
- Zend_Mime::ENCODING_7BIT: '7bit' --> 损坏的文件
- Zend_Mime::ENCODING_8BIT: '8bit'; --> 损坏的文件
- Zend_Mime::ENCODING_QUOTEDPRINTABLE: 'quoted-printable' --> 已损坏
文件
- Zend_Mime::ENCODING_BASE64: 'base64' --> 文件未发送
没用。
使用 PHPMailer 开发了一个解决方案。
锻炼了。
您是否尝试过使用 Octetstream 类型
$pdfAttach->type = Mime::TYPE_OCTETSTREAM;
$pdfAttach->encoding = Mime::ENCODING_BASE64;
我刚刚 运行 遇到了一个问题,当从服务器发送附件大于 2.5Mb 的邮件时。发送带有较小附件的电子邮件是可行的,但是一旦达到大约 2 或 2.5Mb 的临界大小,邮件就不再发送了。
无论大小,PDF 文件和合并的目标 PDF 都可以毫无问题地创建。但只有较小的 PDF 文件通过邮件发送。附件太大,连空邮件都不发。
过程如下:
1) php 脚本创建多个 PDF 文件。
2) 这些文件通过gs合并
$finCmd = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='.$pathDest.$pdfFilename.' input1.pdf input2.pdf input3.pdf';
// Create PDF
$execResult = exec($finCmd);
3) 电子邮件正文已创建
protected function setBodyHtmlpart($content, $pdfFilepath = null, $pdfFilename = null) {
$content="<p><span style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\";color:black;'>".$content.'</span></p>';
$html = new MimePart($content.$this->getSignature());
$html->type = "text/html";
$body = new MimeMessage();
if ($pdfFilename != '') {
$pdfAttach = new MimePart(file_get_contents($pdfFilepath.$pdfFilename));
$pdfAttach->type = 'application/pdf';
$pdfAttach->filename = $pdfFilename;
$pdfAttach->encoding = \Zend\Mime\Mime::ENCODING_BASE64;
$pdfAttach->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT;
$body->setParts(array($html, $pdfAttach));
} else {
$body->setParts(array($html));
}
return $body;
}
4) 电子邮件发送:
protected function send($fromAddress, $fromName, $toAddress, $toName, $subject, $bodyParts)
{
// setup SMTP options
$options = new SmtpOptions(array(
'name' => 'XServer',
'host' => 'xServer',
'port' => 25,
'connection_class' => 'plain',
'connection_config' => array(
'username' => 'Xusername',
'password' => 'Xpassword',
),
));
$mail = new Message();
$mail->setBody($bodyParts);
$mail->setFrom($fromAddress, $fromName);
$mail->setTo($toAddress, $toName);
$mail->setSubject($subject);
$transport = new SmtpTransport($options);
$transport->send($mail);
}
欢迎任何提示,因为我完全迷路了。
我认为可能存在竞争问题:exec 未完成,但脚本已尝试发送邮件并取消。但我至少会收到一封空邮件。
编辑: 然后更改 Mime\Mime::ENCODING_BASE64 发送邮件,但 PDF 文件已损坏。
看来问题出在 mime 编码上。
所有选项:
- Zend_Mime::ENCODING_7BIT: '7bit' --> 损坏的文件
- Zend_Mime::ENCODING_8BIT: '8bit'; --> 损坏的文件
- Zend_Mime::ENCODING_QUOTEDPRINTABLE: 'quoted-printable' --> 已损坏 文件
- Zend_Mime::ENCODING_BASE64: 'base64' --> 文件未发送
没用。 使用 PHPMailer 开发了一个解决方案。 锻炼了。
您是否尝试过使用 Octetstream 类型
$pdfAttach->type = Mime::TYPE_OCTETSTREAM;
$pdfAttach->encoding = Mime::ENCODING_BASE64;