I have problem sending an email with multiple attachments. Here is the code:
<?php
if(isset($_POST['sendEmail']))
{
foreach($_FILES['uploadEmail']['error'] as $key=>$value){
if(!$_FILES['uploadEmail']['error'][$key]){
$target_path = "";
$target_path = $target_path . basename( $_FILES['uploadEmail']['name'][$key]);
if(move_uploaded_file($_FILES['uploadEmail']['tmp_name'][$key], $target_path)){
$files[] = $_FILES['uploadEmail']['name'][$key];
}
}
}
$toEmails = explode(",",$_POST['toEmail']);
$count = count($toEmails);
$i = 0; $j = 1; $k = 100;
$bcc = '';
while($i<$count){
$bcc .= $toEmails[$i].",";
if($j==$k || $i==$count-1){
$j=1;
//echo $bcc.'<br />'.$sub.'<br />'.$message.'<br /><br />';
$from = 'test@gmail.com';
$sub = $_POST['subject'];
$message = $_POST['message'];
/////////////////////////
$headers = 'From:'. $from . "\r\n";
$headers .= "Bcc:". $bcc . "\r\n";
// 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";
// preparing attachments
for($x=0;$x<count($files);$x++){
$file = fopen($files[$x],"rb");
//echo "<br>".filesize($files[$x]);
$data = fread($file,filesize($files[$x]));
fclose($file);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" .
"Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
$message .= "--{$mime_boundary}\n";
}
// send
/////////////////////////
mail('',$sub,$message,$headers);
$bcc = '';
}else{
$j++;
}
$i++;
}
}
?>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script src="http://js.nicedit.com/nicEdit-latest.js" type="text/javascript"></script>
<script type="text/javascript">bkLib.onDomLoaded(function() {
new nicEditor().panelInstance('message');
// new nicEditor({fullPanel : true}).panelInstance('area2');
});</script>
</head>
<body>
<form method="POST" enctype="multipart/form-data">
<table>
<tr><td><label for="toEmail">Send To : </label></td><td><textarea id="toEmail" name="toEmail" cols="100" rows="10"></textarea></td></tr>
<tr><td><label for="subject">Subject : </label></td><td><input type="text" name="subject" id="subject" size="98"></td></tr>
<tr><td><label for="toEmail">Message : </label></td><td><textarea id="message" name="message" cols="100" rows="10"></textarea></td></tr>
<tr><td><label for="upload[]">Attachments:</label></td><td></td></tr>
<tr><td><label>1</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>2</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>3</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>4</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>5</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>6</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>7</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>8</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>9</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td><label>10</label></td><td><input type="file" name="uploadEmail[]"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="Send Email" name="sendEmail" id="sendEmail"></td></tr>
</table>
</form>
<body>
</html>
I received mail but could not find any attachments with it. Does anyone know what could be wrong?
Here is an email body which I got in mail:
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==Multipart_Boundary_x2d454346f03d2c19cfefc838ce4d8623x" This is a multi-part message in MIME format. --==Multipart_Boundary_x2d454346f03d2c19cfefc838ce4d8623x Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 7bit ds fsdfsdfsdfsdfsdfsdfsf sffdfsdfsdfs fsdfdf sdf s --==Multipart_Boundary_x2d454346f03d2c19cfefc838ce4d8623x Content-Type: {"application/octet-stream"}; name="/tmp/phpHFTvAw" Content-Disposition: attachment; filename="Lighthouse.jpg" Content-Transfer-Encoding: base64 --==Multipart_Boundary_x2d454346f03d2c19cfefc838ce4d8623x Content-Type: {"application/octet-stream"}; name="/tmp/phpyX67HR" Content-Disposition: attachment; filename="Penguins.jpg" Content-Transfer-Encoding: base64 --==Multipart_Boundary_x2d454346f03d2c19cfefc838ce4d8623x
Answer
There are a few problems with your code that I have detailed below.
Line endings
Lines in email messages are separated by
CRLF
(\r\n
) sequences. It is unclear whether themail()
function converts\n
into\r\n
or not, but considering that yourFrom:
andBcc:
headers are using\r\n
, these should probably use the same. Your output also indicates that the line endings are possibly missing or malformed.From the PHP Manual:
Header syntax
Remove the braces and the quotes:
Also, the
name
parameter has been deprecated in favour of thefilename
parameter in theContent-Disposition
header. If you want to keep it for some backward compatibility, you should remove the path from it. (Your output indicates that you're usingtmp_name
rather thanname
).Delimiters
Note that the final delimiter must have two trailing dashes. Insert the dividing delimiters at the beginning of the loop, and add a close delimiter after the loop:
See the section on Email syntax below.
Line lengths
Note that there are line length limits in email messages. RFC 5322:
You may want to cut your
Bcc
's shorter or introduce FWS (Folding White Space):Other issues
Some further issues or notices that might or might not be useful:
The last line is the same as:
I'm assuming that
$target_path
should be initialized to an upload directory.Generally, you should not allow random users to provide outgoing email addresses, but I suspect that this is an internal application for trusted users.
Email syntax
This is an excerpt of what the structure of a multi-part message body looks like according to RFC 2046. (BNF syntax, somewhat simplified.)
References
RFC 2822 Internet Message Format(Obsoleted by RFC 5322)I propose to use PHPMailer for sending mails with attachements:
Download and documentation: here.