I have a function that should attach a file to outgoing email. For some reason, it sends only empty files.
Can anyone help? I checked that the files themselves are loading correctly and are in the exact location necessary for this function to work. Only .pdf, .doc and .docx are allowed
Also, this is on Windows Server ... (I know, I know ... YUCK!)
Here is the function:
function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { $file = str_replace('/','\\',$path.$filename); $file_size = filesize($file); $handle = fopen($file, "rb"); $contenta = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($contenta)); $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"; $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)) { return true; // or use booleans here } else { return false; } }
And here is the code using this:
//resume $errors=""; $dbDir="/candidate-resources/files/temp/"; $baseDir=$_SERVER['DOCUMENT_ROOT'].$dbDir; $validTypes=array(".doc",".pdf",".docx"); $filesToAdd=array(); $atLeastOne=false; $valid=false; $qs=""; if(count($_FILES)>0){ foreach($_FILES as $k=>$v){ if($v['size']>0){ $ext=substr($v['name'],strrpos($v['name'],".")); if(!in_array($ext,$validTypes)){ $errors='Only ".doc", ".docx", and ".pdf" files can be uploaded. "'.$ext.'" is not a valid file type.'; } } } } $requireds=array("name","email","message"); foreach($_POST as $k=>$v){//check for injection and spammers if(preg_match("/(%0A|%0D|\\n+|\\r+)(content-type:|to:|cc:|bcc:)/i",$v) || strpos($v,"http://")!==false || strpos($v,"www.")!==false){ $errors="HTML, website addresses, and scripting code are not allowed in any field. Please check your entries and try again."; } $post[$k]=strip_tags(trim(htmlentities($v))); } unset($_POST); foreach($requireds as $r){ if(!strlen(trim($post[$r]))){ $errors.="<li>".ucwords($r)."</li>"; } } if(strlen(trim($errors))){ $errors="These fields were left blank. Please fix and resubmit.<ul>".$errors."</ul>"; } else{ if(ereg("([[:alnum:]\.\-]+)(\@[[:alnum:]\.\-]+\.+)",$post['email'])!=true){ $errors="<p>You must enter a valid email address.</p>"; } else{ $filename = ''; $ext = ''; // upload the file, then attach it to the email, then delete it foreach($_FILES as $k=>$v){ if($v['size']!=0){ $atLeastOne=true; $ext=substr($v['name'],strrpos($v['name'],".")); move_uploaded_file($v['tmp_name'], $baseDir . "/" . $v['name']); $filename = $v['name']; } } $to = ' avalid@emailaddress '; $subject="Contact Form"; $headers="From: ".$post["name"]." <".$post["email"].">\r\nReply-To: ".$post["email"]."\r\n"; $message=$subject."\r\n=================================================\r\n\r\n"; foreach($post as $k=>$v) { if(strlen(trim($v))){ $message.=ucwords(str_replace("_"," ",$k)).": {$v}\r\n"; } } if(strlen($filename) > 0) { mail_attachment($filename, $baseDir, $to, $post["email"], $post["name"], $post["email"], $subject, $message); //now delete the temp file if (file_exists(str_replace('/','\\',$baseDir.$filename))) { unlink(str_replace('/','\\',$baseDir.$filename)); // delete it here only if it exists } }else{ mail($to,$subject,$message,$headers); } $errors="true"; } }
Please forgive ... I just inherited this code (that is: # 1 7 years, # 2 now they wanted to be able to attach a file to this letter)