我有一个应该将文件附加到外发电子邮件的功能。由于某种原因,它只发送空白文件。
有人可以帮忙吗?我已经验证文件本身是正确上传的,并且位于此功能工作所需的确切位置。仅允许.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现在他们希望能够将文件附加到此电子邮件中)
答案 0 :(得分:7)
开始使用Swiftmailer(documentation)或PhpMailer,您的生活会更轻松......
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);
$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);
}
(不需要第三方包括)