在 PHP 中发送带附件的邮件

Send mail with attachment in PHP

这是我发送带附件的电子邮件的代码:

if (isset($_POST['submit'])) {

@$name=stripslashes($_POST['name']);
@$last_name=stripslashes($_POST['last_name']);
@$phone=stripslashes($_POST['phone']);
@$address=stripslashes($_POST['address']);
@$email=stripslashes($_POST['email']);
@$age=stripslashes($_POST['age']);
@$education=stripslashes($_POST['education']);
@$position=stripslashes($_POST['position']);
@$s_date=stripslashes($_POST['s_date']);
@$message=stripslashes($_POST['message']);





@$attachment=$_FILES['attachment']['name'];
$to="m.khaleghi@mitoconnect.com"; 
$subject="Job Application";
$max_file_size = 1000; 
$formats = array('pdf','docx'); 


if ( empty($name)  ){   

        sw_alert('warning','Please Fill All Fields'); 

}

$hash = md5(uniqid(time()));
$header = "";  

$header .= "MIME-Version: 1.0\n";  
$header .= "Content-Type: multipart/mixed; boundary=\"".$hash."\"\n\n";  
$header .= "This is a multi-part message in MIME format.\n";  

$header .= "--".$hash."\n";  
$header .= "Content-type: text/html; charset=utf-8\n";  
$header .= "Content-Transfer-Encoding: 7bit\n\n";  


$header .= "$name.\n"; 
$header .= "$last_name.\n";
$header .= "$phone.\n"; 
$header .= "$address.\n";
$header .= "$email.\n"; 
$header .= "$age.\n";
$header .= "$education.\n";
$header .= "$position.\n"; 
$header .= "$s_date.\n"; 
$header .= "$message.\n"; 



if (!empty ($attachment)) { 
$tmp_name = $_FILES['attachment']['tmp_name'];
$type = $_FILES['attachment']['type'];
$file_name = $_FILES['attachment']['name'];
$file_size = $_FILES['attachment']['size']/1024;

if ($file_size>$max_file_size) {


sw_alert('warning','File size is too large'); 
die("<meta http-equiv=\"content-Type\" content=\"text/html; charset=utf-8\">
<meta http-equiv='refresh' content='2;url=".$_SERVER['HTTP_REFERER']."' />
 ");

   }


@$ext = end(explode('.',$file_name));
if(!in_array($ext,$formats)){


sw_alert('warning','File type is not allowed'); 

die("<meta http-equiv=\"content-Type\" content=\"text/html; charset=utf-8\">
<meta http-equiv='refresh' content='2;url=".$_SERVER['HTTP_REFERER']."' />
 ");

}


$content = chunk_split(base64_encode(file_get_contents($tmp_name)));  
$header .= "--".$hash."\n";  
$header .= "Content-Type: application/octet-stream; 
name=\"".$file_name."\"\n";  
$header .= "Content-Transfer-Encoding: base64\n";  
$header .= "Content-Disposition: attachment; 
filename=\"".$file_name."\"\n\n";  
$header .= $content."\n\n";  
}  

$sendemail = @mail($to,$subject,null,$header); 

if($sendemail)  
{  
sw_alert('success','Your application has been sent'); 
}  
else  
{  
sw_alert('warning','Something Wrong , Please try again'); 
}  


}

一切就绪,运行良好,但另一端出现问题!当我收到电子邮件时,所有信息都显示在 1 行中:

姓名last_namephone地址电子邮件年龄教育职位start_date消息

但我希望他们是这样的:

名字
last_name
phone
地址
电子邮件
年龄
教育
位置
start_date
留言

我试过使用“\n”和“\r\n”的不同方法,但没有用。所以有人有解决方案吗?

"I have tried different ways of using "\n" 和 "\r\n" 但它没有用。所以有人有解决方案吗?"

那是因为您希望以 HTML 的形式发送电子邮件。

$header .= "Content-type: text/html; charset=utf-8\n";

您需要使用 <br> 换行。

旁注:

我注意到你对 $_SERVER['HTTP_REFERER'] 的使用。这并不总是可靠的。

阅读有关该主题的以下内容:

使用 <br> 而不是 \n 因为您的内容类型是 text/html

HTML 折叠白色 space(即换行符),但您可以更改为 plain-text 消息(保留白色 space),如下所示:

$header .= "Content-type: text/plain; charset=utf-8\n";  

显然,您以该格式放置的任何 HTML 标签都不会以这种格式呈现。

顺便说一下,您的代码可能容易受到 header 注入攻击,而且您没有安全地处理上传。请参阅有关安全处理文件上传的 PHP 文档,或使用为您处理所有这些情况的库,例如您标记此问题的 PHPMailer