简体   繁体   English

php邮件发送附件无法打开

[英]php mail sending attachment the can't be opened

I'm trying to write a page where users can send an email along with an attachment. 我正在尝试编写一个页面,用户可以在其中发送电子邮件以及附件。 I think I'm almost there. 我想我快到了。 Right now I get the email, but the attachment is either empty in filesize, or when I try to open it, I get a message that it cannot be opened. 现在,我收到了电子邮件,但是附件在文件大小中为空,或者当我尝试打开它时,收到一条消息,提示它无法打开。 Any help is appreciated. 任何帮助表示赞赏。

    function valid_email($Email)
{
    //new regex, didn't give me any errors...might be a bit more exact
  if (ereg('^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$', $Email) != false)
    return true;
  else 
    return false;
}

function sendEmail($email){
    return  mail ($email['to'], $email['subject'], $email['message'], $email['headers']);
}


if ( strlen($_FILES['Resume_File']['name']) > 0 )
{   // If a file was uploaded, do some processing
    $filename = preg_replace('/[^a-zA-Z0-9._-]/', '', $_FILES['Resume_File']['name']);
    $filetype = $_FILES["Resume_File"]["type"];
    $filesize = $_FILES["Resume_File"]["size"];
    $filetemp = $_FILES["Resume_File"]["tmp_name"]; 
    $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1);

    if ( !preg_match('/\.(doc|docx|odt|pdf|rtf|txt)/i', $ext) )
    {   $errors++;
        $errorLog .= "Upload filetype not supported.";
    }
    else if ( $filesize > 2000000 )
    {   $errors++;
        $errorLog .= "File size too high, up to 2MB is allowed.";
    }
    else
    {   // Looks like the file is good, send it with the email
        //$fp = fopen($filetemp, "rb");
        //$file = fread($fp, $filesize);
        //$file = chunk_split(base64_encode($file));

        //$email['headers'] .= "\n--{$num}\n";
        //$email['headers'] .= "Content-Type:{$filetype}";
        //$email['headers'] .= "name={$filename}r\n";
        //$email['headers'] .= "Content-Disposition: attachment; ";
        //$email['headers'] .= "filename={$filename}\n";
        //$email['headers'] .= "{$file}";

    }
}

// get posted data into local variables
$fname = trim(stripslashes($_POST['fname']));
$lname = trim(stripslashes($_POST['lname']));
$emailAddress = trim(stripslashes($_POST['email']));
$company = trim(stripslashes($_POST['company'])); 
$information = trim(stripslashes($_POST['information']));
$subject = trim(stripslashes($_POST['subject']));
$title = trim(stripslashes($_POST['title']));

//setup email
$to = 'me@me.com';
$subject = "Resume Submission";

$headers = "From: {$fname} {$lname} <{$emailAddress}>\r\n";

// prepare email body text
$message = "First Name: {$fname} <br>";
$message .= "Last Name: {$lname} <br>";
$message .= "Email: {$emailAddress} <br>";
$message .= "Title: {$title} <br><br>";
$message .= "Comments: {$information}";

if ( $errors == 0 ) {
    // Attachment headers

    //$to = "myemail@mydomain.com";
    //$from = "Website <website@mydomain.com>";
    //$subject = "Test Attachment Email";

    $separator = md5(time());

    // carriage return type (we use a PHP end of line constant)
    $eol = PHP_EOL;

    // attachment name
    //$filename = "document.pdf";

    //$pdfdoc is PDF generated by FPDF
    $attachment = chunk_split(base64_encode($pdfdoc));

    // main header
    $headers .= "From: ".$from.$eol;
    $headers .= "MIME-Version: 1.0".$eol; 
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"";

    // no more headers after this, we start the body! //

    $body = "--".$separator.$eol;
    $body .= "Content-Transfer-Encoding: 7bit".$eol.$eol;
    $body .= "This is a MIME encoded message.".$eol;

    // message
    $body .= "--".$separator.$eol;
    $body .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
    $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
    $body .= $message.$eol;

    // attachment
    $body .= "--".$separator.$eol;
    $body .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
    $body .= "Content-Transfer-Encoding: base64".$eol;
    $body .= "Content-Disposition: attachment".$eol.$eol;
    $body .= $attachment.$eol;
    $body .= "--".$separator."--";

}



//sendEmail($email);

// validation

if ( $errors == 0 ) {

    if (valid_email($emailAddress) && $fname != "" && $lname != "") { //if return is true...
        mail($to, $subject, $body, $headers);
        echo 0; //Success
    }else { //otherwise
        echo 1; //Error
    }

} else {
    echo 1; //Error
}

I am using portions of code which I found here 我正在使用在这里找到的部分代码

PHP mail() attachment problems PHP mail()附件问题

Thank you! 谢谢!

PHP's mail() function is really poor, particularly when trying to do advanced stuff like adding attachments. PHP的mail()函数确实很差,特别是在尝试执行高级任务(如添加附件)时。 It's really only worth using for the most basic "send a notification email to the site admin" type emails, and even then it's not always the best solution. 仅对于最基本的“向站点管理员发送通知电子邮件”类型的电子邮件,实际上才值得使用,即使如此,它也不总是最好的解决方案。

I would suggest ditching any attempt to work with the mail() function itself, and instead switch to using a decent PHP mailer class such as the appropriately named phpMailer . 我建议放弃使用mail()函数本身的任何尝试,而改用象样的phpMailer之类的体面的PHP邮件程序类。

phpMailer makes creating emails from PHP dead easy. phpMailer使从PHP创建电子邮件变得非常简单。 I has all the features you could want, including making it very easy to add attachments, write HTML emails, and plenty more. 我拥有您想要的所有功能,包括使添加附件,编写HTML电子邮件变得非常容易,以及更多其他功能。

But the best thing about phpMailer is that it removes all the need to waste dozens of lines of code formatting the email headers. 但是phpMailer的最好之处在于,它消除了浪费数十行代码来格式化电子邮件标题的所有需要​​。 All that stuff with the separators and mime types becomes reduced to a few simple lines of code. 带有分隔符和mime类型的所有内容都简化为几行简单的代码。 Easier to read, easier to maintain, and less likely to have bugs. 易于阅读,易于维护,并且很少有错误。 You win all round. 您全面获胜。

//$pdfdoc is PDF generated by FPDF
    $attachment = chunk_split(base64_encode($pdfdoc));

$pdfdoc is not mentioned any where in the page. 在页面的任何位置均未提及$ pdfdoc。 I presume that is the issue:| 我认为这是问题所在:|

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM