简体   繁体   English

PHP发送带有图像附件的电子邮件

[英]PHP send an email with image attachment

I'm trying to create a script that will send an image uploaded from an iphone app I'm developing to me in an email. 我正在尝试创建一个脚本,该脚本将通过电子邮件发送从我正在开发的iphone应用程序上传的图像。

I've been able to get the script to send me an email with an attachment. 我已经能够通过脚本向我发送带附件的电子邮件。 However, the attachment is always 0kb. 但是,附件总是0kb。

Here is my code: 这是我的代码:

// Standard email info


$to = 'example@example.com'; 
 $subject = 'Email with an image attached'; 

 // This variable will be used when declaring the "boundaries"
 // for the different sections of the email
 $boundary = md5(date('r', time()));

 //Initial Headers 
 $headers = "MIME-Version: 1.0\r\n"; // <- the "\r\n" indicate a carriage return and newline, respectively
 $headers .= "From: <example@example.com>\r\n";
 $headers .= "Content-Type: multipart/mixed; boundary=" . $boundary . "\r\n"; // <- This is 
 // saying the there will be more than one (a "mix") of Content Types in this email.
 // The "boundary" value will indicate when each content type will start

  //First Content Type
 $message = "\r\n\r\n--" . $boundary . "\r\n"; // <- This indicates that I'm going to start
 // declaring headers specific to this section of the email. 
 // MAKE SURE there's only ONE(1) "\r\n" between the above boundry and the first header below (Content-Type)
 $message .= "Content-type: text/plain; charset=\"iso-8859-1\"\r\n"; // <- Here I'm saying this content should be plain text
 $message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";

 // Body of the email for the headers I just declared 
 $message .= "Someone filled out the form. See their info below:\r\n";
 $message .= "Name:";

//Second Content Type
 $message .= "\r\n\r\n--" . $boundary . "\r\n"; // <- This idicates that I'm going to start 
 // declaring some more headers for the content below
 // MAKE SURE there's only ONE(1) "\r\n" between the above boundry and the first header below (Content-Type)
 $message .= "Content-type: image/jpeg\r\n"; // <- Here I'm saying that this Content Type is for a JPEG image
 $message .= "Content-Transfer-Encoding: base64\r\n"; // <- this is saying that this section's content will be base64 Encoded
 $message .= "Content-Disposition: attachment; filename=\"Image.jpg\"\r\n"; // <- This is saying the content below should be an attachment and gives it a file name

 // The base64_encode below is necessary because this is a file. 
 $message .= base64_encode(file_get_contents($_FILES["userfile"]["name"])); 

 $message .= "\r\n\r\n--" . $boundary . "--"; // <- This indicates the end of the boundries. Notice the additional "--" after the boundry's value.

 // Send the email using "mail()".
 // Adding the "$mail_sent = " before "mail()" will store TRUE in $mail_sent if the email is sent successfully
 // Adding the "@" sign before "mail()" will disable error display so users
 // won't see the actual error info if it fails, just "Mail failed".
 $mail_sent = @mail($to, $subject, $message, $headers); 

 //Check to see if the email was sent successfully ($mail_sent = true).
 //If so, display "Mail Sent" to the screen, else display "Mail Failed".
 echo $mail_sent ? "Mail sent" : "Mail failed"; 

Everything works fine except the attachment is 0kb. 一切正常,但附件是0kb。

Any help is appreciated. 任何帮助表示赞赏。

Thanks. 谢谢。

        // to, from, subject, message body, attachment filename, etc.
        $to = "to@to.com";
        $from = "from@from.com";
        $subject = "subject";
        $message = "this is the message body";
        $filename = "/home/user/file.jpeg";
        $fname = "file.jpeg";

        $headers = "From: $from"; 
        // 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/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
        $message .= "--{$mime_boundary}\n";

        // preparing attachments            
            $file = fopen($filename,"rb");
            $data = fread($file,filesize($filename));
            fclose($file);
            $data = chunk_split(base64_encode($data));
            $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"".$fname."\"\n" . 
            "Content-Disposition: attachment;\n" . " filename=\"$fname\"\n" . 
            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
            $message .= "--{$mime_boundary}--\n";


        // send
        //print $message;

        $ok = @mail($to, $subject, $message, $headers, "-f " . $from);          

While there are canned functions for this, what a fantastic exercise for a junior programmer! 虽然有固定的功能,对于初级程序员来说,这是一个很棒的练习!

Very well written mti2935 . 很好写的mti2935 It would do folks good to actually read and not just cut-and-paste. 实际阅读并不仅仅是剪切和粘贴,这对人们有好处。 If you're sending email with php, you should understand these fundamental concepts. 如果您使用php发送电子邮件,您应该了解这些基本概念。

Probably some oversights from masking your real code: 掩盖真实代码可能会产生一些疏忽:

Line 23 should be: 第23行应该是:

$data = fread($file,filesize($filename));

That is, $fname should be $filename . 也就是说, $fname应该是$filename

Line 26 should be: 第26行应该是:

$message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"".$fname."\"\n" .

Neither $x nor $files[$x] are defined. $x$files[$x]都没有定义。

@ Thomas Spade : I'd like to remind that you should always sanitize input (email address). @ Thomas Spade :我想提醒你应该始终清理输入(电子邮件地址)。

关闭的mime边界应该以--结束,所以第29行应该是:

$message .= "--{$mime_boundary}--\n";

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

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