0

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
14
Views
5 Years
Discussion Span
Last Post by qazplm114477
0

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.

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.

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.

-1

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.

Edited by skraps: top needed to be spelled to

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?

0

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

Attachments
<?php

class AttachmentEmail {
	private $from = 'yours@email.com';
	private $from_name = 'Your Name';
	private $reply_to = 'yours@email.com';
	private $to = '';
	private $subject = '';
	private $message = '';
	private $attachment = '';
	private $attachment_filename = '';
        public  $sendersName;

	public function __construct($senderName, $to, $subject, $message, $attachment = '', $attachment_filename = '') {
		$this -> to = $to;
                $this -> sendersName = $senderName;
		$this -> subject = $subject;
		$this -> message = $message;
		$this -> attachment = $attachment;
		$this -> attachment_filename = $attachment_filename;
                $this -> check_file();
	}
        
        public function getMimeType($file) {
                $mimeTypes = array(
                "bin" => "application/octet-stream",
                "bmp" => "image/bmp",
                "dms" => "application/octet-stream",
                "doc" => "application/msword",
                "dot" => "application/msword",
                "gif" => "image/gif",
                "gtar" => "application/x-gtar",
                "gz" => "application/x-gzip",
                "jpe" => "image/jpeg",
                "jpeg" => "image/jpeg",
                "jpg" => "image/jpeg",
                "mid" => "audio/mid",
                "mny" => "application/x-msmoney",
                "mov" => "video/quicktime",
                "movie" => "video/x-sgi-movie",
                "mp2" => "video/mpeg",
                "mp3" => "audio/mpeg",
                "mpa" => "video/mpeg",
                "mpe" => "video/mpeg",
                "mpeg" => "video/mpeg",
                "mpg" => "video/mpeg",
                "pdf" => "application/pdf",
                "qt" => "video/quicktime",
                "tgz" => "application/x-compressed",
                "txt" => "text/plain",
                "vcf" => "text/x-vcard",
                "vrml" => "x-world/x-vrml",
                "wav" => "audio/x-wav",
                "xwd" => "image/x-xwindowdump",
                "z" => "application/x-compress",
                "zip" => "application/zip"
                );

                $pieces = explode('.', $file);                
                $fileExt = end($pieces);
                return $mimeTypes[$fileExt];
        }

	public function mail() {
		if (!empty($this -> attachment)) {
			$filename = empty($this -> attachment_filename) ? basename($this -> attachment) : $this -> attachment_filename ;
			$path = dirname($this -> attachment);
			$mailto = $this -> to;
			$from_mail = $this -> from;
			$from_name = $this -> from_name;
			$replyto = $this -> reply_to;
			$subject = $this -> subject;
			$message = $this -> message;

			$file = $path.'/'.$filename;
                        $mime_type = $this->getMimeType($file);
			$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);
			$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: ".$mime_type."; name=\"".$filename."\"\r\n";
			$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)) {
                                $this->admin_email();
				return true;
			} else {
				return false;
			}
		} else {
			$header = "From: ".($this -> from_name)." <".($this -> from).">\r\n";
			$header .= "Reply-To: ".($this -> reply_to)."\r\n";

			if (mail($this -> to, $this -> subject, $this -> message, $header)) {
                                $this->admin_email();
				return true;
			} else {
				return false;
			}
		}
	}
        //this makes sure the file exist and is the same as set in test.php
        private function check_file() {
            $checkFile = 'C:\xampp\htdocs\framework\image\Flash.pdf';
            
            if ($this->attachment == $checkFile) {
                if (is_file($this->attachment)) {
                    return true;
                }                
            }           
          return die('There was a problem with your request');  
        }
        
        private function admin_email() {
            $to = $this->from;
            $from = $this->to;
            $subject = "info from user form";
            $massege = "user name from form: " . $this->sendersName
                      . "\r\n" . "user email from form: " . $from;
            
            $header = "From: ".($this->sendersName)." <".($from).">\r\n";
	    $header .= "Reply-To: ".($from)."\r\n";
            
            mail($to, $subject, $massege, $header);
          return true;
        }
}
?>
<?php

    //print realpath('test.php');
    require_once 'emailClass.php';

    //always clean you vars, you will have to do this yourself
    $name = $_POST['name'];
    $email = $_POST['email'];
    $nl = "\r\n";
    
    //the msg to the user
    $message = "G'day " . $name . $nl 
             . "check this attachment" . $nl 
             . "Reply to this email and I'll kill you!";
    //of course the subject
    $subject = 'the subject header';
    //path to file on server. realpath() may help. change path in the check_file() method
    $filePath = 'C:\xampp\htdocs\framework\image\Flash.pdf';

    if ((isset($name) && $name !== '') && (isset($email)&& $email !== '')) {
        $sendit = new AttachmentEmail($name, $email, $subject, $message, $filePath);
        $sendit -> mail();
    }
    
?>

<form name="contact" action="test.php" method="POST" enctype="multipart/form-data">
    
    name: <input type="text" name="name" /><br />
    email: <input type="text" name="email" /><br />
    <input type="submit" value="Submit Email" name="submit" />
    
</form>
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.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.