代码之家  ›  专栏  ›  技术社区  ›  PvDev

如何将pdf附加到html格式的电子邮件中?[复制]

  •  -1
  • PvDev  · 技术社区  · 5 年前

    $to = "xxx";
    $subject = "Subject" ;
    $message = 'Example message with <b>html</b>';
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From: xxx <xxx>' . "\r\n";
    mail($to,$subject,$message,$headers);
    

    我错过了什么?

    0 回复  |  直到 10 年前
        1
  •  313
  •   Travis    6 年前

    我同意@mihaiorga在评论中使用PHPMailer脚本。你听起来好像是因为你想要更简单的选择而拒绝它。相信我,伙计 这是一个非常容易的选择,与尝试自己使用PHP的内置功能相比有很大的差距 mail() 功能。PHP的 邮件() 功能确实不是很好。

    要使用PHPMailer,请执行以下操作:

    现在,发送带有附件的电子邮件从疯狂的困难变成了难以置信的简单:

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    $email = new PHPMailer();
    $email->SetFrom('you@example.com', 'Your Name'); //Name is optional
    $email->Subject   = 'Message Subject';
    $email->Body      = $bodytext;
    $email->AddAddress( 'destinationaddress@example.com' );
    
    $file_to_attach = 'PATH_OF_YOUR_FILE_HERE';
    
    $email->AddAttachment( $file_to_attach , 'NameOfFile.pdf' );
    
    return $email->Send();
    

    就这一行 $email->AddAttachment();

    如果你用PHP的 邮件() 函数时,您将编写一堆堆代码,并且可能会有很多很难找到的bug。

        2
  •  191
  •   Pragnesh Chauhan    6 年前

    您可以尝试使用以下代码:

        $filename = 'myfile';
        $path = 'your path goes here';
        $file = $path . "/" . $filename;
    
        $mailto = 'mail@mail.com';
        $subject = 'Subject';
        $message = 'My message';
    
        $content = file_get_contents($file);
        $content = chunk_split(base64_encode($content));
    
        // a random hash will be necessary to send mixed content
        $separator = md5(time());
    
        // carriage return type (RFC)
        $eol = "\r\n";
    
        // main header (multipart mandatory)
        $headers = "From: name <test@test.com>" . $eol;
        $headers .= "MIME-Version: 1.0" . $eol;
        $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
        $headers .= "Content-Transfer-Encoding: 7bit" . $eol;
        $headers .= "This is a MIME encoded message." . $eol;
    
        // message
        $body = "--" . $separator . $eol;
        $body .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
        $body .= "Content-Transfer-Encoding: 8bit" . $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;
        $body .= $content . $eol;
        $body .= "--" . $separator . "--";
    
        //SEND Mail
        if (mail($mailto, $subject, $body, $headers)) {
            echo "mail send ... OK"; // or use booleans here
        } else {
            echo "mail send ... ERROR!";
            print_r( error_get_last() );
        }
    

    编辑日期:2018年6月14日

    使用

    $body .= $eol . $message . $eol . $eol; $body .= $eol . $content . $eol . $eol;

        3
  •  134
  •   T.Todua    8 年前

    PHP 5.5.27安全更新

    $file = $path.$filename;
    $content = file_get_contents( $file);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $name = basename($file);
    
    // header
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    
    // message & attachment
    $nmessage = "--".$uid."\r\n";
    $nmessage .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $nmessage .= $message."\r\n\r\n";
    $nmessage .= "--".$uid."\r\n";
    $nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
    $nmessage .= "Content-Transfer-Encoding: base64\r\n";
    $nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $nmessage .= $content."\r\n\r\n";
    $nmessage .= "--".$uid."--";
    
    if (mail($mailto, $subject, $nmessage, $header)) {
        return true; // Or do something here
    } else {
      return false;
    }
    
        4
  •  22
  •   Matthew Johnson    10 年前

    Swiftmailer 是另一个易于使用的脚本,它可以自动保护 email injection 使依恋变得轻而易举。我也强烈反对使用PHP的内置 mail() 功能。

    使用:

    • 下载 Swiftmailer ,并将 lib 项目中的文件夹
    • 使用包含主文件 require_once 'lib/swift_required.php';

    // Create the message
    $message = Swift_Message::newInstance()
        ->setSubject('Your subject')
        ->setFrom(array('webmaster@mysite.com' => 'Web Master'))
        ->setTo(array('receiver@example.com'))
        ->setBody('Here is the message itself')
        ->attach(Swift_Attachment::fromPath('myPDF.pdf'));
    
    //send the message          
    $mailer->send($message);
    

    更多信息和选项可在 Swiftmailer Docs .

        5
  •  17
  •   Basith    12 年前

    <?php 
    //define the receiver of the email 
    $to = 'youraddress@example.com'; 
    //define the subject of the email 
    $subject = 'Test email with attachment'; 
    //create a boundary string. It must be unique 
    //so we use the MD5 algorithm to generate a random hash 
    $random_hash = md5(date('r', time())); 
    //define the headers we want passed. Note that they are separated with \r\n 
    $headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com"; 
    //add boundary string and mime type specification 
    $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 
    //read the atachment file contents into a string,
    //encode it with MIME base64,
    //and split it into smaller chunks
    $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); 
    //define the body of the message. 
    ob_start(); //Turn on output buffering 
    ?> 
    --PHP-mixed-<?php echo $random_hash; ?>  
    Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" 
    
    --PHP-alt-<?php echo $random_hash; ?>  
    Content-Type: text/plain; charset="iso-8859-1" 
    Content-Transfer-Encoding: 7bit
    
    Hello World!!! 
    This is simple text email message. 
    
    --PHP-alt-<?php echo $random_hash; ?>  
    Content-Type: text/html; charset="iso-8859-1" 
    Content-Transfer-Encoding: 7bit
    
    <h2>Hello World!</h2> 
    <p>This is something with <b>HTML</b> formatting.</p> 
    
    --PHP-alt-<?php echo $random_hash; ?>-- 
    
    --PHP-mixed-<?php echo $random_hash; ?>  
    Content-Type: application/zip; name="attachment.zip"  
    Content-Transfer-Encoding: base64  
    Content-Disposition: attachment  
    
    <?php echo $attachment; ?> 
    --PHP-mixed-<?php echo $random_hash; ?>-- 
    
    <?php 
    //copy current buffer contents into $message variable and delete current output buffer 
    $message = ob_get_clean(); 
    //send the email 
    $mail_sent = @mail( $to, $subject, $message, $headers ); 
    //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
    echo $mail_sent ? "Mail sent" : "Mail failed"; 
    ?>
    

    如您所见,发送带有附件的电子邮件很容易实现。在前面的示例中,我们有multipart/mixed MIME类型,其中有multipart/alternative MIME类型,它指定电子邮件的两个版本。为了在邮件中包含附件,我们将指定文件中的数据读入一个字符串,用base64对其进行编码,将其拆分成更小的块,以确保它与MIME规范相匹配,然后将其作为附件包含。

    取自 here

        6
  •  9
  •   Rotimi    6 年前

    这对我有用。它还附加了多个附件。容易地

    <?php
    
    if ($_POST && isset($_FILES['file'])) {
        $recipient_email = "recipient@yourmail.com"; //recepient
        $from_email = "info@your_domain.com"; //from email using site domain.
        $subject = "Attachment email from your website!"; //email subject line
    
        $sender_name = filter_var($_POST["s_name"], FILTER_SANITIZE_STRING); //capture sender name
        $sender_email = filter_var($_POST["s_email"], FILTER_SANITIZE_STRING); //capture sender email
        $sender_message = filter_var($_POST["s_message"], FILTER_SANITIZE_STRING); //capture message
        $attachments = $_FILES['file'];
    
        //php validation
        if (strlen($sender_name) < 4) {
            die('Name is too short or empty');
        }
        if (!filter_var($sender_email, FILTER_VALIDATE_EMAIL)) {
            die('Invalid email');
        }
        if (strlen($sender_message) < 4) {
            die('Too short message! Please enter something');
        }
    
        $file_count = count($attachments['name']); //count total files attached
        $boundary = md5("specialToken$4332"); // boundary token to be used
    
        if ($file_count > 0) { //if attachment exists
            //header
            $headers = "MIME-Version: 1.0\r\n";
            $headers .= "From:" . $from_email . "\r\n";
            $headers .= "Reply-To: " . $sender_email . "" . "\r\n";
            $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";
    
            //message text
            $body = "--$boundary\r\n";
            $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
            $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
            $body .= chunk_split(base64_encode($sender_message));
    
            //attachments
            for ($x = 0; $x < $file_count; $x++) {
                if (!empty($attachments['name'][$x])) {
    
                    if ($attachments['error'][$x] > 0) { //exit script and output error if we encounter any
                        $mymsg = array(
                            1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini",
                            2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
                            3 => "The uploaded file was only partially uploaded",
                            4 => "No file was uploaded",
                            6 => "Missing a temporary folder");
                        die($mymsg[$attachments['error'][$x]]);
                    }
    
                    //get file info
                    $file_name = $attachments['name'][$x];
                    $file_size = $attachments['size'][$x];
                    $file_type = $attachments['type'][$x];
    
                    //read file 
                    $handle = fopen($attachments['tmp_name'][$x], "r");
                    $content = fread($handle, $file_size);
                    fclose($handle);
                    $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045)
    
                    $body .= "--$boundary\r\n";
                    $body .= "Content-Type: $file_type; name=" . $file_name . "\r\n";
                    $body .= "Content-Disposition: attachment; filename=" . $file_name . "\r\n";
                    $body .= "Content-Transfer-Encoding: base64\r\n";
                    $body .= "X-Attachment-Id: " . rand(1000, 99999) . "\r\n\r\n";
                    $body .= $encoded_content;
                }
            }
        } else { //send plain email otherwise
            $headers = "From:" . $from_email . "\r\n" .
                    "Reply-To: " . $sender_email . "\n" .
                    "X-Mailer: PHP/" . phpversion();
            $body = $sender_message;
        }
    
        $sentMail = @mail($recipient_email, $subject, $body, $headers);
        if ($sentMail) { //output success or failure messages
            die('Thank you for your email');
        } else {
            die('Could not send mail! Please check your PHP mail configuration.');
        }
    }
    ?>
    
        7
  •  7
  •   Pedro Lobito    4 年前

    在处理了一段时间格式不好的附件之后,我使用了以下代码:

    $email = new PHPMailer();
    $email->From      = 'from@somedomain.com';
    $email->FromName  = 'FromName';
    $email->Subject   = 'Subject';
    $email->Body      = 'Body';
    $email->AddAddress( 'to@somedomain.com' );
    $email->AddAttachment( "/path/to/filename.ext" , "filename.ext", 'base64', 'application/octet-stream' );
    $email->Send();
    
        8
  •  6
  •   Irshad Khan    9 年前

    工作理念:

    if (isset($_POST['submit'])) {
        $mailto = $_POST["mailTo"];
        $from_mail = $_POST["fromEmail"];
        $replyto = $_POST["fromEmail"];
        $from_name = $_POST["fromName"];
        $message = $_POST["message"];
        $subject = $_POST["subject"];
    
        $filename = $_FILES["fileAttach"]["name"];
        $content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"])));
    
        $uid = md5(uniqid(time()));
        $name = basename($file);
        $header = "From: " . $from_name . " <" . $from_mail . ">\r\n";
        $header .= "Reply-To: " . $replyto . "\r\n";
    
        $header .= "MIME-Version: 1.0\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
        $header .= "This is a multi-part message in MIME format.\r\n";
        $header .= "--" . $uid . "\r\n";
    
    // You add html "Content-type: text/html; charset=utf-8\n" or for Text "Content-type:text/plain; charset=iso-8859-1\r\n" by I.khan
        $header .= "Content-type:text/html; charset=utf-8\n";
        $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    
    // User Message you can add HTML if You Selected HTML content
        $header .= "<div style='color: red'>" . $message . "</div>\r\n\r\n";
    
        $header .= "--" . $uid . "\r\n";
        $header .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here
        $header .= "Content-Transfer-Encoding: base64\r\n";
        $header .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment
        $header .= $content . "\r\n\r\n";
        $header .= "--" . $uid . "--";
        if (mail($mailto, $subject, "", $header)) {
            echo "<script>alert('Success');</script>"; // or use booleans here
        } else {
            echo "<script>alert('Failed');</script>";
        }
    }
    
        9
  •  6
  •   omikes    6 年前

    以上答案都不适合我,因为他们指定的附件格式( application/octet-stream ). 使用 application/pdf 以获得最佳效果的PDF文件。

    <?php
    
    // just edit these 
    $to          = "email1@domain.com, email2@domain.com"; // addresses to email pdf to
    $from        = "sent_from@domain.com"; // address message is sent from
    $subject     = "Your PDF email subject"; // email subject
    $body        = "<p>The PDF is attached.</p>"; // email body
    $pdfLocation = "./your-pdf.pdf"; // file location
    $pdfName     = "pdf-file.pdf"; // pdf file name recipient will get
    $filetype    = "application/pdf"; // type
    
    // creates headers and mime boundary
    $eol = PHP_EOL;
    $semi_rand     = md5(time());
    $mime_boundary = "==Multipart_Boundary_$semi_rand";
    $headers       = "From: $from$eolMIME-Version: 1.0$eol" .
        "Content-Type: multipart/mixed;$eol boundary=\"$mime_boundary\"";
    
    // add html message body
    $message = "--$mime_boundary$eol" .
        "Content-Type: text/html; charset=\"iso-8859-1\"$eol" .
        "Content-Transfer-Encoding: 7bit$eol$eol$body$eol";
    
    // fetches pdf
    $file = fopen($pdfLocation, 'rb');
    $data = fread($file, filesize($pdfLocation));
    fclose($file);
    $pdf = chunk_split(base64_encode($data));
    
    // attaches pdf to email
    $message .= "--$mime_boundary$eol" .
        "Content-Type: $filetype;$eol name=\"$pdfName\"$eol" .
        "Content-Disposition: attachment;$eol filename=\"$pdfName\"$eol" .
        "Content-Transfer-Encoding: base64$eol$eol$pdf$eol--$mime_boundary--";
    
    // Sends the email
    if(mail($to, $subject, $message, $headers)) {
        echo "The email was sent.";
    }
    else {
        echo "There was an error sending the mail.";
    }
    
        10
  •  2
  •   Dhawal Naik    7 年前
                $to = "to@gmail.com";
                $subject = "Subject Of The Mail";
                $message = "Hi there,<br/><br/>This is my message.<br><br>";
    
                $headers = "From: From-Name<from@gmail.com>";
    // boundary
                $semi_rand = md5(time());
                $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
    
    // headers for attachment
                $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
    
    // multipart boundary
                $message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/html; charset=ISO-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";
    
                    $message .= "--{$mime_boundary}\n";
                    $filepath = 'uploads/'.$_FILES['image']['name'];
                    move_uploaded_file($_FILES['image']['tmp_name'], $filepath); //upload the file
                    $filename = $_FILES['image']['name'];
                    $file = fopen($filepath, "rb");
                    $data = fread($file, filesize($filepath));
                    fclose($file);
                    $data = chunk_split(base64_encode($data));
                    $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$filename\"\n" .
                            "Content-Disposition: attachment;\n" . " filename=\"$filename\"\n" .
                            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
                    $message .= "--{$mime_boundary}\n";
    
    mail($to, $subject, $message, $headers);
    
        11
  •  2
  •   Ebenezer Isaac    4 年前

    HTML代码:

    <form enctype="multipart/form-data" method="POST" action=""> 
        <label>Your Name <input type="text" name="sender_name" /> </label> 
        <label>Your Email <input type="email" name="sender_email" /> </label> 
        <label>Your Contact Number <input type="tel" name="contactnumber" /> </label>
        <label>Subject <input type="text" name="subject" /> </label> 
        <label>Message <textarea name="description"></textarea> </label> 
        <label>Attachment <input type="file" name="attachment" /></label> 
        <label><input type="submit" name="button" value="Submit" /></label> 
    </form> 
    

    <?php
    if($_POST['button']){
    {
        //Server Variables
        $server_name = "Your Name";
        $server_mail = "your_mail@domain.com";
    
        //Name Attributes of HTML FORM
        $sender_email = "sender_email";
        $sender_name = "sender_name";
        $contact = "contactnumber";
        $mail_subject = "subject";
        $input_file = "attachment";
        $message = "description";
    
        //Fetching HTML Values
        $sender_name = $_POST[$sender_name];
        $sender_mail = $_POST[$sender_email];
        $message = $_POST[$message];
        $contact= $_POST[$contact];
        $mail_subject = $_POST[$mail_subject];
    
        //Checking if File is uploaded
        if(isset($_FILES[$input_file])) 
        { 
            //Main Content
            $main_subject = "Subject seen on server's mail";
            $main_body = "Hello $server_name,<br><br> 
            $sender_name ,contacted you through your website and the details are as below: <br><br> 
            Name : $sender_name <br> 
            Contact Number : $contact <br> 
            Email : $sender_mail <br> 
            Subject : $mail_subject <br> 
            Message : $message.";
    
            //Reply Content
            $reply_subject = "Subject seen on sender's mail";
            $reply_body = "Hello $sender_name,<br> 
            \t Thank you for filling the contact form. We will revert back to you shortly.<br><br>
            This is an auto generated mail sent from our Mail Server.<br>
            Please do not reply to this mail.<br>
            Regards<br>
            $server_name";
    
    //#############################DO NOT CHANGE ANYTHING BELOW THIS LINE#############################
            $filename= $_FILES[$input_file]['name'];
            $file = chunk_split(base64_encode(file_get_contents($_FILES[$input_file]['tmp_name'])));
            $uid = md5(uniqid(time()));
            //Sending mail to Server
            $retval = mail($server_mail, $main_subject, "--$uid\r\nContent-type:text/html; charset=iso-8859-1\r\nContent-Transfer-Encoding: 7bit\r\n\r\n $main_body \r\n\r\n--$uid\r\nContent-Type: application/octet-stream; name=\"$filename\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"$filename\"\r\n\r\n$file\r\n\r\n--$uid--", "From: $sender_name <$sender_mail>\r\nReply-To: $sender_mail\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$uid\"\r\n\r\n");
            //Sending mail to Sender
            $retval = mail($sender_mail, $reply_subject, $reply_body , "From: $server_name<$server_mail>\r\nMIME-Version: 1.0\r\nContent-type: text/html\r\n");
    //#############################DO NOT CHANGE ANYTHING ABOVE THIS LINE#############################
    
            //Output
            if ($retval == true) {
                echo "Message sent successfully...";
                echo "<script>window.location.replace('index.html');</script>";
            } else {
                echo "Error<br>";
                echo "Message could not be sent...Try again later";
                echo "<script>window.location.replace('index.html');</script>";
            }
        }else{
            echo "Error<br>";
            echo "File Not Found";
        }
    }else{
        echo "Error<br>";
        echo "Unauthorised Access";
    }
    
        12
  •  1
  •   JasonWoof    7 年前

    最后我编写了自己的电子邮件发送/编码功能。这对我发送PDF附件很有效。我没有在生产中使用其他功能。

    注意:尽管规范非常强调必须使用\r\n来分隔标头,但我发现它只在使用PHP\u EOL时才起作用。我只在Linux上测试过这个。基督教青年会

    <?php
    # $args must be an associative array
    #     required keys: from, to, body
    #          body can be a string or a [tree of] associative arrays. See examples below
    #     optional keys: subject, reply_to, cc, bcc
    # EXAMPLES:
    #    # text-only email:
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        # body will be text/plain because we're passing a string that doesn't start with '<'
    #        'body' => 'Hi, testing 1 2 3',
    #    ));
    #
    #    # html-only email
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        # body will be text/html because we're passing a string that starts with '<'
    #        'body' => '<h1>Hi!</h1>I like <a href="http://cheese.com">cheese</a>',
    #    ));
    #
    #    # text-only email (explicitly, in case first character is dynamic or something)
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        # body will be text/plain because we're passing a string that doesn't start with '<'
    #        'body' => array(
    #            'type' => 'text',
    #            'body' => $message_text,
    #        )
    #    ));
    #
    #    # email with text and html alternatives (auto-detected mime types)
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        'body' => array(
    #            'type' => 'alternatives',
    #            'body' => array(
    #                "Hi!\n\nI like cheese",
    #                '<h1>Hi!</h1><p>I like <a href="http://cheese.com">cheese</a></p>',
    #            )
    #        )
    #    ));
    #
    #    # email with text and html alternatives (explicit types)
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        'body' => array(
    #            'type' => 'alternatives',
    #            'body' => array(
    #                array(
    #                    'type' => 'text',
    #                    'body' => "Hi!\n\nI like cheese",
    #                ),
    #                array(
    #                    'type' => 'html',
    #                    'body' => '<h1>Hi!</h1><p>I like cheese</p>',
    #                ),
    #            )
    #        )
    #    ));
    #
    #    # email with an attachment
    #    email2(array(
    #        'from' => 'noreply@foo.com',
    #        'to' => 'jason@jasonwoof.com',
    #        'subject' => 'test',
    #        'body' => array(
    #            'type' => 'mixed',
    #            'body' => array(
    #                "Hi!\n\nCheck out this (inline) image",
    #                array(
    #                    'type' => 'image/png',
    #                    'disposition' => 'inline',
    #                    'body' => $image_data, # raw file contents
    #                ),
    #                "Hi!\n\nAnd here's an attachment",
    #                array(
    #                    'type' => 'application/pdf; name="attachment.pdf"',
    #                    'disposition' => 'attachment; filename="attachment.pdf"',
    #                    'body' => $pdf_data, # raw file contents
    #                ),
    #                "Or you can use shorthand:",
    #                array(
    #                    'type' => 'application/pdf',
    #                    'attachment' => 'attachment.pdf', # name for client (not data source)
    #                    'body' => $pdf_data, # raw file contents
    #                ),
    #            )
    #        )
    #    ))
    function email2($args) {
        if (!isset($args['from'])) { return 1; }
        $from = $args['from'];
        if (!isset($args['to'])) { return 2; }
        $to = $args['to'];
        $subject = isset($args['subject']) ? $args['subject'] : '';
        $reply_to = isset($args['reply_to']) ? $args['reply_to'] : '';
        $cc = isset($args['cc']) ? $args['cc'] : '';
        $bcc = isset($args['bcc']) ? $args['bcc'] : '';
    
        #FIXME should allow many more characters here (and do Q encoding)
        $subject = isset($args['subject']) ? $args['subject'] : '';
        $subject = preg_replace("|[^a-z0-9 _/#'.:&,-]|i", '_', $subject);
    
        $headers = "From: $from";
        if($reply_to) {
            $headers .= PHP_EOL . "Reply-To: $reply_to";
        }
        if($cc) {
            $headers .= PHP_EOL . "CC: $cc";
        }
        if($bcc) {
            $headers .= PHP_EOL . "BCC: $bcc";
        }
    
        $r = email2_helper($args['body']);
        $headers .= PHP_EOL . $r[0];
        $body = $r[1];
    
        if (mail($to, $subject, $body, $headers)) {
            return 0;
        } else {
            return 5;
        }
    }
    
    function email2_helper($body, $top = true) {
        if (is_string($body)) {
            if (substr($body, 0, 1) == '<') {
                return email2_helper(array('type' => 'html', 'body' => $body), $top);
            } else {
                return email2_helper(array('type' => 'text', 'body' => $body), $top);
            }
        }
        # now we can assume $body is an associative array
        # defaults:
        $type = 'application/octet-stream';
        $mime = false;
        $boundary = null;
        $disposition = null;
        $charset = false;
        # process 'type' first, because it sets defaults for others
        if (isset($body['type'])) {
            $type = $body['type'];
            if ($type === 'text') {
                $type = 'text/plain';
                $charset = true;
            } elseif ($type === 'html') {
                $type = 'text/html';
                $charset = true;
            } elseif ($type === 'alternative' || $type === 'alternatives') {
                $mime = true;
                $type = 'multipart/alternative';
            } elseif ($type === 'mixed') {
                $mime = true;
                $type = 'multipart/mixed';
            }
        }
        if (isset($body['disposition'])) {
            $disposition = $body['disposition'];
        }
        if (isset($body['attachment'])) {
            if ($disposition == null) {
                $disposition = 'attachment';
            }
            $disposition .= "; filename=\"{$body['attachment']}\"";
            $type .= "; name=\"{$body['attachment']}\"";
        }
        # make headers
        $headers = array();
        if ($top && $mime) {
            $headers[] = 'MIME-Version: 1.0';
        }
        if ($mime) {
            $boundary = md5('5sd^%Ca)~aAfF0=4mIN' . rand() . rand());
            $type .= "; boundary=$boundary";
        }
        if ($charset) {
            $type .= '; charset=' . (isset($body['charset']) ? $body['charset'] : 'UTF-8');
        }
        $headers[] = "Content-Type: $type";
        if ($disposition !== null) {
            $headers[] = "Content-Disposition: {$disposition}";
        }
    
        $data = '';
        # return array, first el is headers, 2nd is body (php's mail() needs them separate)
        if ($mime) {
            foreach ($body['body'] as $sub_body) {
                $data .= "--$boundary" . PHP_EOL;
                $r = email2_helper($sub_body, false);
                $data .= $r[0] . PHP_EOL . PHP_EOL; # headers
                $data .= $r[1] . PHP_EOL . PHP_EOL; # body
            }
            $data .= "--$boundary--";
        } else {
            if(preg_match('/[^\x09\x0A\x0D\x20-\x7E]/', $body['body'])) {
                $headers[] = "Content-Transfer-Encoding: base64";
                $data .= chunk_split(base64_encode($body['body']));
            } else {
                $data .= $body['body'];
            }
        }
        return array(join(PHP_EOL, $headers), $data);
    }
    
        13
  •  -1
  •   Jon    9 年前

    this page

    他开始我做一个功能邮件附件,以后可以调用。他后来用他的附件代码做了。

    <?php
    function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
        $file = $path.$filename;
        $file_size = filesize($file);
        $handle = fopen($file, "r");
        $content = fread($handle, $file_size);
        fclose($handle);
        $content = chunk_split(base64_encode($content));
        $uid = md5(uniqid(time()));
        $header = "From: ".$from_name." <".$from_mail.">\r\n";
        $header .= "Reply-To: ".$replyto."\r\n";
        $header .= "MIME-Version: 1.0\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
        $header .= "This is a multi-part message in MIME format.\r\n";
        $header .= "--".$uid."\r\n";
        $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
        $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $header .= $message."\r\n\r\n";
        $header .= "--".$uid."\r\n";
        $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
        $header .= "Content-Transfer-Encoding: base64\r\n";
        $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
        $header .= $content."\r\n\r\n";
        $header .= "--".$uid."--";
        if (mail($mailto, $subject, "", $header)) {
            echo "mail send ... OK"; // or use booleans here
        } else {
            echo "mail send ... ERROR!";
        }
    }
    
    //start editing and inputting attachment details here
    $my_file = "somefile.zip";
    $my_path = "/your_path/to_the_attachment/";
    $my_name = "Olaf Lederer";
    $my_mail = "my@mail.com";
    $my_replyto = "my_reply_to@mail.net";
    $my_subject = "This is a mail with attachment.";
    $my_message = "Hallo,\r\ndo you like this script? I hope it will help.\r\n\r\ngr. Olaf";
    mail_attachment($my_file, $my_path, "recipient@mail.org", $my_mail, $my_name, $my_replyto, $my_subject, $my_message);
    ?>
    

    他在他的网页上有更多的细节,并在评论部分回答了一些问题。

        14
  •  -1
  •   Irshad Khan    8 年前

    100%的工作理念是用php发送带有附件的电子邮件:

    if (isset($_POST['submit'])) {
      extract($_POST);
      require_once('mail/class.phpmailer.php');
    
      $subject = "$name Applied For - $position";
      $email_message = "<div>Thanks for Applying ....</div> ";
    
      $mail = new PHPMailer;
      $mail->IsSMTP(); // telling the class to use SMTP
      $mail->Host = "mail.companyname.com"; // SMTP server
      $mail->SMTPDebug = 0;
      $mail->SMTPAuth = true;
      $mail->SMTPSecure = "ssl";
      $mail->Host = "smtp.gmail.com";
      $mail->Port = 465;
      $mail->IsHTML(true);
      $mail->Username = "info@companyname.com";  // GMAIL username
      $mail->Password = "mailPassword";          // GMAIL password
    
      $mail->SetFrom('info@companyname.com', 'new application submitted');
      $mail->AddReplyTo("name@yourdomain.com","First Last");
      $mail->Subject = "your subject";
    
      $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    
      $mail->MsgHTML($email_message);
    
      $address = 'info@companyname.com';
      $mail->AddAddress($address, "companyname");
    
      $mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);      // attachment
    
      if (!$mail->Send()) {
        /* Error */
        echo 'Message not Sent! Email at info@companyname.com';
      } else {
        /* Success */
        echo 'Sent Successfully! <b> Check your Mail</b>';
      }
    }
    

    我用这段代码发送带有附件的谷歌smtp邮件。。。。

    注意:从此处下载PHPMailer库-> https://github.com/PHPMailer/PHPMailer