PHP SMTP Office 365 - 发送附件

问题描述 投票:1回答:1

我正在使用Office 365身份验证发送PHPMailer电子邮件。

这工作正常。但是我很难让脚本发送附件。

这是我的代码

require_once('phpMailer/PHPMailerAutoload.php');
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.office365.com';
$mail->Port       = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth   = true;
$mail->Username = '[email protected]';
$mail->Password = 'XXXXX';
$mail->SetFrom('[email protected]', 'FromEmail');
$mail->addAddress('[email protected]', 'ToEmail');
$mail->addAttachment("GeneratedPDFFiles/Invoices/Invoice $last_id.pdf");     
$mail->SMTPDebug  = 3;
$mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; $mail->Debugoutput = 'echo';
$mail->IsHTML(true);

当我删除附件行时,电子邮件发送正常,但是在那里有线路,没有发送电子邮件?

该文件存在于目录中,因此不是问题所在。

php smtp office365 phpmailer
1个回答
0
投票

这里有几件事不对。

首先,我可以看到你正在使用旧版本的PHPMailer,所以升级,最好使用composer。

你正在创建一个这样的实例:

$mail = new PHPMailer(true);

true意味着PHPMailer会抛出异常,但是你的PHPMailer方法调用没有try / catch块,所以当异常发生时,你的代码就会死掉。在适当的地方添加try / catch块,或者删除true param以通过返回值来处理错误。

我希望它在这里消亡:

$mail->addAttachment("GeneratedPDFFiles/Invoices/Invoice $last_id.pdf");     

当你说“文件存在于目录中,这不是问题”时,你假设这是真的 - 不要;校验。如果文件不存在,或者脚本没有读取权限,则此方法将抛出异常(除非您在构造函数中删除了true参数)。

您使用了相对路径,但您的工作目录可能不在您想象的位置。使用绝对路径更安全,例如通过预先设置当前脚本的位置(可能与.不同)。无论原因是什么,检查返回值也是个好主意:

$file = __DIR__ . "/GeneratedPDFFiles/Invoices/Invoice $last_id.pdf";
if (!$mail->addAttachment($file)) {
    die('Could not open file ' . $file);
}
© www.soinside.com 2019 - 2024. All rights reserved.