Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尽管在标头中发送了base64,但无法识别附件_Php_Email_Mime - Fatal编程技术网

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

我在php邮件中发送附件时遇到问题。问题是,电子邮件看起来是发送和接收的,但没有被识别为附件。如果我进入邮件的来源,我可以看到它正在发送base64,并且包含了它应该包含的附件名称,所以我很困惑为什么客户端无法识别它。有什么想法吗

$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
    开头的分隔符分隔
电子邮件语法 根据RFC 2046,这是多部分消息体结构的摘录。请特别注意
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);