Как отправить PDF, сгенерированный TCPDF, как вложение Swiftmailer - PullRequest
7 голосов
/ 09 ноября 2011

Я уже пробовал несколько решений, самое близкое (для меня) должно выглядеть так:

$file = $pdf->Output('', 'E');
$message->attach(Swift_Attachment::newInstance($file, 'name.pdf', 'application/pdf'));

$pdf является экземпляром TCPDF, а $message является экземпляром Swift_Message. Используя выше, письмо отправляется нормально, файл прикреплен, но когда я пытаюсь открыть его, я получаю сообщение об ошибке, что файл поврежден или плохо закодирован.

Мой вопрос: как отправить pdf, сгенерированный TCPDF, как вложение Swiftmailer без сохранения файла на сервере и удаления его после отправки электронного письма . Здесь - это ссылка на документацию по методам вывода TCPDF, возможно, кто-то может увидеть то, что я пропустил.

Ответы [ 4 ]

8 голосов
/ 20 марта 2013

Я использую что-то вроде этого, и это работает. Для содержимого PDF я использую один из простейших примеров в библиотеке PDF.

[...]
$pdf_as_string = $pdf->Output('', 'S'); // $pdf is a TCPDF instance
[...]
$transport = Swift_MailTransport::newInstance(); // using php mail function
$message->setTo(array(
  "client@customdomain.com" => "Main Email",
  "client@publicdomain.com" => "Secondary Email"
));
$message->setSubject("This email is sent using Swift Mailer");
$message->setBody("You're our best client ever.");
$message->setFrom("developers@mydomain.com", "Developers United");
$attachment = Swift_Attachment::newInstance($pdf_as_string, 'my-file.pdf', 'application/pdf');
$message->attach($attachment);
[...]

Может быть, этот ответ приходит немного поздно, так как я использую swiftmailer v4_3_0 и TCPDF v6_0_002. Но на всякий случай стоит кому-то.

4 голосов
/ 21 ноября 2011

У меня не было проблем с подключением TCPDF на лету.

Я вызываю функцию, которая в конечном итоге возвращает PDF, используя тип вывода 'S':

return $pdf->Output('TE_Invoice.pdf', 'S');

Я прикрепляю файл, используя:

$message->attach(Swift_Attachment::newInstance()
  ->setFilename('TE_Invoice.pdf')
  ->setContentType('application/pdf')
  ->setBody($val['file']));

Где $val['file'] - возвращаемое значение сверху.

Я использую версию TCPDF: 5.9.134 и версию Swift Mailer: 4.1.3

0 голосов
/ 20 февраля 2019

Вы можете использовать выходной режим 'E', чтобы получить base64String.

$base64PdfString = $pdf->Output('', 'E');

Осторожно : Возможно, вам придется сократить первые 5-6 строк из-за

Content-Type: application / pdf; имя = ""
Content-Transfer-Encoding: base64
Content-Disposition: приложение;
filename = ""

Base64StringStartsHere ....

вырезано

$base64PdfArray = explode("\r\n", $base64PdfString);
$base64 = '';
for($i = 5; $i < count($base64PdfArray); $i++) {
    $base64 .= $base64PdfArray[$i];
}

Теперь у вас есть электронная почта как base64String.
Перед отправкой необходимо его расшифровать.

$mail->attach(new \Swift_Attachment(base64_decode($base64), 'Pdf.pdf', 'application/pdf'));
0 голосов
/ 09 ноября 2011

Вы пробовали это?

$file = $pdf->Output('', 'S');

Я делаю это с другим почтовым бэкэндом в PHP, и это работает. Я предполагаю, что почтовый сервер заботится о кодировании вложения, поэтому нет необходимости кодировать его как base64 вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...