PHPMailer 不发送带有附加 zip 文件的邮件

Posted

技术标签:

【中文标题】PHPMailer 不发送带有附加 zip 文件的邮件【英文标题】:PHPMailer don't send mail with attached zip file 【发布时间】:2019-04-03 21:42:51 【问题描述】:

我正在尝试将我的备份 zip 文件附加到我的 gmail。 大约 300kb 的压缩文件 我正在尝试使用此代码

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';

$mail = new PHPMailer(true);

try 
    $mail->Ishtml(true);
    $mail->SetFrom('info@myDomain.net', 'ADMIN');
    $mail->Subject   = 'mysite - Backup Files - ' . date('d-M-Y');
    $mail->Body      = 'This is your backup files date: ' . date('d-M-Y');
    $mail->AddAddress( 'myMail@gmail.com' );
    $mail->addAttachment('secret-backup-03-Apr-2019-2105361.zip');

    $mail->send();
    echo 'Message has been sent';
 catch (Exception $e) 
    echo "Message could not be sent. Mailer Error: $mail->ErrorInfo";

?>

我的 zip 存档是用这个 php 代码创建的:

<?php
function backup()
 
  $name = "";
  $name = "./backup/backup-".date('d-M-Y').'-'.date('His').".zip";
  shell_exec("zip -q -e -9 -P 12345678 -r " . $name . " /home/user/public_html/* -x /home/user/public_html/CMD/backup/**\*");
  $secretname = "";
  $secretname = "./backup/secret-backup-".date('d-M-Y').'-'.date('His').".zip";
  shell_exec("zip -q -e -9 -P 12345678 -r " . $secretname . " " . $name);
  if (file_exists($secretname)) 
        unlink($name);
    
 

backup();
?>

但是邮件没有到达我的 gmail 我将文件从secret-backup-03-Apr-2019-2105361.zip 更改为testfile.rtf,使用与附件到达的邮件完全相同的代码!! 有什么帮助吗??!

编辑: 根据 A4L answer 我尝试使用相同的代码发送到 mymail@outlook.com 并且邮件成功到达。

现在是 Gmail 问题。 有什么帮助吗??

【问题讨论】:

1.检查文件的路径是否正确。 2. 检查您的邮件是否在垃圾邮件文件夹中。 路径是正确的-我仔细检查了它-。垃圾邮件文件夹内没有任何内容。 必读(在不使用自定义传输/邮件网关时适用于 PHPMailer):***.com/questions/24644436/… 感谢@mario .. 非常有用且内容丰富。 【参考方案1】:

确保使用 SSL 发送您的电子邮件并为您的域签署证书。发件人:应该有您的域,该域解析为您发送的 IP,并且还具有有效的 SPF 记录。 Google 发现您的电子邮件是垃圾邮件。如果它不在您的垃圾邮件文件夹中,谷歌只是阻止了它。检查您的邮件日志(在 /var/log*mail 中的某个位置),它应该有一个指向 google 支持页面的链接,其中包含有关如何使您的邮件被投递的说明。

【讨论】:

您的回答似乎不错。现在我尝试使用相同的代码发送到 mymail@outlook.com 并且邮件成功到达。我检查了日志文件夹,但没有关于 gmail 的内容? 我试过mail-tester.com,结果是Wow! Perfect, you can send, score 9.9/10有效的SPF记录。但是You're listed in 1 blacklist from 25 of the most common IPv4 blacklists.【参考方案2】:

一次调试一件事。鉴于您的消息实际上已经到达,因此您无需担心发送过程。 如果您生成附件并发送它但它失败了,您不知道是生成还是发送不满意,所以仔细检查您的生成首先工作,它自己。

如果您完全确定您的备份生成正确(我注意到您的备份函数没有返回值,因此无法检查它是否失败),请检查附件操作是否有效。 addAttachment() 如果附件失败,则返回布尔值 false,因此请检查:

if (!$mail->addAttachment('secret-backup-03-Apr-2019-2105361.zip')) 
    throw new Exception('Attachment failed');

我还建议通过 SMTP 而不是 mail()(您当前正在使用)发送,因为 SMTP 更快、更安全且更易于调试:

$mail->isSMTP();
$mail->Host = 'localhost';
$mail->SMTPDebug = 2;

您的备份函数看起来可能不安全:确保将 escapeshellarg() 应用于传递给 shell 的所有生成的参数。

【讨论】:

我添加了throw new Exception('Attachment failed');,但仍然没有错误。感谢您对我的备份功能的建议。 Debug one thing at a time. 好的,首先我生成我的备份文件并将其移动到与mail.php 相同的文件夹并使用绝对路径,没有任何反应。然后我尝试将文件的类型从 ZIP 更改为 RTF 以检查问题是否出在文件类型中,然后消息以相同的代码到达。所以它似乎在ZIP 文件中。所以我尝试删除加密和密码保护并使用相同的代码重试,但消息也没有到达。所以我尝试发送到mymail@outlook.com而不是mymail@gmail.com,消息成功到达。 所以现在我认为问题出在 GMail 上。当我的邮件包含 ZIP 文件时,GMail 会阻止我的邮件,但 Outlook 不会。 shell_exec("zip -q -e -9 -P 12345678 -r " . escapeshellarg($secretname) . " " . escapeshellarg($name)); 完美运行。谢谢。 如果 gmail 阻止了 zip 附件,我不会感到惊讶。那个 shell_exec 调用看起来更好。

以上是关于PHPMailer 不发送带有附加 zip 文件的邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHPMailer 附加 .eml 文件?

使用phpmailer通过带有图像的html文件发送电子邮件

jsPDF, html2canvas, PHPMailer, 再次......!将 PDF 附加到邮件

如何使用PHPMailer将多个文件附加到两个不同的电子邮件中?

PHPMailer拒绝发送没有附件的电子邮件

PHPMailer 发送电子邮件并返回带有回显的空白页面