如何使用 PHP Mailer 通过电子邮件发送文件?[复制]

How can I send a file by email with PHP Mailer? [duplicate]

提问人:Ovidiu-Alexandru Iftemie 提问时间:9/29/2023 最后编辑:OlivierOvidiu-Alexandru Iftemie 更新时间:9/29/2023 访问量:64

问:

一段时间以来,我一直在尝试在 php 中制作代码以从表单发送文件。

该表单有效,它将信息和文件上传到服务器。

我用 AJAX 提交表单。

问题:

当我进行电子邮件测试时,我只收到消息...没有附件,或者它甚至没有到达 Google 电子邮件。当我删除附件的代码行时,我也会在谷歌邮件中收到消息。
简而言之,如果我删除用于添加附件的代码行,代码可以完美运行。

有人可以帮我吗?

我是PHP的初学者。

    require __DIR__ . '/../../vendor/autoload.php';


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


    $mail = new PHPMailer(true);


    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';


    $mail->isSMTP();
    $mail->SMTPAuth = true;


    $mail->Host = Config::SMTP_HOST;
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = Config::SMTP_PORT;


    $mail->Username = Config::SMTP_USERNAME;
    $mail->Password = Config::SMTP_PASSWORD;


    $mail->addCustomHeader('MIME-Version', '1.0');
    $mail->addCustomHeader('Content-type', 'text/html; charset=UTF-8');
    $mail->addCustomHeader('Viewport', 'width=device-width, initial-scale=1.0');
    $mail->ContentType = 'text/html; charset=UTF-8';
    

    $mail->setFrom($customerEmail, $customerName);
    $mail->addAddress($sellerEmail, $sellerName);
    $mail->addAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
   
    $mail->IsHTML(true);
    $mail->Subject = $subjectForSeller;
    $mail->Body = $messageForSeller;

    $mail->send();
PHP 电子邮件 phpmailer

评论

0赞 Olivier 9/29/2023
为什么要使用所有这些自定义标头?
0赞 Ovidiu-Alexandru Iftemie 9/29/2023
我是初学者...这就是我通过不同的教程看到能够发送 html 消息并从表格中创建视觉上漂亮的消息的方式。
0赞 Olivier 9/29/2023
查看官方示例
0赞 Synchro 9/29/2023
更好的是,请查看发送文件上传示例。正如@Olivier所说,您不需要设置这些标头;PHPMailer 会为您处理这些问题。我建议你从这个例子重新开始,让它按原样工作,然后才开始对它进行更改。这样你就可以确定你做了什么破坏了它:)。如果您是初学者,那么现在可能也是学习版本控制的好时机......
0赞 Ovidiu-Alexandru Iftemie 9/29/2023
谢谢。我会尝试你指示的一切。

答:

0赞 hanif zekri 9/29/2023 #1

删除以下行:

$mail->addCustomHeader('MIME-Version', '1.0');
$mail->addCustomHeader('Content-type', 'text/html; charset=UTF-8');
$mail->addCustomHeader('Viewport', 'width=device-width, initial-scale=1.0');
$mail->ContentType = 'text/html; charset=UTF-8';

并检查文件大小(小于 25 meg)和 MIME 文件类型(不是 EXE、APK 等)并将其上传到您的主机上。然后在 $mail->addAttachment 中使用主机上的文件路径和干净的名称(只是带有扩展名的数字/字母)。

评论

0赞 Olivier 9/29/2023
“代码很好,很干净。”不,不是。如果将 content-type 设置为 ,则无法附加文件。text/html
0赞 hanif zekri 9/29/2023
你是对的,我编辑我的答案:)
0赞 hanif zekri 9/29/2023
@esqew为什么要删除最后一行!?我只是尽量保持礼貌......
0赞 esqew 9/29/2023
@hanifzekri我删除了它,因为它与问题的核心或你的答案无关,并且不符合 Stack Overflow 的整体问答结构。关于 Meta Stack Overflow 的进一步阅读和相关讨论
0赞 Ovidiu-Alexandru Iftemie 9/29/2023
谢谢。我会尝试你指示的一切。
0赞 volkerschulz 9/29/2023 #2

尝试以下代码,我验证了该代码是否有效(向我的 GMail 发送带有附件的电子邮件):

$subjectForSeller = 'This is the subject';
$messageForSeller = 'Hello <strong>World</strong>';

$mail = new PHPMailer(true);

$mail->CharSet = 'UTF-8';
    
$mail->isSMTP();
$mail->SMTPAuth   = true;
$mail->Host       = Config::SMTP_HOST;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port       = Config::SMTP_PORT;

$mail->Username   = Config::SMTP_USERNAME;
$mail->Password   = Config::SMTP_PASSWORD;

$mail->setFrom($customerEmail, $customerName);

$mail->addAddress($sellerEmail, $sellerName);
if(is_uploaded_file($_FILES['file']['tmp_name'])) {
    $mail->addAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
} else {
    $messageForSeller .= ' FILE NOT FOUND!';
}

$mail->isHTML(true);

虽然线

$messageForSeller .= ' FILE NOT FOUND!';

仅用于调试目的,应始终使用 is_uploaded_file 进行验证。

这是我用于测试的 HTML 表单:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>

编辑:我也尝试过您的代码片段,它工作正常,因此您的文件或文件上传可能有问题。您可能希望将表单、AJAX 调用和测试文件的链接添加到您的问题中。

评论

0赞 Ovidiu-Alexandru Iftemie 9/29/2023
谢谢。我会尝试你指示的一切。