2013-06-28 3 views
3

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

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

Вот мой код:

// Standard email info 


$to = '[email protected]'; 
$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: <[email protected]>\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.

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

Спасибо.

+3

Не создавайте свою собственную мимическую электронную почту. Используйте PHPMailer или Swiftmailer. Они оба делают это тривиальным и уменьшают ваш код до нескольких строк. –

ответ

10
 // to, from, subject, message body, attachment filename, etc. 
     $to = "[email protected]"; 
     $from = "[email protected]"; 
     $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);   
+0

Как подключить несколько файлов изображений? @ mti2935 –

3

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

Хорошо написано 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: Напомню, что вы всегда должны санировать вход (адрес электронной почты).

0

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

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