用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发送带有附件的电子邮件,只显示字符没有附加文件的主要内容,如果未能解决你的问题,请参考以下文章