PHP不发送带有附件的邮件

Posted

技术标签:

【中文标题】PHP不发送带有附件的邮件【英文标题】:PHP not sending mail with attachment 【发布时间】:2016-05-03 05:52:19 【问题描述】:

我有一个 html 注册/联系表单,目前通过电子邮件发送字段,没问题。 我遇到的问题是将上传的文件附加到电子邮件中。

使用我目前用于文件的 php,正在发送电子邮件,但 MIME 信息在电子邮件中,我收到错误消息,表明该消息“结构错误,无法完全检查”并且该文件未附加到电子邮件中。

<?php
if (isset($_POST['submit'])) 

    //if ($_SERVER['submit']=="POST")

    $to = "me@mymail.com";                           // Email address
    $from = $_POST['text_96'];                        // sender's Email
    $fullname = $_POST['text_95'];                    // users fullname
    $email = $_POST['text_96'];                        // users email address
    $dob = $_POST['date_12'];                            // Date of birth
    $addr = $_POST['textarea_31'];                    // Address
    $maths = $_POST['text_93'];                        // Maths 
    $english = $_POST['text_31'];                        // English 
    $holidayst = $_POST['date_74'];                    // Holiday1
    $holidayend = $_POST['date_91'];                    // Holiday2
    $distance = $_POST['number_58'];                    // Dist
    $awayhome = $_POST['selectlist_90'];                // AFW [boolean]
    $reasontext = $_POST['textarea_60'];                // 100 word answer
    $subject = "New application submission";           // subject of email

    $mssg = "New submission from " . $email . "\n\n" . "Full name: " . $fullname . "\nDOB: " . $dob . "\nAddress:\n" . $addr . "\n\nMaths: " . $maths . "\nEnglish: " . $english . "\nHoliday start: " . $holidayst . "\nHoliday end: " . $holidayend . "\nDistance to travel: " . $distance . "km" . "\nAFH?: " . $awayhome . "\nAppr choices: " . $apprent . "\n\nReason for applying: " . $reasontext . "\n";

    foreach ($_POST['checkbox'] as $key => $val)         // Gets list of appr
        $apprent .= $val . ' ';                        // 
    

    //  --  --  --  \\

    $fileatt = $_FILES['file'];
    //$fileatttype = "application/pdf";
    //$fileattname = "newname.pdf";
    $headers = "From: $from";
    $file = fopen($fileatt, 'rb');
    $data = fread($file, filesize($fileatt));
    fclose($file);
    $semi_rand = md5(time());
    $mime_boundary = "==Multipart_Boundary_x$semi_randx";

    $headers .= "\nMIME-Version: 1.0\n" .
        "Content-Type: multipart/mixed;\n" .
        " boundary=\"$mime_boundary\"";

    $message = "This is a multi-part message in MIME format.\n\n" .
        "-$mime_boundary\n" .
        "Content-Type: text/plain; charset=\"iso-8859-1\n" .
        "Content-Transfer-Encoding: 7bit\n\n" .

        $message .= "\n\n";

    $data = chunk_split(base64_encode($data));

    $message .= "–$mime_boundary\n" .
        "Content-Type: $fileatttype;\n" .
        " name=\"$fileattname\"\n" .
        "Content-Disposition: attachment;\n" .
        " filename=\"$fileattname\"\n" .
        "Content-Transfer-Encoding: base64\n\n" . $mssg .

        $data . "\n\n" .
        "-$mime_boundary-\n";

    if (mail($to, $subject, $message, $headers)) 
        $message = NULL;
        $headers = NULL;
        header('Location: application_submitted.html');
     else 
        header('Location: index.php');

        //\\    --  --  --  //

        //$headers = "From:" . $from;
        //@mail($to,$subject,$message,$headers);
        // You can also use header('Location: thank_you.php'); to redirect to another page.
        //$message = NULL;
        //$headers = NULL;
        //header('Location: application_submitted.html');

        //if (@mail($to, $subject, $message, $headers))
        //$message = NULL;
        //$headers = NULL;
        //header('Location: application_submitted.html');
        //else
        //echo "Failed to send";
    

?>

请问如何在此电子邮件中附加文件并发送而不出现上述错误?

非常感谢您提供的任何帮助和帮助!

【问题讨论】:

php.net/manual/en/function.error-reporting.php 使用phpmailer。从 PHP 7 开始,至少可以说使用多个标题(附件需要)是有问题的 @ChrisG 这从来都不是一个简单的选择 :-) 无论如何,我也喜欢 Swift Mailer。 @jeroen:确实如此。 Swift Mailer 和 PHPMailer 可能是当今最常用的。还好你加了那个,我都忘了:) @ChrisG 谢谢。我以为我必须使用 PHPmailer 之类的东西,但对自己撒谎更容易;)谢谢你们的建议,我会试一试 【参考方案1】:

您的代码太损坏,无法在此处修复,但您需要关注以下两个主要错误:

    上传文件的引用不正确 您的标头没有正确分隔。

首先,您没有使用$_FILES['file'] 引用上传的文件,它的位置存储在$_FILES['file']['tmp_name'] 中。这是一个有用的教程:PHP 5 File Upload on W3schools。

其次,标题应使用\r\n 分隔。 mail() 函数文档提供了这方面的有用信息以及安全提示。

【讨论】:

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

PHP 发送带有 PDF 附件的电子邮件

PHP - 发送带附件的电子邮件不显示邮件内容

在 PHP 中,如何发送带有附件的 HTML 电子邮件?

如何使用带有附件的 PEAR Mail 包使用 PHP 发送电子邮件

在php中发送带有多个附件的电子邮件

使用 S/MIME (PHP) 发送带有附件的电子邮件