用PHP发送带有附件的电子邮件,只显示字符没有附加文件

Posted

技术标签:

【中文标题】用PHP发送带有附件的电子邮件,只显示字符没有附加文件【英文标题】:Sending email with attachments in PHP, only show characters no file attached 【发布时间】:2011-11-07 04:38:23 【问题描述】:

我的网页有这个问题,我需要通过电子邮件向某人发送文件,我遇到的问题是邮件到达时没有附件和很多奇怪的字符,我给你我的代码:

$boundary='Datos Adjuntos';
$boundary.=" ".md5(time());
//Cabeceras del email               

$headers ="From: Example <name@example.com>\r\n";
$headers .= "Reply-To: <name@example.com>\r\n";
//   $headers .="MIME-Version: 1.0\r\n";   
$headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";

$body="--". $boundary ."\n";
$body .= "Content-Type: text/html; charset=ISO-8859-1\r\n\n";

$archivo=file_get_contents($dir."/".$handle->file_dst_name);

$archivo=chunk_split(base64_encode($archivo));

//Escritura del archivo adjunto
$body .= $body .$ContenidoString. "--" .$boundary. "\n";
//Content-Type: application/msword; name=\"nombre_archivo\"\r\n
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .=  "Content-Disposition: attachment; filename=\"".$handle->file_dst_name."\"\r\n\n$archivo";

$body = $body . "--" . $boundary ."--";

Correo::Enviar("OPERACION","name@example.com", $body,$headers);

$ContentString是邮件的html,我使用upload类将文件上传到服务器然后发送,我给你留一段我收到的邮件: 这毕竟是电子邮件的 e## e 名称和 ## e 内容等所有其他内容。

--Datos Adjuntos 1c436ca78c5925e7096267f0eae3a7d3 Content-Transfer-Encoding: base64 Content-Disposition: attachment;文件名="9cbdf187_3251_42e5_aeaa_84df343a227d_4.pdf" JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxMTA4MTYxNTEyNDIt MDUnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLj3LZzaGFycCAxLjM

【问题讨论】:

当有大量经过试验和测试的代码可以成功完成您想要实现的目标时,您为什么要重新发明***?只需使用Zend_Mail 或类似组件,专注于解决您的独特问题,而不是那些已经解决了一遍又一遍的问题...... 您的邮件的text/html 部分中似乎没有任何HTML... 不,我没有放 HTML 【参考方案1】:

虽然您最好使用人们所说的预构建库,但如果由于某种原因您不能/不想这样做,您可以试试这个:

已编辑!!

// Make a MIME boundary
$boundary = 'Datos_Adjuntos_'.md5(time());

// Message headers
$headers  = "From: Example <name@example.com>\r\n";
$headers .= "Reply-To: <name@example.com>\r\n";
$headers .= "MIME-Version: 1.0\r\n";   
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\r\n";

// For email clients that don't understand MIME messages
$body = "This is a multi-part message in MIME format. If you can read this, something went wrong or your mail client doesn't understand MIME messages.";

// HTML content
$body .= "\r\n--$boundary\r\n";
$body .= "Content-Type: text/html; charset=\"ISO-8859-1\"\r\n\r\n";
$body .= $ContenidoString;

// Attachment
$body .= "\r\n--$boundary\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Type: application/msword\r\n";
$body .= "Content-Disposition: attachment; filename=\"$handle->file_dst_name\"\r\n\r\n";
$body .= chunk_split(base64_encode(file_get_contents("$dir/$handle->file_dst_name")));

// Finish the MIME message
$body .= "\r\n--$boundary--";

// (Presumably) send the email
Correo::Enviar("OPERACION","name@example.com",$body,$headers);

【讨论】:

我已经尝试过了,它可以工作,所以你能解释一下是什么问题吗,请理解你的错误,不要再犯了,谢谢 有两个主要问题:您的\r\n (CRLF) 序列是错误的 - 有些丢失了,有些在错误的地方,有些只是 \n (LF),您需要完整的 @ 987654324@。但还有这一行:$body .= $body .$ContenidoString. "--" .$boundary. "\n"; 将整个主体附加到自身上,而您想要的是 $body .= $ContenidoString. "\r\n--" .$boundary. "\r\n";$body = $body .$ContenidoString. "\r\n--" .$boundary. "\r\n";。如果您一次将代码排成一行(如上),则更容易发现这样的事情...... :-D 哦,非常感谢,问题是我在工作中使用了一个人的代码,我能再问你一件事,\r和\n是什么意思,因为我从来没有得到它 \r 是回车符 (CR),\n 是换行符或换行符 (LF),它们一起被称为CRLF。它们在不同平台上的含义不同 - 在 Mac 上,\r 是行终止字符序列,或行尾 (EOL)。在 Linux/Unix 上 \n 是 EOL,在 Windows 上 \r\n 是 EOL。在 MIME 消息中,消息行(标题、边界)用 CRLF 分隔。标题和内容之间应该有一个空行 - 这意味着最后一个标题后面应该有两个 CRLF,内容和边界之间应该有一个 CRLF。 非常感谢,我有点明白了,这有点混乱,但我认为那是因为我是从这个开始的【参考方案2】:

我的建议是使用 SwiftMailer http://swiftmailer.org/ 这个 php 包将为您节省大量时间,并使您的邮件发送变得更加轻松。 这是您的代码的样子:

require_once 'lib/swift_required.php';
$message = Swift_Message::newInstance()
->setSubject('Your subject')
->setFrom(array('john@doe.com' => 'John Doe'))
->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
->setBody('Here is the message itself')
->addPart('<q>Here is the message itself</q>', 'text/html')
->attach(Swift_Attachment::fromPath('my-document.pdf'))
;

你就完了! 试试看,我一直在用它

【讨论】:

以上是关于用PHP发送带有附件的电子邮件,只显示字符没有附加文件的主要内容,如果未能解决你的问题,请参考以下文章

在php中发送带有多个附件的电子邮件

如何使用带有附件的 PEAR Mail 包使用 PHP 发送电子邮件

剪纸中的附件

发送带有数据框的电子邮件作为附件

在 PHP 中,如何发送带有附件的 HTML 电子邮件?

PHP pdf 电子邮件附件,内容类型:多部分/混合,html 消息未显示