PHP отправляет электронное письмо с прикрепленным изображением

Я пытаюсь создать сценарий, который отправит изображение, загруженное из приложения iphone, которое я разрабатываю для меня по электронной почте.

Я смог получить скрипт, чтобы отправить мне электронное письмо с приложением. Однако вложение всегда 0kb.

Вот мой код:

// 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"; 

Все работает отлично, за исключением приложения 0kb.

Любая помощь приветствуется.

Благодарю.

  // 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); 

Хотя для этого есть законсервированные функции, какое фантастическое упражнение для младшего программиста!

Очень хорошо написано mti2935 . Это было бы хорошо для людей, чтобы читать, а не просто вырезать и вставлять. Если вы отправляете электронную почту с php, вы должны понимать эти основные понятия.

Возможно, некоторые недочеты от маскировки вашего реального кода:

Строка 23 должна быть:

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

То есть $fname должно быть $filename .

Строка 26 должна быть:

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

Ни $x ни $files[$x] не определены.

@ Thomas Spade : Я хотел бы напомнить, что вы всегда должны санировать вход (адрес электронной почты).

И закрывающая граница мим должна заканчиваться на -- , поэтому строка 29 должна читать:

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