`
javaeyeren
  • 浏览: 124402 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PHP高级特性讨论之邮件相关

阅读更多

邮件发送和收取是目前网上交流最为重要的途径之一,我们当然很希望自己的PHP程序也能够实现某些商业网站注册程序中采用的方法,即通过邮件方式进行密码(或激活码)发送和资料确认。另一方面,这种方式也是一种反馈用户信息的有效途径。当然,要实现这些功能是离不开邮件服务器的,目前比较流行的Mail服务器(更准确的说是邮件传输代理MTA)有:sendmail、qmail、postfix。至于如何配置其中的pop、 smtp、imap等服务已经超出这篇文章的范围,读者可以参考其他这方面文章。那么好了,我们究竟可以利用PHP来作些什么呢?
  1. 简单邮件发送
  PHP函数库中有一个mail函数,可以用来进行简单的邮件发送,函数原型为:
  boolean mail(string $to, string $subject, string $message, string [$additional]);
  $to指定邮件寄送地址,$subject指定邮件标题,$message指定邮件内容,$additional指定邮件的附加头部,例如:
  
  
复制PHP内容到剪贴板
PHP代码:
  <?php
  mail( "ywg_263@263.net", "message from php", "hello, xiaoyz! " );
  ?>
  就可以向 ywg_263@263.net发送一个标题为“message from php” 内容为“hello, xiaoyz!”的邮件,其中的邮件接受人$to可以是多个邮件地址,也就是说可以同时给多个人发送同一份邮件,邮件地址之间用逗号分隔,示例如下:
  
  
复制PHP内容到剪贴板
PHP代码:
  <?php
  $emails = Array( "xiaoyz@birdy.dhs.org", "xiaoyz@hotmail.com" );
  mail( implode(",", $emails), "message from php", "hello, xiaoyz!" );
  ?>
  笔者做过的论坛程序中的注册部分就曾经使用过这种方法,不过最后还是采用了一种变通的形式,下文将会具体讲到。其中主要的需求是:当一个用户注册之后,必须得到组管理员的身份确认才能成为论坛的正式会员,我所采用的方法是:用户注册完成提交表单时,先把用户各种注册信息写入数据库,同时把用户的必要信息通过邮件的方式发送给用户所注册组的所有组管理员(如果没有组管理员的话,会给站管理员发送邮件,并告之该组没有组管理员),当然,读者可能会觉得如果有人恶意注册了很多id的话是否会在数据库中造成很多垃圾信息呢?这种考虑是必要的,所以我们需要给出一个策略,提供一个管理界面,来剔除掉这些垃圾,一种简单的方法就是对于超过了给定时期还没有成为正式会员的id一律删除,前提就是必须保证组管理员要在给定时期之内审批这些id,否则会造成误删。读者可以试试上面的代码能否工作,如果没有发送成功,请考虑重新配置邮件服务器的smtp服务。好了,按照上述形式发送的邮件将只是简单的文本形式,如果希望发送一个HTML形式的邮件,就需要知道如何发送MIME形式的邮件了。
  2. MIME邮件发送
  MIME(Multi-purpose Internet Mail Extensions,多用途Internet邮件扩展) 协议扩展了基于文本的Internet邮件系统,以便可以在消息体中包含二进制附件。MIME信息由正常的Internet文本邮件组成,在文本邮件中包含了一些信息头和格式化过的信息体(用ASCII 码子集表示的附件),这些MIME信息头给出了在邮件中表示附件的特定方法。
  刚才通过mail函数发送的邮件接受之后的MIME信息如下(其中的localhost
  (localhost[127.0.0.1])表示采用本机上的postfix提供的smtp服务,userid 48表示apache):
  [code]
  Received: from localhost (localhost [127.0.0.1])
  by mx01.263.net (Postfix) with SMTP id E7C8B1DC38A78
  for <ywg_263@263.net>; Sat, 8 Dec 2001 20:08:45 +0800 (CST)
  Received: by birdy.dhs.org (Postfix, from userid 48)
  id 706F3C4923A; Sun, 9 Dec 2001 03:52:26 +0800 (CST)
  T ywg_263@263.net
  Subject: message from php
  Message-Id: <20011208195226.706F3C4923A@birdy.dhs.org>
  Date: Sun, 9 Dec 2001 03:52:26 +0800 (CST)
  From: apache@birdy.dhs.org (Apache User)
  hello, xiaoyz!
  可以看出其中的Received、To、Subject、Message-ID、Date、From部分都是信息头(To、Subject信息头分别对应着mail函数中的$to、$subject),而“hello, xiaoyz!”是信息体,如果没有指定Content-Type信息头,则默认为“Content-Type: text/plain;Charset='us-ascii'”。既然如此,我们当然可以用这种方法来发送HTML形式的邮件了(注意:HTML也是文本格式的)!示例如下:
  
  
复制PHP内容到剪贴板
PHP代码:
  <?php
  $to = "ywg_sn@sina.com";
  $subject = "html message from php";
  $message = "<html><title>html message</title><body bgcolor=#cccccc>
  <h1><font color=red>hello, xiaoyz!</font></h1></body></html>";
  $additional = "From: [email=ywg_263@263.netnReply]ywg_263@263.netnReply[/email]-[email=Tywg_263@263.netn]Tywg_263@263.netn[/email]
  X-Mailer:PHPnX-Priority:2nContent-Type: text/html; charset="GB2312"n
  Content-Transfer-Encoding: 7bitnMIME-Version: 1.0";
  mail( $to, $subject, $message, $additional );
  ?>
  其中有几个新的信息头:From表示邮件来源地址,Reply-To表示邮件回复地址,X-Mailer表示邮件发送程序,X-Priority表示邮件优先级,Content-Transfer-Encoding表示编码方式。用Outlook Express接受此邮件,我们发现它确实是一封HTML邮件,查看各信息头(在Outlook Express中选择该邮件,点右键,查看“属性”中的“详细信息”),正如上面所述。至此,我们已经可以发送各种文本格式的MIME邮件了,那么又该如何发送各种二进制格式的MIME邮件呢?比如图片;同时又该如何发送具有混合格式的MIME邮件呢?比如HTML和图片,请看第三部分和第四部分。
  3. 二进制格式邮件发送
  一个JPG图片的MIME信息格式大致如下:
  
  
  T ywg_sn@sina.com
  Subject: jpg picture from xiaoyz
  Content-Type: image/jpg; name='picture.jpg'
  Content-Transfer-Encoding: base64
  Content-Descrīption: xiaoyz's picture
  From: 'xiaoyz' <ywg_263@263.net>
  ...这里是JPG图片的base64编码...
  其中,name表示附件的名称,Content-Descrīption表示附件的描述,一般显示为附件的标题。显然,我们必须把从表单提交的JPG图片文件进行base64编码,这个具体该如何实现呢?假定文件上传标签的名称为attach,即,则代码片断如下:
  
 
复制PHP内容到剪贴板
PHP代码:
 
  <?php
  $fp = fopen( $attach, "r" );
  $content = fread($fp, filesize($attach)); //读取文件内容
  $content = chunk_split( base64_encode($content) ); //进行base64编码,并在每76个字符后面加上rn
  ?>
  然后只要把HTML格式邮件发送示例中的$to, $subject, $additional信息头部分换成这里对应的信息头,并将其中的$message换成这里的$content,就可以发送JPG图片的附件了,事实上任何类型的文件皆可通过这种方式进行发送。现在我们来看混合格式即多部分信息邮件。
  4. 混合格式邮件发送
  一个带HTML格式附件的邮件的MIME信息大致如下:
  
  
  Return-Path: <ywg_263@263.net>
  Delivered-T ywg_sn@sina.com
  Received: (qmail 20639 invoked from network); 9 Dec 2001 08:04:25 -0000
  Received: from unknown (HELO smtp.263.net) (202.96.44.19)
  by 202.106.187.149 with SMTP; 9 Dec 2001 08:04:25 -0000
  Received: from localhost (localhost [127.0.0.1])
  by smtp.263.net (Postfix) with SMTP id B431D1DEBCAAA
  for <ywg_sn@sina.com>; Sun, 9 Dec 2001 16:08:44 +0800 (CST)
  Message-ID: <004f01c18089$938e83b0$a32869a2@xiaoyz>
  From: <ywg_263@263.net>
  T <ywg_sn@sina.com>
  Subject: multipart MIME
  Date: Sun, 9 Dec 2001 16:14:08 +0800
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary="----=_NextPart_000_0049_01C180CC.87D17760"
  X-Priority: 3
  This is a multi-part message in MIME format.
  ----=_NextPart_000_0049_01C180CC.87D17760
  Content-Type: text/plain; charset="gb2312"
  Content-Transfer-Encoding: 7bit
  Content-Disposition: inline
  
  
  hello, xiaoyz!
  ------=_NextPart_000_0049_01C180CC.87D17760
  Content-Type: text/html; name="index.html"
  Content-Transfer-Encoding: 7bit
  Content-Disposition: attachment; filename="index.html"
  <html>
  <title>html attachment</title>
  <body>
  hello, xiaoyz!
  </body>
  </html>
  ------=_NextPart_000_0049_01C180CC.87D17760--
  注意其中的Content-Type信息头,mulitipart/mixed表示这封邮件由多部分组成,boundary指定各部分之间的边界符为 “----=_NextPart_000_0049_01C180CC.87D17760”,我们看到确实存在着三个边界符将邮件分成了三部分:信息头部分,纯文本部分,HTML部分。Content-Disposition告诉邮件程序应该如何显示附件。如果Content-Disposition被设置为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个链接;如果设置为inline,则HTML文件的内容直接显示。一般情况下,如果附件是文本格式的(HTML也是文本格式的),Content-Disposition会被设为inline,否则Content- disposition设为attachment。好了,我想现在读者可能已经对邮件的各组成部分及其含义了然于胸了,现在就差如何用PHP来实现混合格式邮件的发送,当然,你可以用PHP来生成全部的信息,现在讨论表单发送的情形,代码如下:
  
  
复制PHP内容到剪贴板
PHP代码:

  <form name="frm_mail" action="<? print $PHP_SELF; ?>" enctype="multipart/form-data" method="post">
  from: <input type="text" name="from"><br>
  t <input type="text" name="to"><br>
  subject: <input type="text" name="subject"><br>
  attach: <input type="file" name="attach"><br>
  message: <textarea name="message"></textarea>
  <input type="submit" name="send" value="send">
  </from>
  
  
  <?php
  if( isset($send) )
  {
  //定义边界线
  $boundary = uniqid( "" );
  //生成邮件头
  $header = "From: $fromnContent-type: multipart/mixed;boundary="$boundary"nX-Mailer:PHPnX-Priority:3";
  //获取上传文件的MIME类型
  if( $attach_type )
  $mimetype = $attach_type;
  else
  $mimetype = "application/unknown";
  //获取上传文件的名字
  $filename = $attach_name;
  $filename = $attach_name;
  //对上传文件进行编码和切分
  $fp = fopen($attach, "r");
  $content = fread($fp, filesize($content));
  $content = chunk_split( base64_encode($content) );
  //生成邮件主体
  $body ="
  --$boundary
  Content-type: text/plain; charset=iso-8859-1
  Content-transfer-encoding: 8bit
  $message
  --$boundary
  Content-Type: $mimeType; name=$filename
  Content-Disposition: attachment; filename=$filename
  Content-Transfer-Encoding: base64
  $content
  --$boundary--";
  mail( $to, $subject, $body, $header );
  }
  ?>

  首先通过uniqueid函数得到惟一的边界符,然后得到上传文件的MIME类型,再对上传文件进行base64编码和切分,最后进行组合,得到 mail函数中的$body和$header,并调用mail函数。到现在为止,我丝毫不怀疑您可以作出一个非常漂亮有声有色的注册验证程序了。最后,笔者将来谈谈身份验证中对邮件方式的一种替代方案,其实也很简单,就是使用数据库来保存用户的各种申请通知。具体地说,每当有一个用户填写完注册表单并发送之后,除了在数据库中记录用户的注册信息,同时要在数据库中产生一个申请通知,比如:有一个用户abc申请加入group1组,而通过数据库查询得知 group1组有两个组管理员admin1和admin2,就需要在数据库中加入两条记录,fromwho字段为abc,towho字段分别admin1 和admin2,readed字段为0,表示组管理员还没有查看这个通知。当组管理员登录之后,会对申请通知进行检索,发现存在没有查看的通知,会弹出一个窗口界面供管理员进行审批。管理员通过该申请,则将abc的权限更新为正式会员;拒绝该申请,则将abc的申请通知和用户记录删除。好了,就此打住,请继续关注PHP高级特性讨论系列。

分享到:
评论

相关推荐

    PHP高级特性讨论之邮件相关.pdf

    PHP高级特性讨论之邮件相关.pdf

    《PHP高级编程》PDF]

    本书介绍PHP的基本知识与高级特性,指导读者从入门到精通掌握PHP技术。 内容包括PHP的变量、函数、语句、表达式,PHP对文件的处理,PHP的模块,如MySQL、XML、LDAP、GD,用PHP发送电子邮件,PHP的安全特性等。本书还...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    然而,讲述php高级特性的资料一直缺乏,大大影响了php语言的深入应用。 本书填补了这一空白。它专门针对有一定经验的php程序员,详细讲解了对他们最为重要的主题:高级面向对象、设计模式、文档、测试和标准php库等...

    PHP高级程序设计-模式-框架-测试

    详细描述:内容简介本书采用循序渐进的方式介绍了用PHP 进行Web 开发的相关知识。书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容...

    用PHP发送邮件相关文件

    这是一个包含用PHP发送第三邮件的PHP类文件和发送邮件的模板PHP文件。希望能对希望利用第三方邮件服务器发送邮件的朋友有所帮助。

    10.PHP高级特性生成器 - 01.mp4

    10.PHP高级特性生成器 - 01.mp4

    11.PHP高级特性生成器 - 02.mp4

    11.PHP高级特性生成器 - 02.mp4

    PHP7新特性

    PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性 PHP7新特性

    php案例 之电子邮件收发系统

    php案例 之电子邮件收发系统php案例 之电子邮件收发系统

    php 的十个高级技巧

    php 的十个高级技巧,适合新手学习 php 的十个高级技巧,适合新手学习

    phpmailer邮件类 v5.1.rar

    PHPMailer是一个用于发送电子邮件的PHP函数包。它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quoted-printable.支持SMTP验证.支持冗余...

    php中高级常用面试题,php中高级常用知识点面试题

    php中高级常用面试题,php中高级常用知识点面试题

    php web收发邮件

    php web收发邮件 php web收发邮件

    PHPMailer_v5.1邮件类.zip

    PHPMailer是一个用于发送电子邮件的PHP函数包。它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quoted-printable.支持SMTP验证.支持冗余...

    PHP教程之用PHP实现POP3邮件的收取[二]

     本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理;针对收取和MIME解码,提供了两个实用的PHP类,并提供了使用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在...

    php邮件发送系统

    php版本的邮件群发系统 1、在使用本软件前,请确保运行环境是Linux系列版本,支持PHP运行环境,并开启SMTP端口25; 2、解压本软件,解压后上传到您的LINUX WEB空间,并设置最高权限 777(chmod * 777); 3、然后...

    PHP高级程序设计_模式、框架与测试 PDF及源码

    本书采用循序渐进的方式介绍了用PHP 进行Web 开发的相关知识。书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和...

    phpmailer 发邮件类 v5.1

    PHPMailer是一个发送电子邮件的PHP函数包,它可以在发送邮时指定多个收件人,支持抄送地址,回复地址,支持8bit,base64,binary和quoted-printable等多种邮件编码,支持SMTP验证、冗余SMTP服务器、支持带附件的邮件...

    PHP5高级应用开发实践1/2

    PHP是目前开发动态Web站点最流行的语言,本书介绍了PHP高级编程技术及相关主题。全书划分为三个部分。前5章介绍一般的高级PHP知识:编程技巧、Web应用程序、数据库、安全和电子商务。接下来的6章内容着重扩展PHP的...

    php发送邮件插件

    echo "邮件错误信息: " . $mail-&gt;ErrorInfo; exit; } else { echo "$user_name 邮件发送成功! "; } } // 参数说明(发送到, 邮件主题, 邮件内容, 附加信息, 用户名) smtp_mail("yourmail@your...

Global site tag (gtag.js) - Google Analytics