PHP SMTP Office 365-发送附件

时间:2019-04-25 14:15:48

标签: php smtp office365 phpmailer

我正在使用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 = 'xxx@xx.com';
$mail->Password = 'XXXXX';
$mail->SetFrom('XXX@XXX.com', 'FromEmail');
$mail->addAddress('XXX@XXX.com', '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);

当我删除附件行时,电子邮件可以正常发送,但是在附件行中没有发送电子邮件?

文件存在于目录中,所以这不是问题。

1 个答案:

答案 0 :(得分:0)

这里有些错误。

首先,我可以看到您使用的是旧版本的PHPMailer,因此请升级,最好使用composer。

您正在创建这样的实例:

$mail = new PHPMailer(true);

true意味着PHPMailer将引发异常,但是您的PHPMailer方法调用周围没有try / catch块,因此,发生异常时,代码将死亡。要么在适当的地方添加try / catch块,要么删除该true参数以通过返回值来处理错误。

我希望它在这里快要死了

$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);
}