We're a community of 1.1M IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,080,688 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Start New Discussion Reply to this Discussion

send email with attachment

I need to create a very simple script with php. Just a simple form with an input field for the users name and another for the users email address. They click submit, and the script sends an email to that address, while attaching a PDF file that I specify in the script.

I've found many scripts out there that encompassed the user attaching a file and submitting but not the opposite where the user just gives their name & desired email address and the email & attachment is sent to them.

As a bonus I was hoping to either (A) have the script log the users name & email and email it to me or (B) blanket carbon copy me on the email it sends out to the user so I can capture the users information.

Thank you in advance!

5
Contributors
10
Replies
2 Days
Discussion Span
1 Year Ago
Last Updated
11
Views
briandapice
Newbie Poster
3 posts since Nov 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

Is your simple mail working on server.

urtrivedi
Posting Virtuoso
1,724 posts since Dec 2008
Reputation Points: 299
Solved Threads: 366
Skill Endorsements: 24

I am not sure what you mean. When I referenced "simple" I meant a less complex method. But either way, everything I have been able to find only had the user filling out the form and including an attachment where what I want to do is have the user fill in the form with their email and have the script send them the email with an attachment.

briandapice
Newbie Poster
3 posts since Nov 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

well, wouldn't it be the same except you just hardcode the file path on your server.
$attachment = chunk_split(base64_encode(file_get_contents('attachment/attachment.pdf')));
I knew I saw this some where.
http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

this explains how to send an automated email, a little mod and you should be good.

moneeshot
Light Poster
33 posts since Nov 2011
Reputation Points: 10
Solved Threads: 5
Skill Endorsements: 0

oh, and you can cc yourself but I don't recommend that.
you can send mail to more then one person so first send the user an email check for errors and if its good then send it to yourself.
I would save the data to a DB then access the data in the back-end, build yourself a nice archive.

moneeshot
Light Poster
33 posts since Nov 2011
Reputation Points: 10
Solved Threads: 5
Skill Endorsements: 0
skraps
Light Poster
Banned
42 posts since Nov 2011
Reputation Points: 1
Solved Threads: 3
Skill Endorsements: 0

I appreciate the responses so far but the first script doesn't have a user key in their name & email address so the script can respond with the email & attachment.

The second script (being over 1000+ lines) is hardly "simple" to interpret. I was looking for something similar to what else I have seen out there, just user form > script response versus user form with file > script to me with a file attachment.

briandapice
Newbie Poster
3 posts since Nov 2011
Reputation Points: 10
Solved Threads: 0
Skill Endorsements: 0

The script I posted is a framework for sending email. If you want to respond with the script also. You need to create a script that save the users message into a database, the another that will populate the data based on the first scripts input and pass it to geekmail. It's relatively simple, but a process. A little html, php and mysql you can have exactly what you want.

skraps
Light Poster
Banned
42 posts since Nov 2011
Reputation Points: 1
Solved Threads: 3
Skill Endorsements: 0

not exactly sure what you mean? the script I sent:
http://www.webcheatsheet.com/PHP/sen...php#attachment
is a fairly simple tutorial on sending a file attachment but the script has some issues which are addressed in the comments section.
the script none the less is a good start: "the first script doesn't have a user key in their name & email address".
this is whats throwing me off, are you talking about the user info from the form? I hope not. Anyway I can whip up a function or maybe use the one at the bottom of that page with an example of how it works, if it will help. it won't be done until this weekend though. are you new to php or just the idea of sending attachments? it sounds like you need the form and script for sending the email, is that correct?

moneeshot
Light Poster
33 posts since Nov 2011
Reputation Points: 10
Solved Threads: 5
Skill Endorsements: 0

try this, its a nice class from kavoir.com
the test file shows its usage.

Attachments emailClass.php (5.2KB) test.php (1.05KB)
moneeshot
Light Poster
33 posts since Nov 2011
Reputation Points: 10
Solved Threads: 5
Skill Endorsements: 0

Here's my two cents

php mailer is pretty good for sending mail with attachments and other cool stuff


http://phpmailer.worxware.com/index.php?pg=phpmailer

Additionally, here's something I wrote as a wrapper class of the mail function to add attachments

<?php

class xmail{
    
    protected $body = array(
        'doctype'   =>  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
        'html'      =>  '<html xmlns="http://www.w3.org/1999/xhtml">',
        'meta'      =>  array(
            '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
        ),
        'reset'     =>  true,
        'styles'    =>  null,
        'title'     =>  '',
        'content'   =>  ''
    );
    
    protected $config = array();
    
    protected $attachment = array();
    
    protected $boundaryHash = '';
    
    public $log = array();
    
    protected static $DEBUG = true;
    
    public function __construct( array $args = array() ){
        
        $defaults = array(
            'to'        =>  array(),
            'subject'   =>  'mail',
            'headers'   =>  array(
                'From'          =>  'admin@example.com',
                'Content-Type'  =>  'text/html; charset=iso-8859-1',
                'MIME-Version'  =>  '1.0',
                'Reply-To'      =>  'noreply',
                'X-Mailer'      =>  'PHP/'.phpversion(),
                'Cc'            =>  null,
                'Bcc'           =>  null
            ),
            'type'      =>  'plain',
            'allowHtml' =>  false
        );
        
        if( isset($args['headers']) ){
            $defaults['headers'] = array_merge( $defaults['headers'], $args['headers'] );
            unset($args['headers']);
        }
        
        $this->config = array_merge( $defaults, $args );
        
        $this->boundaryHash = md5(date('r', time()));
        
    }
    
    public function setContentType( $type, $charset = 'charset=iso-8859-1' ){
        $this->config[ 'headers' ][ 'Content-Type' ] = "$type; $charset";
    }
    
    public function addAttachment( $file ){
        
        $defaults = array(
            'path'      =>  '',
            'name'      =>  '',
            'encoding'  =>  'base64',
            'type'      =>  'application/octet-stream'
        );
        
        if( is_array($file) ){
            
            $file = array_merge($defaults, $file);
            
        }else{
            
            $defaults[ 'path' ] = dirname($file);
            
            $defaults[ 'name' ] = basename($file);
            
            $file = $defaults;
            
        }
        
        $fullFile = self::addDS( $file[ 'path' ], $file[ 'name' ] );
        
        if( file_exists( $fullFile ) && is_file( $fullFile ) ){
            
            $this->attachment[] = $file;
            
            //$this->config[ 'type' ] = 'attachment';
            
        }
        
    }
    
    public function setBody( $message, $key = 'content' ){
        
        if( is_array($message) ){
            $this->body = array_merge( $this->body, $message ); 
        }else{
            $this->body[ $key ] = $message;
        }
        
    }
    
    public function setCSS( array $styles ){
        
        //$style['styles'] = $styles;
        $this->body[ 'styles' ] = $styles;
        //$this->setBody{ $style };
    }
    
    public function addAddress( $address, $name = null ){
        //<user@example.com>, Another User <anotheruser@example.com>
        if( !is_null($name) ){
            $email = $name . ' <' . self::isValidEmail($address) . '>';
        }else{
            $email = '<'.self::isValidEmail($address).'>';
        }
        
        $this->config['to'][] = $email;
        
    }
    
    protected function buildBody(){
        
        if( $this->config['allowHtml'] === false ){
            return self::stripHtml($this->body['content']);
        }
        
        $reset = '';
        
        if( $this->body['reset'] === true ){
            
            $reset = "
                #outlook a{padding:0;}
                body{width:100% !important;} .ReadMsgBody{width:100%;} .ExternalClass{width:100%;}
                body{-webkit-text-size-adjust:none; -ms-text-size-adjust:none;}
                body{margin:0; padding:0;}
                img{height:auto; line-height:100%; outline:none; text-decoration:none;}
                #backgroundTable{height:100% !important; margin:0; padding:0; width:100% !important;}
                p{margin: 1em 0;}
                h1, h2, h3, h4, h5, h6{color: black !important; line-height: 100% !important;}
                h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {color: blue !important;}
                h1 a:active, h2 a:active,  h3 a:active, h4 a:active, h5 a:active, h6 a:active{color: red !important;}
                h1 a:visited, h2 a:visited,  h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited{
                    color: purple !important;
                }
                .yshortcuts, .yshortcuts a, .yshortcuts a:link,.yshortcuts a:visited,
                .yshortcuts a:hover, .yshortcuts a span{
                    text-decoration: none !important; border-bottom: none !important; background: none !important;
                }
                table td{
                    border-collapse:collapse;
                }
            ";
            
        }
        
        ob_start();
            
            ?>
            <?php echo $this->body['doctype']; ?>
            <?php echo $this->body['html']; ?>
                
                <?php
                    foreach($this->body['meta'] as $meta){
                        echo $meta . "\n";
                    }
                ?>
                <title><?php echo $this->body['title']; ?></title>
                <style type="text/css">
                <!--
                    <?php echo $reset ?>
                    <?php
                        if(!is_null($this->body['styles']))  :
                        foreach($this->body['styles'] as $selector => $styles)    :
                            
                            $style = $selector . '{';
                            
                            if(is_array($styles)){
                                $style .= implode('; ', $styles);
                            }else{
                                $style .= "$styles;";
                            }
                            
                            $style .= "}\n";
                            
                            echo $style;
                            
                        endforeach; endif;
                    ?>
                    
                -->
                </style>
                <body>
                    <?php echo $this->body['content']; ?>
                </body>
            </html>
                
            <?php
            
        return ob_get_clean();
    }
    
    protected function buildHeader(){
        
        $headers = $this->config[ 'headers' ];
        
        $header = sprintf("From: %s", $headers['From']);
        $header .= sprintf("\r\nReply-To: %s", $headers['Reply-To']);
        
        
        if( !is_null($headers['Cc']) ){
            $header .= sprintf("\r\nCc: %s", $headers['Cc']);
        }
        
        if( !is_null($headers['Bcc']) ){
            $header .= sprintf("\r\nCc: %s", $headers['Bcc']);
        }
        
        $header .= sprintf("\r\nX-Mailer: %s", $headers['X-Mailer']);
        $header .= sprintf("\r\nMIME-Version: %s", $headers['MIME-Version']);
        
        return $header;
        
    }
    
    public function send(){
        
        $header = $this->buildHeader();
        
        if( count($this->attachment) == 0 ){
            
            $header .= sprintf("\r\nContent-Type: %s", $this->config[ 'headers' ]['Content-Type']);
            
            $body = $this->buildBody();
            
            
        }else{
            
            $mime_boundary = "==Multipart_Boundary_x{".$this->boundaryHash."}x";
            
            //$alt_boundary = "==Multipart_Alt_x{".$this->boundaryHash."}x";
            
            $header .= "\r\nContent-Type: multipart/mixed;\n boundary=\"{$mime_boundary}\"";
            
            $body = "--{$mime_boundary}";
            
            //$body .= "\nContent-Type: multipart/alternative; boundary=\"{$alt_boundary}\"";
            //
            //$body .= "\n\n--{$alt_boundary}";
            
            $body .= "\nContent-Type: ".$this->config[ 'headers' ]['Content-Type'];
            
            $body .= "\nContent-Transfer-Encoding: 7bit";
            
            $body .= "\n\n".$this->buildBody()."\n";
            
            $body .= "\n".$this->buildAttachment()."\n";
            
        }
        
        //var_dump($header);
        //var_dump($body);
        
        //try{
            
            $mailStatus = mail(
                implode( ', ', $this->config['to'] ),
                $this->config['subject'],
                $body,
                $header
            );
            
        //}catch(Exception $e){
        //    
        //    if( self::$DEBUG ){
        //        $this->log[] = 'On mail send: ' . $e;
        //    }
        //    
        //}
        
        //var_dump($this->config);
        return $mailStatus;
        
    }
    
    protected function buildAttachment(){
        
        if( count($this->attachment) == 0 || !is_array($this->attachment) ){
            return false;
        }
        
        $ath = '';
        
        $mime_boundary = "==Multipart_Boundary_x{".$this->boundaryHash."}x";
        
        foreach( $this->attachment as $attachment ){
                
            $fileName = self::addDS( $attachment[ 'path' ], $attachment[ 'name' ] );
            
            $handle = fopen($fileName, "rb");
            
            $data = fread( $handle,filesize($fileName) );
            
            fclose($handle);
            
            //just base64 for now
            switch( $attachment['encoding'] ){
                case 'base64' :
                    $data = chunk_split(base64_encode($data));
                    break;
            }
            
            //$attachment['type']
            $ath .= "--{$mime_boundary}\n";
            
            $ath .= "Content-Type: {$attachment['type']}; name=\"{$attachment[ 'name' ]}\"\n";
            
            $ath .= "Content-Disposition: attachment;\n" . " filename=\"{$attachment[ 'name' ]}\"; size=".filesize($fileName).";\n";
            
            $ath .= "Content-Transfer-Encoding: {$attachment['encoding']}\n\n" . $data . "\n\n";
            
        }
        
        $ath .= "--{$mime_boundary}--";
        
        return $ath;
        
    }
    
    protected function stripHtml( $content ){
        
        
        return filter_var( $content, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH );
        
       
        
    }
    
    public static function isValidEmail( $email ){
        
        if( is_array( $email ) ){
            
            if( count($email) > 1 ){
                
                $newEmail = array();
                
                foreach( $email as $key => $address ){
                    $check = self::isValidEmail( $address );
                    
                    if( $check === false ){
                        return false;
                    }
                    
                    $newEmail[$key] = $check;
                }
                
                return $newEmail;
                
            }else{
                $email = isset($email[0])?$email[0]:reset($email);
            }
            
        }
        
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
            return false;
        }
        
        return filter_var($email, FILTER_SANITIZE_EMAIL);
        
    }
    
    public static function addDS( $path, $name ){
        return $path . DIRECTORY_SEPARATOR . $name;
    }
    
    public function setDebug( $bool = true ){
        
        self::$DEBUG = $bool;
        
    }
    
    public static function getMime( $key ){
        /****
        *   A list of mime types
        ****/
        $mime = array(
            'hqx'   =>  'application/mac-binhex40',
            'cpt'   =>  'application/mac-compactpro',
            'doc'   =>  'application/msword',
            'bin'   =>  'application/macbinary',
            'dms'   =>  'application/octet-stream',
            'lha'   =>  'application/octet-stream',
            'lzh'   =>  'application/octet-stream',
            'exe'   =>  'application/octet-stream',
            'class' =>  'application/octet-stream',
            'psd'   =>  'application/octet-stream',
            'so'    =>  'application/octet-stream',
            'sea'   =>  'application/octet-stream',
            'dll'   =>  'application/octet-stream',
            'oda'   =>  'application/oda',
            'pdf'   =>  'application/pdf',
            'ai'    =>  'application/postscript',
            'eps'   =>  'application/postscript',
            'ps'    =>  'application/postscript',
            'smi'   =>  'application/smil',
            'smil'  =>  'application/smil',
            'mif'   =>  'application/vnd.mif',
            'xls'   =>  'application/vnd.ms-excel',
            'ppt'   =>  'application/vnd.ms-powerpoint',
            'wbxml' =>  'application/vnd.wap.wbxml',
            'wmlc'  =>  'application/vnd.wap.wmlc',
            'dcr'   =>  'application/x-director',
            'dir'   =>  'application/x-director',
            'dxr'   =>  'application/x-director',
            'dvi'   =>  'application/x-dvi',
            'gtar'  =>  'application/x-gtar',
            'php'   =>  'application/x-httpd-php',
            'php4'  =>  'application/x-httpd-php',
            'php3'  =>  'application/x-httpd-php',
            'phtml' =>  'application/x-httpd-php',
            'phps'  =>  'application/x-httpd-php-source',
            'js'    =>  'application/x-javascript',
            'swf'   =>  'application/x-shockwave-flash',
            'sit'   =>  'application/x-stuffit',
            'tar'   =>  'application/x-tar',
            'tgz'   =>  'application/x-tar',
            'xhtml' =>  'application/xhtml+xml',
            'xht'   =>  'application/xhtml+xml',
            'zip'   =>  'application/zip',
            'mid'   =>  'audio/midi',
            'midi'  =>  'audio/midi',
            'mpga'  =>  'audio/mpeg',
            'mp2'   =>  'audio/mpeg',
            'mp3'   =>  'audio/mpeg',
            'aif'   =>  'audio/x-aiff',
            'aiff'  =>  'audio/x-aiff',
            'aifc'  =>  'audio/x-aiff',
            'ram'   =>  'audio/x-pn-realaudio',
            'rm'    =>  'audio/x-pn-realaudio',
            'rpm'   =>  'audio/x-pn-realaudio-plugin',
            'ra'    =>  'audio/x-realaudio',
            'rv'    =>  'video/vnd.rn-realvideo',
            'wav'   =>  'audio/x-wav',
            'bmp'   =>  'image/bmp',
            'gif'   =>  'image/gif',
            'jpeg'  =>  'image/jpeg',
            'jpg'   =>  'image/jpeg',
            'jpe'   =>  'image/jpeg',
            'png'   =>  'image/png',
            'tiff'  =>  'image/tiff',
            'tif'   =>  'image/tiff',
            'css'   =>  'text/css',
            'html'  =>  'text/html',
            'htm'   =>  'text/html',
            'shtml' =>  'text/html',
            'plain' =>  'text/plain',
            'txt'   =>  'text/plain',
            'text'  =>  'text/plain',
            'log'   =>  'text/plain',
            'rtx'   =>  'text/richtext',
            'rtf'   =>  'text/rtf',
            'xml'   =>  'text/xml',
            'xsl'   =>  'text/xml',
            'mpeg'  =>  'video/mpeg',
            'mpg'   =>  'video/mpeg',
            'mpe'   =>  'video/mpeg',
            'qt'    =>  'video/quicktime',
            'mov'   =>  'video/quicktime',
            'avi'   =>  'video/x-msvideo',
            'movie' =>  'video/x-sgi-movie',
            'doc'   =>  'application/msword',
            'word'  =>  'application/msword',
            'xl'    =>  'application/excel',
            'eml'   =>  'message/rfc822'
        );
        
        $key = strtolower( trim( $key ) );
        
        if( isset($mime[ $key ]) ){
            return $mime[ $key ];
        }
        
        if( self::$DEBUG ){
            $this->log[] = "Cannot find mime type [$key]";
        }
        
        return false;
        
    }
    
}

/*
ex usage:
$mail = new xmail(array(
            'headers'   =>  array('From'=>'who@ami.com'),
            'subject'   =>  'the subject',
            'allowHtml' =>  false
        ));
        
	$mail->setContentType(xmail::getMime('plain'));
	
        $mail->addAddress('to@example.com');
        
        $message = "
            Yep nope
        ";
	
        $mail->setBody($message);
        
	$mail->addAttachment('path/to/file');
	
	$mailStatus = $mail->send(); //returns mail
*/

?>

I would recommend using phpmailer instead since the class I wrote is still a work in progress.

qazplm114477
Junior Poster
193 posts since Apr 2010
Reputation Points: 24
Solved Threads: 40
Skill Endorsements: 0

This article has been dead for over three months: Start a new discussion instead

Post: Markdown Syntax: Formatting Help
 
You
View similar articles that have also been tagged:
 
© 2013 DaniWeb® LLC
Page generated in 0.3236 seconds using 2.86MB