Attach a file to email using PHP

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)

+4
source share
2 answers

I changed my function around some and this works:

 function mail_attachment($from, $fromname, $to, $subj, $text, $filename){ $f = fopen($filename,"rb"); $un = strtoupper(uniqid(time())); $head = "From: $fromname <$from>\n"; $head .= "To: $to\n"; $head .= "Subject: $subj\n"; $head .= "X-Mailer: PHPMail Tool\n"; $head .= "Reply-To: $from\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type:multipart/mixed;"; $head .= "boundary=\"----------".$un."\"\n\n"; $zag = "------------".$un."\nContent-Type:text/html;\n"; $zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; $zag .= "------------".$un."\n"; $zag .= "Content-Type: application/octet-stream;"; $zag .= "name=\"".basename($filename)."\"\n"; $zag .= "Content-Transfer-Encoding:base64\n"; $zag .= "Content-Disposition:attachment;"; $zag .= "filename=\"".basename($filename)."\"\n\n"; $zag .= chunk_split(base64_encode(fread($f, filesize($filename))))."\n"; return @mail("$to", "$subj", $zag, $head); } 

(without the need for a third party)

0
source

Start using Swiftmailer ( documentation ) or PhpMailer , your life will be easier ...

Swiftmailer example:

 require_once 'lib/swift_required.php'; $transport = Swift_MailTransport::newInstance(); $mailer = Swift_Mailer::newInstance($transport); $message = Swift_Message::newInstance('Wonderful Subject') ->setFrom(array(' john@doe.com ' => 'John Doe')) ->setTo(array(' receiver@domain.org ', ' other@domain.org ' => 'A name')) ->setBody('Here is the message itself') ->attach(Swift_Attachment::fromPath('my-document.pdf')); $mailer->send($message); 

PhpMailer example:

 $mail = new PHPMailer(); // defaults to using php "mail()" $mail->SetFrom(' name@yourdomain.com ', 'First Last'); $mail->AddReplyTo(" name@yourdomain.com ","First Last"); $mail->AddAddress(" whoto@otherdomain.com ", "John Doe"); $mail->Subject = "PHPMailer Test Subject via mail(), basic"; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML($body); $mail->AddAttachment("images/phpmailer.gif"); // attachment $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; } 

I prefer Swiftmailer, but you choose the best one :-)

+7
source

All Articles