使用PHP将文件附加到电子邮件

时间:2012-12-28 18:58:16

标签: php wamp

我有一个应该将文件附加到外发电子邮件的功能。由于某种原因,它只发送空白文件。

有人可以帮忙吗?我已经验证文件本身是正确上传的,并且位于此功能工作所需的确切位置。仅允许.pdf,.doc和.docx

此外,这是在Windows Server上...(我知道,我知道...... YUCK!)

这是功能:

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;
    }
}

以下是使用此代码的代码:

//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";
    }
}

请原谅...我刚刚继承了这段代码(即:#1 7岁,#2现在他们希望能够将文件附加到此电子邮件中)

2 个答案:

答案 0 :(得分:7)

开始使用Swiftmailerdocumentation)或PhpMailer,您的生活会更轻松......

Swiftmailer示例:

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示例:

$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!";
}

我更喜欢Swiftmailer,但你选择了你最好的选择; - )

答案 1 :(得分:0)

我改变了我的功能,这有效:

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);
}

(不需要第三方包括)