Ошибка при отправке почты с вложением с помощью почтовой программы PHP: транзакция не выполнена: отсутствует начальная граница SMTP-код: 554 - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь отправить письмо php mailer с вложением pdf, и оно показывает эту ошибку: Электронная почта не отправлена. Ошибка: ошибка SMTP: данные не приняты. Ошибка сервера SMTP: сбой команды DATA END Подробно: сбой транзакции: отсутствует начальная граница Код SMTP: 554

Я пытался добавить границы пантомимы повсюду, но у меня был тот же результат.

<?php
include dirname(__FILE__) . '/../views/pdf-receipt.php';

function sendMailTest(
    $recipient_mail, $recipient_name, $from_mail, $from_name, $subject, $body, $body_without_html, $attachments=NULL
) {
    require 'folder/PHPMailer-5.2.26/PHPMailerAutoload.php';
    $mail = new PHPMailer;

    try {
        $mail->isSMTP();
        $mail->setFrom($from_mail, $from_name);
        $mail->addAddress($recipient_mail, $recipient_name);
        $mime_boundary = "Name of company".md5(time());
        $mail->SMTPDebug = true;
        $mail->Host = 'email-smtp.eu-west-1.amazonaws.com';
        $mail->Username = 'XXX';
        $mail->Password = 'XXX';

        $mail->Encoding = 'quoted-printable';
        $mail->addCustomHeader('Content-ID', '20cca', 'Content-Type', 'multipart/mixed', 'boundary='.$mime_boundary.'\n');
        $mail->Body = "--$mime_boundary\n";

        $mail->CharSet = 'UTF-8';
        $mail->Subject = utf8_encode($subject);

        $mail->Body .= "Hey\n";

        $mail->AltBody .= "--$mime_boundary\n".$body_without_html;

        $mail->SMTPAuth = true;

        $mail->SMTPSecure = 'tls';
        $mail->Port = 000;

        $mail->isHTML(true);
        $data = '%PDF-1.2 6 0 obj << /S /GoTo /D (chapter.1) >>';       
        // if i comment line below email is sent properly, 
        // if i use AddAttachment local pdf file its working also, 
        // but i use TCPD generated PDF and attaching it, if i will 
        // just write it out to the message body i will see it as a 
        // text or if i will attach 'addStringEmbeddedImage' its 
        //displayed correctly but on same line as message text

        // $attachments is pretty much this:
        // $pdf->Output("test.pdf", "S");
        // tried this $mail->Body .= "--$mime_boundary\n"; before next line
        // did not help
        $mail->AddStringAttachment($attachments, 'base64', 'application/pdf');

        if($mail->send()) {
            return;
        }
    } catch (Exception $e) {}

    echo 'E-mail not sent. Error: ', $mail->ErrorInfo, PHP_EOL;
}
?>

Я ожидаю, что электронное письмо будет отправлено с вложением, но не вижу ошибки начальной границы.

1 Ответ

0 голосов
/ 24 мая 2019

Во-первых, я очень надеюсь, что вы на самом деле не используете PHP 5.2.

Вы хорошо умеете стрелять себе в ногу здесь:

    $mail->addCustomHeader('Content-ID', '20cca', 'Content-Type', 'multipart/mixed', 'boundary='.$mime_boundary.'\n');
    $mail->Body = "--$mime_boundary\n";

Причина, по которой вы используете PHPMailer, заключается в том, что вам не нужно делать такие вещи; о тебе позаботятся. Когда вы попытаетесь подорвать это так, это приведет к беспорядку, как вы обнаружите.

Вы приложили усилия, чтобы обернуть ваш код PHPMailer в блок try / catch, но вы не сказали PHPMailer генерировать исключения (путем передачи true в конструктор), и ваш блок catch пуст, поэтому ничего не делает.

Я переписал его, чтобы исправить эти вещи, и более логично группировать настройки:

include dirname(__FILE__) . '/../views/pdf-receipt.php';

function sendMailTest(
    $recipient_mail,
    $recipient_name,
    $from_mail,
    $from_name,
    $subject,
    $body,
    $body_without_html,
    $attachments = null
) {
    require_once 'folder/PHPMailer-5.2.26/PHPMailerAutoload.php';
    $mail = new PHPMailer(true);

    try {
        $mail->isSMTP();
        $mail->SMTPDebug = 2;
        $mail->Host = 'email-smtp.eu-west-1.amazonaws.com';
        $mail->SMTPSecure = 'tls';
        $mail->Port = 587;
        $mail->SMTPAuth = true;
        $mail->Username = 'XXX';
        $mail->Password = 'XXX';

        $mail->CharSet = 'UTF-8';
        $mail->setFrom($from_mail, $from_name);
        $mail->addAddress($recipient_mail, $recipient_name);
        $mail->Subject = $subject;

        $mail->Body .= $body;
        $mail->AltBody = $body_without_html;

        $mail->isHTML(false);
        $data = '%PDF-1.2 6 0 obj << /S /GoTo /D (chapter.1) >>';

        $mail->addStringAttachment($data, 'receipt.pdf');

        $mail->send();
    } catch (Exception $e) {
        echo 'E-mail not sent. Error: ', $mail->ErrorInfo, PHP_EOL;
    }
}
...