65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2017年3月14日

CPOL

3分钟阅读

viewsIcon

52278

downloadIcon

1062

一个用于发送带附件的 HTML 邮件的 PHP 对象

引言

在 Android 应用程序的开发中,我需要将数据发送到 Internet 应用程序,可能带有图片附件。 使用 PHP mail 函数发送简单的邮件或 HTML 邮件很容易;同样的函数可以接受带有嵌入文件(s)的消息,因此需要用户通过适当的 headers 和编码来准备数据。

在 WEB 上找到的一些示例无法工作或不够通用之后,我找到了一个脚本(感谢 Antoine Bonnefoy),它不仅可以发送文件附件,还可以嵌入图像:这个脚本成为了创建本文 PHP 类对象的起点。

Mail 对象

mail 对象是一个 PHP 类,包含两个发送邮件的函数:sendMailsendMailParms;第二个只是第一个的包装器,允许在数组 key=> value 中写入参数,参数不区分大小写(且顺序无关)。

发送邮件的语法是:sendMail($to, $from, $subject, $content, $files = '', $cc = '', $bcc = '')sendMailParms($parms),其中 $parms 可以包含从零到所有期望的参数

注意
MailTo 收件人
主题 邮件主题
Message 消息,可能为 HTML 格式,带有图像(见下文)
发件人
文件 要附加的文件(见下文)
抄送 (Cc) 抄送收件人
密送 (Bcc) 密送收件人

例如,像这样的一段代码,从包含名为 MessageMailTo 的字段以及可能已上传文件的表单中接收数据

<?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]

  1. 文件名
  2. 文件名数组
  3. 通过 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 格式的邮件和上传文件(大小限制)。

注释

  1. ^这是 PHP 函数多态的一个例子。
  2. ^代替已弃用的 mime_content_type 函数和 Fileinfo 函数,后者位于库中,默认情况下不在 PHP 中。
  3. ^该表单由我的 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,&#x2718;,40,,Cancel Form;
    B,fg_Reset,&#x21B6;,40;
    B,Start,&#x270E;,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 日:初始版本
© . All rights reserved.