1
votes

i just ran into a problem, when sending mails with attachments larger than about 2.5Mb from a server. Sending emails with smaller attachments work, but as soon the critical size of about 2 or 2.5Mb is reached, the mail is not send anymore.

The PDF files and merged target PDF are created without problem, no matter of the size. But only smaller PDF files are send by mail. Not even an empty mail is send, when the attachments are too large.

The process is a follows:

1) The php script creates several PDF files.

2) Those files are merged through gs

    $finCmd = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='.$pathDest.$pdfFilename.' input1.pdf input2.pdf input3.pdf';

    // Create PDF
    $execResult = exec($finCmd);

3) The email body is created

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) The email is send with:

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

Any hints are welcome, as i am totaly lost.

I thought there could be race problem: exec is not finished, but script already tries to send the mail and cancels. But i than would at least receive an empty email.

Edit: Changing then Mime\Mime::ENCODING_BASE64 delivers the mails, but PDF files are corrupted.

2
Are you sure the generated PDFs are actually fine too? Have you generated and opened one?Andrew
Yes. I habe opened the generated files and they were correct. Instead of those with the incorrect decoding, see my answer.David P. P.

2 Answers

0
votes

It seems like, that the issue is the mime encoding.

All options:

  • Zend_Mime::ENCODING_7BIT: '7bit' --> corrupted file
  • Zend_Mime::ENCODING_8BIT: '8bit'; --> corrupted file
  • Zend_Mime::ENCODING_QUOTEDPRINTABLE: 'quoted-printable' --> corrupted file
  • Zend_Mime::ENCODING_BASE64: 'base64' --> file not send

did not work. Developed a solution with PHPMailer. Worked out.

0
votes

Have you tried using type Octetstream

$pdfAttach->type      = Mime::TYPE_OCTETSTREAM;
$pdfAttach->encoding   = Mime::ENCODING_BASE64;