【问题标题】:PHP SMTP Office 365 - Send attachmentPHP SMTP Office 365 - 发送附件
【发布时间】:2019-04-25 14:15:47
【问题描述】:

我正在使用 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);

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

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

【问题讨论】:

    标签: php smtp office365 phpmailer


    【解决方案1】:

    这里有几个问题。

    首先我可以看到你使用的是旧版本的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);
    }
    

    【讨论】:

    • 谢谢,但是问题一定出在$last_id 变量上。当我删除它并添加文件名时,电子邮件会带有附件
    猜你喜欢
    • 2018-01-31
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2015-04-06
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多