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

分享于 

4分钟阅读

Web开发

  繁體
  • 下载源-4.6 KB
  • 演示项目
  • 下载最新源-16 Kb
  • mail对象

    发送邮件的语法为: sendMail($to, $from, $subject, $content, $files = '', $cc = '', $bcc = '') 或者sendMailParms($parms),其中$parms可以包含所有预期参数:

    <?php// 30/12/2016include '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: (内容编号)告诉脚本filename图像嵌入在邮件中。

    <table><tr><td>Condor Informatique - Turin<td><ahref='www.condorinformatique.com'target='_blank'><imgtitle='Condor Informatique - Turin'src='cid:images/condor.gif'></a><tr><td>Sermig - Turin<td><ahref='www.sermig.org'target='_blank'><br><imgtitle='Sermig - ReTe'src='cid:images/sermig.jpg'></a><tr><td><imgsrc=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]

    publicstatic 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']


    PHP  发送  ATT  mail  附件  attachments