6

I am trying to implement mail functionality in php, its working fine with single attachment, but problem is when I am trying to send more than one attachment, its not working. I am using php mail() function for sending emails, I am trying to attach a PDF and an Image file. If PDF attach then Image won't attach, if Image attach then PDF won't attach. Any thoughts where I'm doing wrong?

$header       .= 'From: test <noreply@test.ae>' . "\r\n";       
$header       .= "MIME-Version: 1.0\r\n";
$file           = '1.png'
$displayname    = '1.png';
$file_size     = filesize($file);
$handle        = fopen($file, "r");
$content       = fread($handle, $file_size);
fclose($handle);
$content       = chunk_split(base64_encode($content));
$uid           = md5(uniqid(time()));
$name          = basename($file);

$filepdf        = '1.pdf'
$displaynamepdf= '1.pdf';
$file_sizepdf  = filesize($filepdf);
$handlepdf     = fopen($filepdf, "r");
$contentpdf    = fread($handlepdf, $file_sizepdf);
fclose($handlepdf);
$contentpdf    = chunk_split(base64_encode($contentpdf));
$name          = basename($file);

$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=\"".$displayname."\"\r\n"; // use different content types here
$header       .= "Content-Transfer-Encoding: base64\r\n";
$header       .= "Content-Disposition: attachment; filename=\"".$displayname."\"\r\n\r\n";
$header       .= $content."\r\n\r\n";

$header       .= "Content-Type: application/octet-stream; name=\"".$displaynamepdf."\"\r\n"; // use different contentpdf types here
$header       .= "Content-Transfer-Encoding: base64\r\n";
$header       .= "Content-Disposition: attachment; filename=\"".$displaynamepdf."\"\r\n\r\n";
$header       .= $contentpdf."\r\n\r\n";
$header       .= "--".$uid."--";

if (mail($to, $subject, "", $header)) {
   return 'sent';
} else {
    return 'not sent';
}
  • 6
    My 2¢: Try to use [PHPMailer](http://phpmailer.worxware.com/) or [swiftmailer](http://swiftmailer.org/). – Mihai Iorga Mar 15 '13 at 06:38
  • 1
    Yea, use a library if you can - there's a lots of problems that took lots of smart people a lot of time to figure out. I like PHPMailer. The problem can be minor and dependent of your type of SMTP server. A library would handle these problems. – Nick Pickering Mar 15 '13 at 06:40
  • 1
    Mihai already touches on this point, but php `mail()` is usually inadequate for any real projects. I suggest PHPMailer. It takes 5 minutes to set up and is very powerful. I do not recommend any PEAR mail modules. – None Mar 15 '13 at 06:45
  • @Mihai I have never used swiftmailer. Any advantages over PHPMailer? – None Mar 15 '13 at 06:47
  • @Mihai i got solution with PHPMailer thanks a lot for your suggestion... – user2172726 Mar 15 '13 at 10:42

4 Answers4

1

PHPMailer is the best to use for email.

checkout some below links which will help you in future also:

  1. File Attachments in PHP Mail with PHPMailer
  2. php mailer attachments
  3. attachments using phpMailer
  4. PHPMailer Tutorial
  5. A Simple Example : Sending Email with Attachment Using Phpmailer
  6. PHP send email with multiple attachments with PHPMailer with SMTP Authentication
  7. Sending email with multiple attachments with PHP

may this help you.

Community
  • 1
  • 1
Tony Stark
  • 8,064
  • 8
  • 44
  • 63
0

You have $file and $filepdf both set to '1.png'. Set $filepdf="1.pdf" so that the rest of the header is correct.

None
  • 5,491
  • 1
  • 40
  • 51
0

Here is the code for multiple attachments in mail function..

I have created the function for multiple attachment . and check this.

/* 
     * Function Name: sentMail
     * Scope        : Sent Mail Function with CC , BCC and Attachment files..
     * Input        : Recipient Name            => $recipientName   // (Required)
     *                Recipient MailId(Many)    => $recipientMailId // (Required & Array Format)
     *                Subject Content           => $subjectContent  // (Required)
     *                Message Content           => $messageContent  // (Required)
     *                Sender MailId             => $senderMailId    // (Required)
     *                Sender Name(Many)         => $senderName      // (Required)
     *                Recipient CC MailId       => $recipientCCMailId   //(Optional & Array Format)
     *                Recipient BCC MailId      => $recipientBCCMailId  //(Optional & Array Format)
     *                Attachment Files          => $attachmentFiles     //(Optional & Array Format)
     * Output       : Sent mail to the Recipient.
     */
    public function sentMail($recipientName,$recipientMailId,$subjectContent,$messageContent,$senderName,$senderMailId,$recipientCCMailId,$recipientBCCMailId,$attachmentFiles)
    {
        try 
        {
            /*Get the Mulitple Recipient CC MailId*/
            if(isset($recipientCCMailId)){
                if(count($recipientCCMailId)>1){
                    $recipientCCMailId = implode(',',$recipientCCMailId);
                }
                else{
                    $recipientCCMailId = $recipientCCMailId[0];
                }
            }

            /*Get the Mulitple Recipient BCC MailId*/
            if(isset($recipientBCCMailId)){
                if(count($recipientBCCMailId)>1){
                    $recipientBCCMailId = implode(',',$recipientBCCMailId);
                }
                else{
                    $recipientBCCMailId = $recipientBCCMailId[0];
                }
            }

            /*** Mail Contents Starts ***/
                $subj = $subjectContent;
                $msg ="";

                /*Get the Mulitple Recipient BCC MailId*/
                if(count($recipientMailId)>1){
                    $recipientMailId = implode(',',$recipientMailId);
                    $msg .="Dear, <b>All</b>\r <br>";
                }
                else{
                    $recipientMailId = $recipientMailId[0];
                    $msg .="Dear, <b>".ucwords($user_name)."</b> \r <br>";
                }
                $msg .=$messageContent."\r <br><br>";
                $msg .="Thank you"."\r\n\n <br>";
                $msg .=$senderName."\r\n\n <br><br>";

                $headers ="";

                /** Get the Mulitple Attachment files and Attachment Process Starts **/
                if(isset($attachmentFiles)){
                    $headers .= "From: ".$senderMailId."\r\n";
                    $headers .= "Cc: ".$recipientCCMailId."\r\n";
                    $headers .= "Bcc: ".$recipientBCCMailId."\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
                    $msg .= "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
                    "Content-Transfer-Encoding: 7bit\n\n" . $msg . "\n\n";

                    // preparing attachments
                    for($i=0;$i<count($attachmentFiles);$i++)
                    {
                        if(is_file($attachmentFiles[$i]))
                        { 
                            $msg .= "--{$mime_boundary}\n";
                            $fp     = @fopen($attachmentFiles[$i],"rb");
                            $data   = @fread($fp,filesize($attachmentFiles[$i]));
                                      @fclose($fp);
                            $data   = chunk_split(base64_encode($data));
                            $msg .= "Content-Type: application/octet-stream; name=\"".basename($attachmentFiles[$i])."\"\n" .
                            "Content-Description: ".basename($attachmentFiles[$i])."\n" .
                            "Content-Disposition: attachment;\n" . " filename=\"".basename($attachmentFiles[$i])."\"; size=".filesize($attachmentFiles[$i]).";\n" .
                            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
                        }
                     }
                    $msg .= "--{$mime_boundary}--";
                }
                /** Attachment Process Ends **/
                else{
                    $headers .= "MIME-Version: 1.0" . "\r\n";
                    $headers .= "Content-type:text/html;charset=utf-8" . "\r\n";
                    //$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
                    $headers .= "From: ".$senderMailId."\r\n";
                    $headers .= "Cc: ".$recipientCCMailId."\r\n";
                    $headers .= "Bcc: ".$recipientBCCMailId."\r\n";
                }
            /*** Mail Contents Ends ***/    
            $sent_mail=mail($recipientMailId,$subj,$msg,$headers); 
            if($sent_mail)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception $e)
        {
            getConnection('close');
            echo "Caught Exception:",$e->getMessage();
        } 
    }
MKV
  • 913
  • 7
  • 6
0

i was facing the same issue. The problem is with mime boundary. Don't add "--".$uid."--"; after every attachment. Adding boundary before content type of attachment is enough.