简体   繁体   English

PHP-无法从表单发送带有附件的电子邮件

[英]PHP - Trouble sending e-mail with attachment from form

I having some trouble sending e-mail with attachment from the php MAIL function. 我从php MAIL函数发送带有附件的电子邮件时遇到麻烦。 The error checking is working but I can't get the file to upload and send in the e-mail. 错误检查正在运行,但是我无法使文件上传和发送电子邮件。 I'm using code I've pulled off the net. 我正在使用已经脱离网络的代码。 Just can't seem to get it working. 只是似乎无法正常工作。 Anyone have any thoughts? 有人有什么想法吗? Any help would be appreciated. 任何帮助,将不胜感激。 Thanks! 谢谢! URL to follow: 跟随的URL:

http://www.xsp.com/careers2.php http://www.xsp.com/careers2.php

if(array_key_exists('submit_check', $_POST)) {
                        if($_POST['first_name'] != NULL && $_POST['last_name'] != NULL && $_POST['e-mail'] != NULL && $_POST['address'] != NULL && $_POST['city'] != NULL && $_POST['zipcode'] != NULL && $_POST['country'] != NULL && $_POST['telephone'] != NULL && $_POST['first_name'] != '' && $_POST['last_name'] != '' && $_POST['e-mail'] != '' && $_POST['address'] != '' && $_POST['city'] != '' && $_POST['zipcode'] != '' && $_POST['country'] != '' || 
        (($_FILES["file"]["type"] == "application/doc") || ($_FILES["file"]["type"] == "application/pdf") || ($_FILES["file"]["type"] == "application/pdf")) && $_FILES["file"]["size"] < 100000) {                         
                            $first_name = preg_replace('/[^a-zA-Z0-9_]/s', '', $_POST['first_name']);
                            $last_name = preg_replace('/[^a-zA-Z0-9_]/s', '', $_POST['last_name']);
                            $city = preg_replace('/[^a-zA-Z0-9_]/s', '', $_POST['city']);
                            $state = preg_replace('/[^a-zA-Z0-9_]/s', '', $_POST['state']);
                            $zipcode = preg_replace('/[^a-zA-Z0-9_]/s', '', $_POST['zipcode']);
                            $email = $_POST['e-mail'];

                            // we'll begin by assigning the To address and message subject
                            $to = "myhiddenemailaddress@domain.com";

                            $subject = $form_title;

                           // get the sender's name and email address
                           // we'll just plug them a variable to be used later
                           //$from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";
                           $form = $email;

                           // generate a random string to be used as the boundary marker
                           $mime_boundary = "==Multipart_Boundary_x".md5(mt_rand())."x";

                           // store the file information to variables for easier access
                           $tmp_name = $_FILES['file']['tmp_name'];
                           $type = $_FILES['file']['type'];
                           $name = $_FILES['file']['name'];
                           $size = $_FILES['file']['size'];

                           // here we'll hard code a text message
                           // again, in reality, you'll normally get this from the form submission
                           $message = "Here is your file: $name";

                           /*echo $message."<br />";
                           echo "TMP NAME:".$tmp_name."<br />";
                           echo $_FILES['file'];*/

                           // if the upload succeded, the file will exist
                           if (file_exists($tmp_name)){

                              // check to make sure that it is an uploaded file and not a system file
                              if(is_uploaded_file($tmp_name)){

                                 // open the file for a binary read
                                 $file = fopen($tmp_name,'rb');

                                 // read the file content into a variable
                                 $data = fread($file,filesize($tmp_name));

                                 // close the file
                                 fclose($file);

                                // now we encode it and split it into acceptable length lines
                                $data = chunk_split(base64_encode($data));
                             }

                             // now we'll build the message headers
                              $headers = "From: $from\r\n" .
                                 "MIME-Version: 1.0\r\n" .
                                 "Content-Type: multipart/mixed;\r\n" .
                                 " boundary=\"{$mime_boundary}\"";

                              // next, we'll build the message body
                              // note that we insert two dashes in front of the
                              // MIME boundary when we use it
                              $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";
                                $message .="Application Form \n";
                                $message .="First Name: ".$first_name."\n";
                                $message .="Last Name: ".$last_name."\n";
                                $message .="E-Mail: ".$email."\n";

                                if ($_POST["company"] != NULL && $_POST["company"] != "") {
                                    $company = $_POST["company"];
                                    $message .= "COMPANY: ".$company."\n";
                                }

                                if ($_POST["position"] != NULL && $_POST["position"] != "") {
                                    $position = $_POST["position"];
                                    $message .= "POSITION: ".$position."\n";
                                }

                                if ($_POST["address"] != NULL && $_POST["address"] != "") {
                                    $address = $_POST["address"];
                                    $message .= "ADDRESS: ".$address."\n";
                                }

                                if ($city != NULL && $city != "") {
                                    $message .= "CITY: ".$city."\n";
                                }

                                if ($state != NULL && $state != "") {
                                    $message .= "STATE: ".$state."\n";
                                }

                                if ($zipcode != NULL && $zipcode != "") {
                                    $message .= "ZIPCODE: ".$zipcode."\n";
                                }

                                if ($_POST["telephone"] != NULL && $_POST["telephone"] != "") {
                                    $telephone = $_POST["telephone"];
                                    $message .= "TELEPHONE: ".$telephone."\n";
                                }

                                if ($_POST["website"] != NULL && $_POST["website"] != "") {
                                    $website = $_POST["website"];
                                    $message .= "WEBSITE: ".$website."\n\n";
                                }

                                if ($_POST["message"] != NULL && $_POST["message"] != "") {
                                    $message_text = $_POST["message"];
                                    $message .= "MESSAGE TEXT: ".$message_text."\n\n";
                                }


                              // now we'll insert a boundary to indicate we're starting the attachment
                              // we have to specify the content type, file name, and disposition as
                              // an attachment, then add the file content and set another boundary to
                              // indicate that the end of the file has been reached
                              $message .= "--{$mime_boundary}\n" .
                                 "Content-Type: {$type};\n" .
                                 " name=\"{$name}\"\n" .
                                 //"Content-Disposition: attachment;\n" .
                                 //" filename=\"{$fileatt_name}\"\n" .
                                 "Content-Transfer-Encoding: base64\n\n" .
                                 $data . "\n\n" .
                                 "--{$mime_boundary}--\n";

                              // now we just send the message
                              if (@mail($to, $subject, $message, $headers))
                                 echo "Message Sent";
                              else
                                 echo "Failed to send";
                           }
                        } else {
                            if ($file > 0) {
                                echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
                            }

                            echo '<p class="note" style="margin:5px 0 5px 0; color:#ff0000;">Please fill in all the required fields</p>';
                        }
                        //echo '<p class="note" style="margin:5px 0 0 0;">First Name: '.$first_name.'</p>';
                    } ?>

我使用PHPMAILER,它易于使用,有很多示例(包括附加文件的方法) pagina de phpmailer

  • You need to remove the \\r's and replace them with \\n's. 您需要删除\\ r并将其替换为\\ n。 Most mailservers no longer accept \\r 大多数邮件服务器不再接受\\ r
  • You need random hash separators for the MIME (see below code for example) 您需要MIME的随机散列分隔符(例如,请参见下面的代码)

    $filename = "MyAttachment.pdf"; $ filename =“ MyAttachment.pdf”;

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

    $separator = md5(time()); $ separator = md5(time());

    // carriage return type (we use a PHP end of line constant) //回车类型(我们使用PHP行尾常量)

    $eol =PHP_EOL; $ eol = PHP_EOL;

    // main header //主标题

    $headers = "From: ".$from.$eol; $ headers =“ From:”。$ from。$ eol;

    $headers .= "MIME-Version: 1.0".$eol; $ headers。=“” MIME版本:1.0“。$ eol; $headers .= "Content-Type: multipart/mixed; boundary=\\"".$separator."\\""; $ headers。=“内容类型:多部分/混合;边界= \\”“。$分隔符。” \\“”;

    // no more headers after this, we start the body! //在此之后不再有标题,我们开始正文! // //

    $body = "--".$separator.$eol; $ body =“-”。$ separator。$ eol;

    $body .= "Content-Transfer-Encoding: 7bit".$eol.$eol; $ body。=“ $ Content-Transfer-Encoding:7bit”。$ eol。$ eol;

    $body .= "This is a MIME encoded message.".$eol; $ body。=“”这是MIME编码的消息。“。$ eol;

    // message $body .= "--".$separator.$eol; //消息$ body。=“”-“。$ separator。$ eol;

    $body .= "Content-Type: text/html; charset=\\"iso-8859-1\\"".$eol; $ body。=“内容类型:文本/ html; charset = \\” iso-8859-1 \\“”。$ eol;

    $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol; $ body。=“ $ Content-Transfer-Encoding:8bit”。$ eol。$ eol;

    $body .= $message.$eol; $ body。= $ message。$ eol;

    // attachment // 附件

    $body .= "--".$separator.$eol; $ body。=“”-“。$ separator。$ eol;

    $body .= "Content-Type: application/octet-stream; name=\\"".$filename."\\"".$eol; $ body。=“内容类型:应用程序/八位字节流;名称= \\”“。$文件名。” \\“”。$ eol;

    $body .= "Content-Transfer-Encoding: base64".$eol; $ body。=“”内容传输编码:base64“。$ eol;

    $body .= "Content-Disposition: attachment".$eol.$eol; $ body。=“ Content-Disposition:附件”。$ eol。$ eol;

    $body .= $attachment.$eol; $ body。= $ attachment。$ eol;

    $body .= "--".$separator."--"; $ body。=“”-“。$ separator。”-“;

    // send message // 发信息

    mail($to, $subject, $body, $headers); mail($ to,$ subject,$ body,$ headers);

or you can just download the 3 class files from PHPmailer as suggested above since it has all of this already finished for you. 或者您可以按照上述建议从PHPmailer下载3个类文件,因为它已经为您完成了所有这些工作。

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

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