Я только что столкнулся с проблемой при отправке писем с вложениями размером более 2,5 МБ с сервера. Отправка писем с небольшими вложениями работает, но как только достигается критический размер около 2 или 2,5 МБ, почта больше не отправляется.

Файлы 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 повреждены.

1
David P. P. 9 Ноя 2016 в 11:53

2 ответа

Лучший ответ

Вы пробовали использовать тип Octet Stream?

$pdfAttach->type      = Mime::TYPE_OCTETSTREAM;
$pdfAttach->encoding   = Mime::ENCODING_BASE64;
0
Andrew 9 Ноя 2016 в 15:16

Похоже, что проблема в кодировке mime.

Все варианты:

  • Zend_Mime :: ENCODING_7BIT: '7bit' -> поврежденный файл
  • Zend_Mime :: ENCODING_8BIT: '8 бит'; -> поврежденный файл
  • Zend_Mime :: ENCODING_QUOTEDPRINTABLE: 'quoted-printable' -> поврежденный файл
  • Zend_Mime :: ENCODING_BASE64: 'base64' -> файл не отправляется

Не работает. Разработал решение с PHPMailer. Разработаны.

0
David P. P. 9 Ноя 2016 в 13:04