我使用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将无法打开并显示一些错误,如未正确解码。
我从数据库中获取名称变量。
任何人都可以告诉我可能出现的问题。
答案 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
。