使用 PHP 发送带附件的 HTML 邮件





5.00/5 (3投票s)
一个用于发送带附件的 HTML 邮件的 PHP 对象
引言
在 Android 应用程序的开发中,我需要将数据发送到 Internet 应用程序,可能带有图片附件。 使用 PHP mail
函数发送简单的邮件或 HTML 邮件很容易;同样的函数可以接受带有嵌入文件(s)的消息,因此需要用户通过适当的 headers 和编码来准备数据。
在 WEB 上找到的一些示例无法工作或不够通用之后,我找到了一个脚本(感谢 Antoine Bonnefoy),它不仅可以发送文件附件,还可以嵌入图像:这个脚本成为了创建本文 PHP 类对象的起点。
Mail 对象
mail 对象是一个 PHP 类,包含两个发送邮件的函数:sendMail
和 sendMailParms
;第二个只是第一个的包装器,允许在数组 key=> value
中写入参数,参数不区分大小写(且顺序无关)。
发送邮件的语法是:sendMail($to, $from, $subject, $content, $files = '', $cc = '', $bcc = '')
或 sendMailParms($parms)
,其中 $parms
可以包含从零到所有期望的参数
键 | 注意 |
MailTo | 收件人 |
主题 | 邮件主题 |
Message | 消息,可能为 HTML 格式,带有图像(见下文) |
从 | 发件人 |
文件 | 要附加的文件(见下文) |
抄送 (Cc) | 抄送收件人 |
密送 (Bcc) | 密送收件人 |
例如,像这样的一段代码,从包含名为 Message
、MailTo
的字段以及可能已上传文件的表单中接收数据
<?php
// 30/12/2016
include 'mailfile.php';
$msg = "";
foreach ($_REQUEST as $key => $value) $$key = $value;
$t = Array("N"=>"Text","H"=>"HTML","HI"=>"HTML with images");
$subject = $t[$type]." mail";
$parms = Array("subject"=>$subject,"mailto"=>$MailTo,
"message"=>$Message,"from"=>"sender@mailoffice.it","files"=>$_FILES);
echo mail::sendMailParms($parms);
?>
HTML 邮件和嵌入图像
如果消息包含 HTML 标签,则将其作为 HTML 消息发送。 对于嵌入图像,标签是 img
标签,其中 src
参数必须具有以下形式
src='cid:filename'
, cid:
(Content-ID) 告诉脚本 filename
图像嵌入在邮件中。
<table>
<tr><td>Condor Informatique - Turin
<td><a href='www.condorinformatique.com' target='_blank'>
<img title='Condor Informatique - Turin' src='cid:images/condor.gif'></a>
<tr><td>Sermig - Turin
<td><a href='www.sermig.org' target='_blank'>
<br><img title='Sermig - ReTe' src='cid:images/sermig.jpg'></a>
<tr><td><img src=cid:images/info.png>See you later alligator<br>El Condor
</table>
请注意,filename
必须包含用于读取图像的路径,但在邮件中,该路径会被脚本删除。
以下是用于查找消息中包含的图像的 PHP 代码片段。
preg_match_all("/(<img .*?>)/i", $content,$out, PREG_PATTERN_ORDER);
$aEmbedFiles = Array();
foreach($out[1] as $cidFile) {
$doc = new DOMDocument();
$doc->loadHTML($cidFile);
$imageTags = $doc->getElementsByTagName('img');
foreach($imageTags as $tag) {
$file = $tag->getAttribute('src');
if (strtolower(substr($file,0,4)) == "cid:") {
$file = substr($file,4);
$aEmbedFiles[basename($file)] = $file;
}
}
}
preg_match
查找所有 img
标签并将它们存储在 $out
数组中;我使用 DOM
函数的 DOMDocument
对象来提取属性 src
,因为它很难通过正则表达式提取。
只有带有 cid:
的图像的文件名存储在 $aEmbedFiles
数组中。
foreach($aEmbedFiles as $key => $value) {
$content = str_replace($value, $key,$content); // replace the path/file
// with file only
}
上面的代码片段将路径/文件名替换为仅文件名。
附加文件
可能存在的参数 Files
是要上传的文件列表;它可以有三种形式[1]
- 文件名
- 文件名数组
- 通过 HTTP
POST
上传的项目的关联数组(即,它可以是相同的关联数组$_FILES
)
在前两种情况下,函数 mimeType
根据文件名的后缀返回文件的 MIME
类型[2]
public static function mimeType($fl) {
$mimeTypes = Array(".doc"=> "application/msword",".jpg"=>"image/jpeg",
".gif"=>"image/gif",".zip"=>"application/zip",".pdf"=>"application/pdf");
$ext = strtolower(strrchr($fl, '.'));
return (isset($mimeTypes[$ext])) ? $mimeTypes[$ext] : "application/octet-stream";
}
对于第三种情况,上传的文件,mime 类型在:$_FILES[...]['type']
中声明。
使用演示
演示是一个简单的 HTML 页面,其中包含一个表单[3],用于发送可能为 HTML 格式的邮件和上传文件(大小限制)。
注释
- ^这是 PHP 函数多态的一个例子。
- ^代替已弃用的
mime_content_type
函数和Fileinfo
函数,后者位于库中,默认情况下不在 PHP 中。 - ^该表单由我的 JavaScript 表单生成器生成。 请参阅 CodeProject A JavaScript Form Generator,或访问我的 网站。
<div id='result'></div> <span id='form' style='visibility:hidden'> Form,frm,Test PHP HTML Mailer,echo.php,receiveData,reset; T,Message,,251; H,MAX_FILE_SIZE; File,Attachment,Attachment file,30,.gif,.jpg, .png; T,MailTo,Receiver mail address,25; R,type,Message type,60,N=Normal,H=HTML,HI=HTML with images; B,fg_Cancel,✘,40,,Cancel Form; B,fg_Reset,↶,40; B,Start,✎,40,,Go; Control,MailTo,Required,mail; Defaults,type=N,MAX_FILE_SIZE=5000,Message=See you later alligator\nEl Condor; </span> ... <script type='text/javascript'> formGen("result",$("form").innerHTML); ...
历史
- 2017 年 3 月 14 日:初始版本