Php 尽管在标头中发送了base64,但无法识别附件
我在php邮件中发送附件时遇到问题。问题是,电子邮件看起来是发送和接收的,但没有被识别为附件。如果我进入邮件的来源,我可以看到它正在发送base64,并且包含了它应该包含的附件名称,所以我很困惑为什么客户端无法识别它。有什么想法吗Php 尽管在标头中发送了base64,但无法识别附件,php,email,mime,Php,Email,Mime,我在php邮件中发送附件时遇到问题。问题是,电子邮件看起来是发送和接收的,但没有被识别为附件。如果我进入邮件的来源,我可以看到它正在发送base64,并且包含了它应该包含的附件名称,所以我很困惑为什么客户端无法识别它。有什么想法吗 $uid = md5(uniqid(time())); $headers = "From: ".$from_name." <".$mailto.">\n"; $headers .= "Reply-To: ".$from_mail."\n"; $header
$uid = md5(uniqid(time()));
$headers = "From: ".$from_name." <".$mailto.">\n";
$headers .= "Reply-To: ".$from_mail."\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n";
$headers .= "This is a multi-part message in MIME format.\n";
$headers .= "--".$uid."\n";
$headers .= "Content-type:text/plain\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$headers .= $message."\n";
foreach ($_FILES as $file) {
$name = $file['name'];
$handle = fopen($file['tmp_name'], "r");
$content = fread($handle, $file['size']);
fclose($handle);
$content = chunk_split(base64_encode($content));
$headers .= "--{$uid}\n";
$headers .= "Content-Type: {$file['type']}; name=\"{$name}\"\n";
$headers .= "Content-Transfer-Encoding: base64\n";
$headers .= "Content-Disposition: attachment; filename=\"{$name}\"\n";
$headers .= $content;
}
$headers .= "--{$uid}--";
$mailto = 'myemail@email.com';
return mail($mailto, $subject, $message, $headers, '-f' . $mailto);
$uid=md5(uniqid(time());
$headers=“From:”.$From\u name.\n”;
$headers.=“回复:”.$from_mail.\n”;
$headers.=“MIME版本:1.0\n”;
$headers.=“内容类型:多部分/混合;边界=\”.$uid.\“\n”;
$headers.=“这是MIME格式的多部分邮件。\n”;
$headers.=“-”$uid.\n”;
$headers.=“内容类型:文本/普通\n”;
$headers.=“内容传输编码:8位\n”;
$headers.=$message.“\n”;
foreach($\u文件为$file){
$name=$file['name'];
$handle=fopen($file['tmp_name'],“r”);
$content=fread($handle,$file['size']);
fclose($handle);
$content=chunk_split(base64_encode($content));
$headers.=“--{$uid}\n”;
$headers.=“内容类型:{$file['Type']};名称=\”{$name}\“\n”;
$headers.=“内容传输编码:base64\n”;
$headers.=“内容处置:附件;文件名=\”{$name}\“\n”;
$headers.=$content;
}
$headers.=“--{$uid}--”;
$mailto=myemail@email.com';
返回邮件($mailto,$subject,$message,$headers,'-f'.$mailto);
问题
您的代码有很多错误:
- 电子邮件头必须由
终止。您只有CRLF
LF
- B64编码的文件和消息被添加到标题中。它们应该作为消息体发送
- 在每个部分的消息头和消息正文之间必须有一个额外的
CRLF
- 身体部位必须用以
开头的分隔符分隔CRLF
CRLF
。(BNF语法,有点简化。)
多部分正文:=[前导码CRLF]
破折号边界CRLF
身体部位*封装
闭合分隔符
[CRLF结语]
破折号边界:=“--”边界
主体部分:=MIME部分标题[CRLF*八位字节]
封装:=分隔符
CRLF车身部件
分隔符:=CRLF破折号边界
关闭分隔符:=分隔符“-”
代码
您的代码可能如下所示:
$uid = md5(uniqid(time()));
$headers = "From: ".$from_name." <".$mailto.">\r\n";
$headers .= "Reply-To: ".$from_mail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n";
$body = "This is a multi-part message in MIME format.\n";
$body .= "--".$uid."\r\n";
$body .= "Content-type:text/plain\r\n";
$body .= "Content-Transfer-Encoding: 8bit\r\n";
$body .= "\r\n";
$body .= $message;
foreach ($_FILES as $file) {
$name = $file['name'];
$handle = fopen($file['tmp_name'], "r");
$content = fread($handle, $file['size']);
fclose($handle);
$content = chunk_split(base64_encode($content));
$body .= "\r\n--{$uid}\r\n";
$body .= "Content-Type: {$file['type']}; name=\"{$name}\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment; filename=\"{$name}\"\r\n";
$body .= "\r\n";
$body .= $content;
}
$body .= "\r\n--{$uid}--";
$mailto = 'myemail@email.example';
return mail($mailto, $subject, $body, $headers, '-f' . $mailto);
$uid=md5(uniqid(time());
$headers=“From:”.$From\u name.\r\n”;
$headers.=“回复:”.$from_mail.\r\n”;
$headers.=“MIME版本:1.0\r\n”;
$headers.=“内容类型:多部分/混合;边界=\”“.$uid.\”\r\n”;
$body=“这是MIME格式的多部分消息。\n”;
$body.=“-”$uid.\r\n”;
$body.=“内容类型:文本/普通\r\n”;
$body.=“内容传输编码:8位\r\n”;
$body.=“\r\n”;
$body.=$message;
foreach($\u文件为$file){
$name=$file['name'];
$handle=fopen($file['tmp_name'],“r”);
$content=fread($handle,$file['size']);
fclose($handle);
$content=chunk_split(base64_encode($content));
$body.=“\r\n--{$uid}\r\n”;
$body.=“内容类型:{$file['Type']};名称=\”{$name}\“\r\n”;
$body.=“内容传输编码:base64\r\n”;
$body.=“内容处置:附件;文件名=\”{$name}\“\r\n”;
$body.=“\r\n”;
$body.=$content;
}
$body.=“\r\n--{$uid}--”;
$mailto=myemail@email.example';
返回邮件($mailto,$subject,$body,$headers,'-f'.$mailto);
工具书类
\r\n
。不要使用mail
发送电子邮件,而是使用类似PHPMailer或Swift mail的邮件类。尝试在每个边界的开始和结束处放置PHP\u EOL
<代码>$headers.=“-->$uid}--”。PHP_EOL代码>
$uid = md5(uniqid(time()));
$headers = "From: ".$from_name." <".$mailto.">\r\n";
$headers .= "Reply-To: ".$from_mail."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n";
$body = "This is a multi-part message in MIME format.\n";
$body .= "--".$uid."\r\n";
$body .= "Content-type:text/plain\r\n";
$body .= "Content-Transfer-Encoding: 8bit\r\n";
$body .= "\r\n";
$body .= $message;
foreach ($_FILES as $file) {
$name = $file['name'];
$handle = fopen($file['tmp_name'], "r");
$content = fread($handle, $file['size']);
fclose($handle);
$content = chunk_split(base64_encode($content));
$body .= "\r\n--{$uid}\r\n";
$body .= "Content-Type: {$file['type']}; name=\"{$name}\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment; filename=\"{$name}\"\r\n";
$body .= "\r\n";
$body .= $content;
}
$body .= "\r\n--{$uid}--";
$mailto = 'myemail@email.example';
return mail($mailto, $subject, $body, $headers, '-f' . $mailto);