php Mail_MIME - создание и подключение PDF
Я пытаюсь написать скрипт PHP, который сгенерирует PDF и отправит его по электронной почте. Мой генератор PDF отлично работает как независимый URL, но по какой-то причине, когда я пытаюсь заставить скрипт отправить электронное письмо сгенерированному PFD, полученный файл не может быть открыт. Вот код:
include_once('Mail.php');
include_once('Mail/mime.php');
$attachment = "cache/form.pdf";
// vvv This line seems to be where the breakdowns is vvv
file_put_contents( $attachment, file_get_contents( "http://www.mydomain.com/generator.php?arg1=$arg1&arg2=$arg2" ) );
$message = new Mail_mime();
$message->setTXTBody( $msg );
$message->setHTMLBody( "<html><body>$msg</body></html>" );
$message->addAttachment( $attachment );
$body = $message->get();
$extraheaders = array( "From" => $from,
"Cc" => $cc,
"Subject" => $sbj );
$mail = Mail::factory("mail");
$headers = $message->headers( $extraheaders );
$to = array( "Jon Doe <jon@mydomain.com>",
"Jane Doe <jane@mydomain.com>" );
$addresses = implode( ",", $to );
if( $mail->send($addresses, $headers, $body) )
echo "<p class=\"success\">Successfully Sent</p>";
else
echo "<p class=\"error\">Message Failed</p>";
unlink( $attachment );
Строка, которую я пометил, генерирует PDF-файл в папке кэша, но он не открывается, поэтому это кажется проблемой. Тем не менее, когда я пытаюсь прикрепить файл PDF уже существует, у меня возникает та же проблема. я пытался $message->addAttachment( $attachment, "Application/pdf" );
также, и это, кажется, не имеет значения.
2 ответа
Я почти уверен, что это проблема ini, блокирующая file_get_contents(). Однако я придумал лучшее решение. Я переработал файл generator.php и превратил его в определение функции. Итак, у меня есть:
include_once('generator.php');
$attachment = "cache/form.pdf";
file_put_contents( $attachment, my_pdf_generator( $arg1, $arg2 ) );
...
$message->addAttachment( $attachment, "application/pdf" );
Таким образом, мне не нужно сначала записывать файл. Это прекрасно работает (хотя у меня все еще есть небольшие проблемы с Outlook/Exchange Server, но я думаю, что это в значительной степени не связанная проблема).
Обычно каталоги веб-сервера должны иметь заблокированные разрешения на запись. Вероятно, поэтому у вас возникают проблемы с file_put_contents('cache/form.pdf')
,
// A working example: you should be able to cut and paste,
// assuming you are on linux.
$attachment = "/var/tmp/Magick++_tutorial.pdf";
file_put_contents($attachment, file_get_contents(
"http://www.imagemagick.org/Magick++/tutorial/Magick++_tutorial.pdf"));
Попробуйте изменить папку, в которой вы сохраняете PDF-файл, в каталог, который разрешает всем пользователям писать и читать. Также убедитесь, что этот каталог не находится на вашем веб-сервере.
Также попробуйте изменить следующие три вещи
От
$message = new Mail_mime();
к
// you probably don't need this the default is
// $params['eol'] - Type of line end. Default is ""\r\n""
$message = new Mail_mime("\r\n");
От
$extraheaders = array(
"From" => $from,
"Cc" => $cc,
"Subject" => $sbj,
);
к
$extraheaders = array(
"From" => $from,
"Cc" => $cc,
"Subject" => $sbj,
'Content-Type' => 'text/html'
);
От
$message->addAttachment($attachment);
к
// the default second argument is $c_type = 'application/octet-stream'
$isAttached = $message->addAttachment($attachment, 'aplication/pdf');
if ($isAttached !== true) {
// an error occured
echo $isAttached->getMessage();
}
И вы всегда хотите убедиться, что вы звоните
$message->get();
до
$message->headers($extraheaders);
или все это не будет работать