PHPmailer - 添加 pdf 文件作为附件不起作用
PHPmailer - Add pdf file as attachment doesn't work
我的目标:
使用 AddStringAttachment()
将自动生成的 base64 字符串作为 .pdf
文件发送到另一个电子邮件地址。
编码环境:
我正在使用 ajax 调用将 base64 字符串传递给服务器来处理 WordPress。字符串的大小一般在30kbs左右,可以保证不超过50kbs。我有 MAX_EXECUTION_TIME
120 秒。
我的工作经历:
我成功了:
- 发送纯文本正文
- 正在发送一个小
.txt
文件
我失败了:
- 正在使用
AddStringAttachment()
发送 base64 字符串。服务器 returns 我大部分时间都出现 504 Gateway Time-out 错误,即使 $mail->send()
函数通过,我也只能收到一个比原始大小大 10kbs 的损坏 .pdf
文件。
- 用
AddAttachment()
发送一个已经存在的 .pdf
文件,服务器也 returns 给我一个 504 Gateway Time-out 错误,我也收到类似 [=48= 的警告]资源解释为文档但以 MIME 类型传输 application/pdf
我的代码:
function sendPdf() {
$mail = new PHPMailer(true);
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.hostinger.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'janice@popper.ga'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipient
$mail->SetFrom('janice@popper.ga');
$mail->AddAddress( 'xxxxxxxx@gmail.com' );
$pdf_base64 = $_POST[pdfString];
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject= ' New Application Form ';
$mail->Body= ' New Application Form From WordPress site ';
//Attachment
//$mail->AddStringAttachment($pdf_base64, $_POST[clientName].'_Application.pdf', 'base64', 'application/pdf');
//$mail->AddAttachment(dirname(__FILE__)."/Qian_Zhong_Application.pdf", 'Qian_Zhong_Application.pdf');
$error = '';
if(!$mail->send()){
$error = 'Mail error: '.$mail->ErrorInfo;
echo $error;
}else{
echo 'Message has been sent.';
}
exit; // This is required to end AJAX requests properly.
}
您传递给 addStringAttachment
的数据应该是原始二进制数据,没有以任何方式编码,因为 PHPMailer 会为您处理。它还会根据您提供的文件名设置编码和 MIME 类型,因此您无需手动设置它们。
使用调试器可以让您在脚本运行时观察它,这样您就可以准确地看到它遇到了什么问题。任何错误 500 都会导致错误记录在您的网络服务器日志中,并且通常会提供更多信息。
我还建议不要在没有任何过滤或验证的情况下使用 $_POST[clientName]
- 你永远不应该相信那样的用户输入。
我的目标:
使用 AddStringAttachment()
将自动生成的 base64 字符串作为 .pdf
文件发送到另一个电子邮件地址。
编码环境:
我正在使用 ajax 调用将 base64 字符串传递给服务器来处理 WordPress。字符串的大小一般在30kbs左右,可以保证不超过50kbs。我有 MAX_EXECUTION_TIME
120 秒。
我的工作经历:
我成功了:
- 发送纯文本正文
- 正在发送一个小
.txt
文件
我失败了:
- 正在使用
AddStringAttachment()
发送 base64 字符串。服务器 returns 我大部分时间都出现 504 Gateway Time-out 错误,即使$mail->send()
函数通过,我也只能收到一个比原始大小大 10kbs 的损坏.pdf
文件。 - 用
AddAttachment()
发送一个已经存在的.pdf
文件,服务器也 returns 给我一个 504 Gateway Time-out 错误,我也收到类似 [=48= 的警告]资源解释为文档但以 MIME 类型传输 application/pdf
我的代码:
function sendPdf() {
$mail = new PHPMailer(true);
//Server settings
$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.hostinger.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'janice@popper.ga'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
//Recipient
$mail->SetFrom('janice@popper.ga');
$mail->AddAddress( 'xxxxxxxx@gmail.com' );
$pdf_base64 = $_POST[pdfString];
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject= ' New Application Form ';
$mail->Body= ' New Application Form From WordPress site ';
//Attachment
//$mail->AddStringAttachment($pdf_base64, $_POST[clientName].'_Application.pdf', 'base64', 'application/pdf');
//$mail->AddAttachment(dirname(__FILE__)."/Qian_Zhong_Application.pdf", 'Qian_Zhong_Application.pdf');
$error = '';
if(!$mail->send()){
$error = 'Mail error: '.$mail->ErrorInfo;
echo $error;
}else{
echo 'Message has been sent.';
}
exit; // This is required to end AJAX requests properly.
}
您传递给 addStringAttachment
的数据应该是原始二进制数据,没有以任何方式编码,因为 PHPMailer 会为您处理。它还会根据您提供的文件名设置编码和 MIME 类型,因此您无需手动设置它们。
使用调试器可以让您在脚本运行时观察它,这样您就可以准确地看到它遇到了什么问题。任何错误 500 都会导致错误记录在您的网络服务器日志中,并且通常会提供更多信息。
我还建议不要在没有任何过滤或验证的情况下使用 $_POST[clientName]
- 你永远不应该相信那样的用户输入。