mail with file attachment

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • deepaks85
    New Member
    • Aug 2006
    • 114

    mail with file attachment

    Dear Sir,

    I have created a simple request form which will be mailed to me.

    Now I want to attach files and send it through that request form.

    For this I am using the following script:

    [PHP]<?php
    function mail_attachment ($from , $to, $subject, $message, $attachment){
    $fileatt = $attachment; // Path to the file
    $fileatt_type = "applicatio n/octet-stream"; // File Type
    $start= strrpos($attach ment, '/') == -1 ? strrpos($attach ment, '//') : strrpos($attach ment, '/')+1;
    $fileatt_name = substr($attachm ent, $start, strlen($attachm ent)); // Filename that will be used for the file as the attachment

    $email_from = $from; // Who the email is from
    $email_subject = $subject; // The Subject of the email

    $email_txt = $message; // Message that the email has in it

    $email_to = $to; // Who the email is to

    $headers = "From: ".$email_fr om;

    $file = fopen($fileatt, 'rb');
    $data = fread($file,fil esize($fileatt) );
    fclose($file);


    $semi_rand = md5(time());
    $mime_boundary = "==Multipart_Bo undary_x{$semi_ rand}x";

    $headers .= "\nMIME-Version: 1.0\n" .
    "Content-Type: multipart/mixed;\n" .
    " boundary=\"{$mi me_boundary}\"" ;



    $email_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" .
    $email_txt . "\n\n";

    $data = chunk_split(bas e64_encode($dat a));

    $email_message .= "--{$mime_boundary }\n" .
    "Content-Type: {$fileatt_type} ;\n" .
    " name=\"{$fileat t_name}\"\n" .
    //"Content-Disposition: attachment;\n" .
    //" filename=\"{$fi leatt_name}\"\n " .
    "Content-Transfer-Encoding: base64\n\n" .
    $data. "\n\n" .
    "--{$mime_boundary }--\n";


    $ok = @mail($email_to , $email_subject, $email_message, $headers);

    if($ok) { echo "yes";//header('Locatio n:newrequestsub mit_y.html');
    } else {
    header('Locatio n:newsubmit_n.h tml');
    }
    }

    ?>[/PHP]


    In the below coding I am calling the mail_attachment function.


    [PHP]<?
    include 'mail_attachmen t.php';

    if (!$_POST['newproject'])
    $errors[] = "Project name is required";
    else
    $newproject = $_POST['newproject'];
    // if there are any errors, display them
    if (count($errors) >0) {
    foreach($errors as $err)
    echo "$err<br>\n ";
    echo "<br>Please use your browser's Back button to fix.";
    } else {
    // no errors, so we build our message

    $to = "designhd@sitan et.com";
    $subject = "Your request";
    $from = stripslashes($_ POST['email']);

    $msg = "Sendor Information\n";
    $msg.= "\nName: ".$_POST['fname']." ".$_POST['lname'];
    $msg.= "\nOffice: ".$_POST['office'];
    $msg.= "\nEmail: ".$_POST['email'];
    $msg.= "\nExtn.: ".$_POST['extn'];

    $msg.= "\n\nProjec t name: ".$newproje ct;
    $msg.="\nMedia type: ".$_POST['media'];

    switch($_POST['project_type']){
    case 'web_banner':
    $proj_type = "Web Banner";
    break;
    case 'print_banner':
    $proj_type = "Print Banner";
    break;
    case 'flyer':
    $proj_type = "Flyer";
    break;
    case 'invitation':
    $proj_type = "Invitation ";
    break;
    case 'program':
    $proj_type = "Program";
    break;
    case 'other':
    $proj_type = $_POST['other'];
    break;
    default:
    $proj_type = " ";
    }


    $msg.="\nProjec t type: ".$proj_typ e;
    $msg.="\nSize: Height = ".$_POST['height']." ".$_POST['dimension'].", Width = ".$_POST['width']." ".$_POST['dimension'];
    $msg.="\nColor: ".$_POST['color'];

    switch($_POST['month']){
    case '1':
    $month = "January";
    break;
    case '2':
    $month = "February";
    break;
    case '3':
    $month = "March";
    break;
    case '4':
    $month = "April";
    break;
    case '5':
    $month = "May";
    break;
    case '6':
    $month = "June";
    break;
    case '7':
    $month = "July";
    break;
    case '8':
    $month = "August";
    break;
    case '9':
    $month = "September" ;
    break;
    case '10':
    $month = "October";
    break;
    case '11':
    $month = "November";
    break;
    case '12':
    $month = "December";
    break;
    default:
    $month = " ";
    }




    $msg.="\nDue date: ".$_POST['date']." ".$month.", ".$_POST['year'];
    $msg.="\nTime by: ".$_POST['hours']." Hrs ".$_POST['minutes']." Mins".$_POST['standard'];
    $msg.="\nDescri ption: ".stripslashes( $_POST['description'])."\n";
    $msg.="\nNumber of files: ".$_POST['files'];
    $msg.="\nQualit y/Resolution of files: ".$_POST['quality'];


    $pdf=($_POST['PDF'])?"PDF: Yes":"PDF: No";
    $jpg=($_POST['JPG'])?"JPG: Yes":"JPG: No";
    $gif=($_POST['GIF'])?"GIF: Yes":"GIF: No";
    $psd=($_POST['PSD'])?"PSD: Yes":"PSD: No";
    $others=($_POST['OTHERS'])?"OTHERS: Yes".$_POST['out_format']:"OTHERS: No";

    $msg.="\n\nOutp ut format:\n\n$pdf \n$jpg\n$gif\n$ psd\n$others\n" ;



    mail_attachment ($from, $to, $subject, $msg, 'mail_attachmen t.php');
    }
    ?>[/PHP]


    1. Now.....When I submit the form the attachment file comes to me with 'ail_attachment .php' as you can see in coding it is 'mail_attachmen t.php'.

    I can't understand why 'm' is cutting in the file name.

    2. And second the email text is coming to me in one line constantly. It means the '\n' (line break or next line) is not working. I don't know why?


    Appreciate if you can please help me.......I really really need your help.

    I need two things to be done:

    1. More than one file to be attach and sent.
    2. Proper email message should come.



    Thanks
    Deepak
  • ronverdonk
    Recognized Expert Specialist
    • Jul 2006
    • 4259

    #2
    These statements in your code cause the first char of the attachment name to be stripped off:
    [php]$start=strrpos( $attachment, '/') == -1 ? strrpos($attach ment, '//') : strrpos($attach ment, '/')+1;
    $fileatt_name = substr($attachm ent, $start, strlen($attachm ent)); [/php]

    The eol problem could be caused by the Windows system. The following sample (I always use it) is to set the $eol variable with the end-of-line string depending on the OS. Then use the $eol variable instead of hardcoding the "\n".
    [php]
    # Is the OS Windows or Mac or Linux
    if (strtoupper(sub str(PHP_OS,0,3) =='WIN')) {
    $eol="\r\n";
    } elseif (strtoupper(sub str(PHP_OS,0,3) =='MAC')) {
    $eol="\r";
    } else {
    $eol="\n";
    }[/php]

    Ronald :cool:

    Comment

    • deepaks85
      New Member
      • Aug 2006
      • 114

      #3
      Originally posted by ronverdonk
      These statements in your code cause the first char of the attachment name to be stripped off:
      [php]$start=strrpos( $attachment, '/') == -1 ? strrpos($attach ment, '//') : strrpos($attach ment, '/')+1;
      $fileatt_name = substr($attachm ent, $start, strlen($attachm ent)); [/php]

      The eol problem could be caused by the Windows system. The following sample (I always use it) is to set the $eol variable with the end-of-line string depending on the OS. Then use the $eol variable instead of hardcoding the "\n".
      [php]
      # Is the OS Windows or Mac or Linux
      if (strtoupper(sub str(PHP_OS,0,3) =='WIN')) {
      $eol="\r\n";
      } elseif (strtoupper(sub str(PHP_OS,0,3) =='MAC')) {
      $eol="\r";
      } else {
      $eol="\n";
      }[/php]

      Ronald :cool:

      I really appreciate your reply sir. But it is still not working for me......the email message is still in constantly one line...Below is the example


      [HTML]Sendor Information Name: Deepak Saxena Office: Onlineres Email: deepaks85@gmail .com Extn.: 18185748468 Project name: Syrian air project Media type: Web Project type: Print Banner Size: Height = 34 inch, Width = 34 inch Color: Limited colors Due date: 4 March, 2007 Time by: 5 Hrs 4 MinsIST Description: Please send to me. Number of files: 3 Quality/Resolution of files: High resolution Output format: PDF: Yes JPG: Yes GIF: No PSD: Yes OTHERS: No[/HTML]

      Comment

      • deepaks85
        New Member
        • Aug 2006
        • 114

        #4
        Originally posted by deepaks85
        I really appreciate your reply sir. But it is still not working for me......the email message is still in constantly one line...Below is the example


        [HTML]Sendor Information Name: Deepak Saxena Office: Onlineres Email: deepaks85@gmail .com Extn.: 18185748468 Project name: Syrian air project Media type: Web Project type: Print Banner Size: Height = 34 inch, Width = 34 inch Color: Limited colors Due date: 4 March, 2007 Time by: 5 Hrs 4 MinsIST Description: Please send to me. Number of files: 3 Quality/Resolution of files: High resolution Output format: PDF: Yes JPG: Yes GIF: No PSD: Yes OTHERS: No[/HTML]
        Here is the code again:



        [PHP]<?
        include 'mail_attachmen t.php';


        # Is the OS Windows or Mac or Linux

        if (strtoupper(sub str(PHP_OS,0,3) =='WIN')) {
        $eol="\r\n";
        } elseif (strtoupper(sub str(PHP_OS,0,3) =='MAC')) {
        $eol="\r";
        } else {
        $eol="\n";
        }




        if (!$_POST['newproject'])
        $errors[] = "Project name is required";
        else
        $newproject = $_POST['newproject'];
        // if there are any errors, display them
        if (count($errors) >0) {
        foreach($errors as $err)
        echo "$err<br>\n ";
        echo "<br>Please use your browser's Back button to fix.";
        } else {
        // no errors, so we build our message




        $to = "deepaks85@gmai l.com";
        $subject = "Your request";
        $from = stripslashes($_ POST['email']);

        $msg = "Sendor Information".$e ol;
        $msg.= $eol."Name: ".$_POST['fname']." ".$_POST['lname'];
        $msg.= $eol."Office: ".$_POST['office'];
        $msg.= $eol."Email: ".$_POST['email'];
        $msg.= $eol."Extn.: ".$_POST['extn'];

        $msg.= $eol."Project name: ".$newproje ct;
        $msg.=$eol."Med ia type: ".$_POST['media'];

        switch($_POST['project_type']){
        case 'web_banner':
        $proj_type = "Web Banner";
        break;
        case 'print_banner':
        $proj_type = "Print Banner";
        break;
        case 'flyer':
        $proj_type = "Flyer";
        break;
        case 'invitation':
        $proj_type = "Invitation ";
        break;
        case 'program':
        $proj_type = "Program";
        break;
        case 'other':
        $proj_type = $_POST['other'];
        break;
        default:
        $proj_type = " ";
        }


        $msg.=$eol."Pro ject type: ".$proj_typ e;
        $msg.=$eol."Siz e: Height = ".$_POST['height']." ".$_POST['dimension'].", Width = ".$_POST['width']." ".$_POST['dimension'];
        $msg.=$eol."Col or: ".$_POST['color'];

        switch($_POST['month']){
        case '1':
        $month = "January";
        break;
        case '2':
        $month = "February";
        break;
        case '3':
        $month = "March";
        break;
        case '4':
        $month = "April";
        break;
        case '5':
        $month = "May";
        break;
        case '6':
        $month = "June";
        break;
        case '7':
        $month = "July";
        break;
        case '8':
        $month = "August";
        break;
        case '9':
        $month = "September" ;
        break;
        case '10':
        $month = "October";
        break;
        case '11':
        $month = "November";
        break;
        case '12':
        $month = "December";
        break;
        default:
        $month = " ";
        }




        $msg.=$eol."Due date: ".$_POST['date']." ".$month.", ".$_POST['year'];
        $msg.=$eol."Tim e by: ".$_POST['hours']." Hrs ".$_POST['minutes']." Mins".$_POST['standard'];
        $msg.=$eol."Des cription: ".stripslashes( $_POST['description'])."\n";
        $msg.=$eol."Num ber of files: ".$_POST['files'];
        $msg.=$eol."Qua lity/Resolution of files: ".$_POST['quality'];



        $pdf=($_POST['PDF'])?"PDF: Yes":"PDF: No";
        $jpg=($_POST['JPG'])?"JPG: Yes":"JPG: No";
        $gif=($_POST['GIF'])?"GIF: Yes":"GIF: No";
        $psd=($_POST['PSD'])?"PSD: Yes":"PSD: No";
        $others=($_POST['OTHERS'])?"OTHERS: Yes".$_POST['out_format']:"OTHERS: No";

        $msg.=$eol."Out put format:\n\n$pdf \n$jpg\n$gif\n$ psd\n$others\n" ;

        mail_attachment ($from, $to, $subject, $msg, 'dhd.gif');
        }

        ?>[/PHP]

        Comment

        • ronverdonk
          Recognized Expert Specialist
          • Jul 2006
          • 4259

          #5
          I still do not know the cause but the following piece of your code (in the function) causes the eols to disappear. I commented it out and it emailed the correct formatted text with newlines. So you'll have to look inside this piece of code to pinpoint the error.

          [php]
          $semi_rand = md5(time());
          $mime_boundary = "==Multipart_Bo undary_x{$semi_ rand}x";

          $headers .= "\nMIME-Version: 1.0\n" .
          "Content-Type: multipart/mixed;\n" .
          " boundary=\"{$mi me_boundary}\"" ;

          $email_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" .
          $email_txt . "\n\n";

          $data = chunk_split(bas e64_encode($dat a));

          $email_message .= "--{$mime_boundary }\n" .
          "Content-Type: {$fileatt_type} ;\n" .
          " name=\"{$fileat t_name}\"\n" .
          //"Content-Disposition: attachment;\n" .
          //" filename=\"{$fi leatt_name}\"\n " .
          "Content-Transfer-Encoding: base64\n\n" .
          $data. "\n\n" .
          "--{$mime_boundary }--\n"; [/php]

          Ronald :cool:

          Comment

          • deepaks85
            New Member
            • Aug 2006
            • 114

            #6
            Originally posted by ronverdonk
            I still do not know the cause but the following piece of your code (in the function) causes the eols to disappear. I commented it out and it emailed the correct formatted text with newlines. So you'll have to look inside this piece of code to pinpoint the error.

            [php]
            $semi_rand = md5(time());
            $mime_boundary = "==Multipart_Bo undary_x{$semi_ rand}x";

            $headers .= "\nMIME-Version: 1.0\n" .
            "Content-Type: multipart/mixed;\n" .
            " boundary=\"{$mi me_boundary}\"" ;

            $email_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" .
            $email_txt . "\n\n";

            $data = chunk_split(bas e64_encode($dat a));

            $email_message .= "--{$mime_boundary }\n" .
            "Content-Type: {$fileatt_type} ;\n" .
            " name=\"{$fileat t_name}\"\n" .
            //"Content-Disposition: attachment;\n" .
            //" filename=\"{$fi leatt_name}\"\n " .
            "Content-Transfer-Encoding: base64\n\n" .
            $data. "\n\n" .
            "--{$mime_boundary }--\n"; [/php]
            Dear Sir,

            I found the error by searching on net.

            Below is the previous coding:

            [PHP]$email_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" .
            $email_txt . "\n\n"; [/PHP]

            Here you can see on line:

            [PHP] "Content-Type:text/html; charset=\"iso-8859-1\"\n" . [/PHP]

            We have to write:
            [PHP] "Content-Type:text/plain; charset=\"iso-8859-1\"\n" . [/PHP]
            instead of previous one.

            Thanks very much for your kind cooperation sir. The file name is also coming with the full name. Your assumtion were right.

            Now can you please help in that how can I attach and send more than one file?

            Comment

            • ronverdonk
              Recognized Expert Specialist
              • Jul 2006
              • 4259

              #7
              Attachments with the mail() function are complex but possible. You just have to have boundaries between the various sections of the e-mail. See this sample where 2 images are to be attached. Of course you'll have to adapt it to suit the files you want to attach:
              [php]// Add file attachment to the message (image attachment 1)
              // Base64 encode the file data first
              $data = chunk_split(bas e64_encode($dat a));
              $message .= "--{$mime_boundary }\n" .
              "Content-Type: {$fileatt_type} ;\n" . // {$fileatt_type}
              " name=\"{$fileat t_name}\"\n" .//attachment one
              "Content-Disposition: inline;\n" .
              " filename=\"{$fi leatt_name}\"\n " .
              "Content-Transfer-Encoding: base64\n\n" .
              $data . "\n\n" .
              "--{$mime_boundary }--\n";//end first attachment
              //*************** *************** *************** **************
              // Add file attachment to the message (image attachment 2)
              // Base64 encode the file datadata first
              $data2 = chunk_split(bas e64_encode($dat a2));
              $message .= "--{$mime_boundary }\n" .
              "Content-Type: {$fileatt_type2 };\n" . // {$fileatt_type}
              " name=\"{$fileat t_name2}\"\n" .//attachment 2
              "Content-Disposition: inline;\n" .
              " filename=\"{$fi leatt_name2}\"\ n" .
              "Content-Transfer-Encoding: base64\n\n" .
              $data2 . "\n\n" .
              "--{$mime_boundary }--\n";//end second attachment
              //*************** *************** *************** *************** [/php]

              Ronald :cool:

              Comment

              • deepaks85
                New Member
                • Aug 2006
                • 114

                #8
                mail with file attachment

                Originally posted by ronverdonk
                Attachments with the mail() function are complex but possible. You just have to have boundaries between the various sections of the e-mail. See this sample where 2 images are to be attached. Of course you'll have to adapt it to suit the files you want to attach:
                [php]// Add file attachment to the message (image attachment 1)
                // Base64 encode the file data first
                $data = chunk_split(bas e64_encode($dat a));
                $message .= "--{$mime_boundary }\n" .
                "Content-Type: {$fileatt_type} ;\n" . // {$fileatt_type}
                " name=\"{$fileat t_name}\"\n" .//attachment one
                "Content-Disposition: inline;\n" .
                " filename=\"{$fi leatt_name}\"\n " .
                "Content-Transfer-Encoding: base64\n\n" .
                $data . "\n\n" .
                "--{$mime_boundary }--\n";//end first attachment
                //*************** *************** *************** **************
                // Add file attachment to the message (image attachment 2)
                // Base64 encode the file datadata first
                $data2 = chunk_split(bas e64_encode($dat a2));
                $message .= "--{$mime_boundary }\n" .
                "Content-Type: {$fileatt_type2 };\n" . // {$fileatt_type}
                " name=\"{$fileat t_name2}\"\n" .//attachment 2
                "Content-Disposition: inline;\n" .
                " filename=\"{$fi leatt_name2}\"\ n" .
                "Content-Transfer-Encoding: base64\n\n" .
                $data2 . "\n\n" .
                "--{$mime_boundary }--\n";//end second attachment
                //*************** *************** *************** *************** [/php]
                Thanks very much for your kind cooperation sir. After reading the script it, I think if we want to send more than one file then we will have to write script again and again for each file.

                I have got a little script on the internet. Here is the link:


                Please check it and advice me. Can I do like they mentioned in the script.

                Can I have your personal email ID, if you can provide me?


                Thanks
                Deepak
                Last edited by deepaks85; Mar 15 '07, 07:07 PM. Reason: Add some more text

                Comment

                • dixonmd
                  New Member
                  • Oct 2007
                  • 1

                  #9
                  There is no need of 11 th line. ie the MIME boundary..... for sending multiple attachments.... .

                  Comment

                  • ronverdonk
                    Recognized Expert Specialist
                    • Jul 2006
                    • 4259

                    #10
                    Originally posted by dixonmd
                    There is no need of 11 th line. ie the MIME boundary..... for sending multiple attachments.... .
                    Agreed, but it makes the explanatory code better structured and more readable.

                    Ronald

                    Comment

                    Working...