使用phpmailer发送带有动态附件(pdf)的邮件会在pdf中返回错误

时间:2014-11-03 15:02:09

标签: php mysqli phpmailer

我使用php邮件程序附上并发送发票pdf。

这是我用来发送邮件的内容

$string = file_get_contents("http://website.com/page/pdf_vouch.php&pvno=$pv&mnth=$mnth&yr=$yr&email=$email&final=$final&name=$ms_n"); 

$mail->AddStringAttachment($string, "sales_invoice.pdf", $encoding = 'base64', $type = 'application/pdf');

通过这个我发送一些特定页面的值,这将生成pdf,并将通过电子邮件发送生成的pdf作为附件。

问题在于name参数。当我仅将名称作为字符串给出时,将发送带附件的邮件并且可以打开pdf。但如果它是一个变量,那么邮件将被发送,但pdf将无法打开并显示一些错误,如未正确解码。

我从数据库中获取名称变量。

任何人都可以告诉我可能出现的问题。

3 个答案:

答案 0 :(得分:1)

您需要对网址中嵌入的所有参数进行网址编码:

$string = file_get_contents(
    "http://website.com/page/pdf_vouch.php&pvno=".rawurlencode($pv).
    "&mnth=".rawurlencode($mnth).
    "&yr‌​=‌".rawurlencode(​$yr).
    "&email=".rawurlencode($email).
    "&final=".rawurlencode($final).
    "&name=".rawurlencode($ms_n)
);

urlencode()生成Javascript样式的编码,使用+对空格进行编码,在向用户显示网址时稍微更具可读性,但在“#”时,这不是一个问题。所有这些都发生在后端,就像在这种情况下一样。要获得更强大的编码,请使用rawurlencode(),将空格编码为%20

当您的变量可能包含在URL中有意义的字符时,正确的编码尤其重要,这是我怀疑您遇到的问题 - 例如,如果$final包含&name=foo,则会导致混淆如果未编码,则使用真实的name参数。

如果您已经对其进行了验证,则可以跳过其中一些(例如,如果您已经知道$yr仅包含数字)。

如果您提供了嵌入URL中的变量的示例值,那么这个问题会更快回答。

答案 1 :(得分:-1)

由于PHPMailer不会自动获取远程内容,因此您需要自己完成。

所以你去:

// we can use file_get_contents to fetch binary data from a remote location
$url = 'http://website.com/page/pdf_vouch.php&pvno=$pv&mnth=$mnth&yr=$yr&email=$email&final=$final&name=$ms_n';
$binary_content = file_get_contents($url);

// You should perform a check to see if the content
// was actually fetched. Use the === (strict) operator to
// check $binary_content for false.
if ($binary_content) {
   throw new Exception("Could not fetch remote content from: '$url'");
}

// $mail must have been created
$mail->AddStringAttachment($binary_content, "sales_invoice.pdf", $encoding = 'base64', $type = 'application/pdf');

// continue building your mail object...

答案 2 :(得分:-1)

使用$mail->addAttachment代替$mail->addStringAttachment