zoukankan      html  css  js  c++  java
  • 使用php发送电子邮件(phpmailer)

      在项目开发过程中,经常会用到通过程序发送电子邮件,例如:注册用户通过邮件激活,通过邮件找回密码,发送报表等。这里介绍几种通过PHP发送电子邮件的 方式(1)通过mail()函数发送邮件(2)使用fsockopen方式连接smtp服务器发送(3)使用phpmailer邮件类发送。个人推荐使用 phpmailer邮件类发送,phpmailer比较方便使用且功能强大,接下来对这几种方式分别做一下介绍。

            (1)通过mail()函数发送邮件
        PHP中的mail() 函数允许从脚本中直接发送电子邮件,格式:
        mail($to,$subject,$message,$headers,$parameters);
        to 必需。规定邮件的接收者。
        subject 必需。规定邮件的主题。该参数不能包含任何换行字符。
        message 必需。规定要发送的消息。
        headers 可选。规定额外的报头,比如 From(发件人), Cc(抄送) 以及 Bcc(密送)。
        parameters 可选。规定 sendmail 程序的额外参数。

             需要特别mail()函数用法相当简单,但并不我们使用mail()函数就可以直接发送邮件了,需要我们做一些配置,在Windows与Linux系统上的配置方式有些不同。我们发送邮件需邮件服务器,如果是Linux服务器需要在php.ini中的sendmail_path设置为服务器的路径,如果Linux在安装时安装了sendmail,可以这样设置:
        sendmail_path = /usr/sbin/sendmail
    如果安装的是Qmail等其他Mail服务器则填写对应的路径即可。
    如果是Windwos操作系统则需要配置SMTP和smtp_port着两个参数,例如:
        SMTP = localhost
        smtp_port = 25
    如果将SMTP设置为localhost则本机必须安装邮件服务器才能正常发信,当然也可以设置其他邮件服务器的域名或IP地址,还有一个可选参数是sendmail_from可以设置默认的发件人邮箱。看一下php.ini的配置项:

    使用mail函数时php.ini的配置

    (2)使用fsockopen方式连接smtp服务器发送

    首先需要有一个smtp邮件服务器,可以自己搭建也可以使用网易,新浪等免费的邮件服务器,发送的过程大致如下:

        1.建立TCP连接
        2.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令,服务器端正希望以OK作为响应,表明准备接收
        3.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行,服务器端则表示是否愿意为收件人接受邮件
        4.协商结束,发送邮件,用命令DATA发送
        目前绝大多数的服务商都提供SMTP服务,如果我们要使用的MTA需要用户认证(绝大多数的邮件服务商都需要认证)那就需要我们使用有效的用户名密码登 陆。以网易的163邮箱为例,首先注册一个邮箱账号比如:mytest@163.com,这里我们使用一个写好的email.class.php来实现与 SMTP服务器实现通信并发送邮件的功能,使用前需要在配置文件config.php中配置一下各项参数,详细说明可以参考附件中的示例代码。

    (3)使用phpMailer邮件类发送电子邮件(特别推荐)
         先来几句废话:
        phpMailer是一个非常强大的php发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。
         phpMailer的特点:
        1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。
        2、平台应用广泛,支持的 SMTP 服务器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
        3、支持嵌入图像,附件,HTML 邮件。
        4、可靠的强大的调试功能。
        5、支持 SMTP 认证。
        6、自定义邮件头。
        7、支持 8bit、base64、binary 和 quoted-printable 编码。
        使用phpMailer发送邮件需要class.phpmailer.php和class.smtp.php两个文件,比较简单的代码片段:

    1. <?php
    2. require_once('./class.phpmailer.php');

    3. include_once("class.smtp.php");
    4. $mail = new PHPMailer(true); //实例化PHPMailer类,true表示出现错误时抛出异常
    5. $mail->IsSMTP(); // 使用SMTP
    6. try {
    7.   $mail->CharSet ="UTF-8";//设定邮件编码
    8.   $mail->Host       "smtp.163.com"// SMTP server
    9.   $mail->SMTPDebug  1;// 启用SMTP调试 1 = errors  2 =  messages
    10.   $mail->SMTPAuth   true;// 服务器需要验证
    11.   $mail->Port       25;//默认端口   
    12.   $mail->Username   "testuser"//SMTP服务器的用户帐号
    13.   $mail->Password   "testpwd";//SMTP服务器的用户密码
    14.   $mail->AddReplyTo('****@com133.com''回复'); //收件人回复时回复到此邮箱
    15.  $mail->AddAddress('****@test.com''李明'); //收件人如果多人发送循环执行AddAddress()方法即可 还有一个方法时清除收件人邮箱ClearAddresses()
    16. $mail->SetFrom('li1209@163.com''发件人');//发件人的邮箱
    17. $mail->Subject '这里是邮件的标题';
    18. $mail->Body '邮件内容';
    19. $mail->IsHTML(true);
    20.   $mail->Send();
    21.   echo "Message Sent OK";
    22. } catch (phpmailerException $e) {
    23.   echo $e->errorMessage();//从PHPMailer捕获异常
    24. } catch (Exception $e) {
    25.   echo $e->getMessage();
    26. }
    27. ?>

        如果使用phpMailer发送html网页只需添加代码:
      $body = file_get_contents('tpl.html'); //获取html网页内容
      $mail->MsgHTML(eregi_replace("[]",'',$body));
    注:使用MsgHTML()方法时发送的邮件内容不仅仅是html代码,而且可以将html代码中的图片等内容作为附件嵌入到页面中一起发送,这在发送图 文并茂的信息时比较常用。并且使用该方法时无需对Body属性赋值也无需使用IsHTML()方法(即使使用也没有效果)。
        通过SSL安全连接发送邮件
        目前很多邮箱使用SLL加密方式连接发信,例如谷歌的GMAIL目前只支持加密连接,网易、腾讯等服务商目前也支持SLL加密方式连接。SSL协议端口号通常是465(具体视服务商而定),如果通过SSL方式发送邮件只需增加一个属性即可:
         $mail->SMTPSecure = "ssl";    
        同时端口号更改为SSL的端口号,例如:
         $mail->Port       = 465;
        这样就可以通过SSL协议发送邮件了。

    具体代码见附件:

          phpmailer邮件类示例    smtp方式发送邮件源码

  • 相关阅读:
    11月2日考试 题解(前缀和+哈希+树状数组+树链剖分)
    【Ynoi2016】谁的梦 题解(容斥+STL)
    ENABLE_DDL_LOGGING参数
    ORA-12012: error on auto execute of job 25;ORA-12005: may not schedule automatic refresh for times in the past
    Oracle增加数据文件
    使用Loop循环向测试表插入数据
    Oracle中开窗函数row_number()、rank()、dense_rank()
    安装Oracle 19c RAC创建ssh连接成功,测试报错INS-06006
    .Net5 WebApi Swagger 发布IIS遇到的坑
    .Net5 开启JWT认证授权
  • 原文地址:https://www.cnblogs.com/zx98/p/5824560.html
Copyright © 2011-2022 走看看