用WordPress自带的PHPmailer发送留言邮件

by 我是管理员!

在WordPress中包括了很多开源的PHP类库,实际上WordPress有很多功能都是基于这些类库的,我们也可以在模板或者插件中调用这些类库。比如小狮这个博客的Contact页,用的就是WP自带的一个叫PHPmailer的一个类库,实现了留言回复直接发送到指定的邮箱,非常方便。

下面小狮就把代码公开出来,希望能帮到那些有需要的人,如果有PHP高手可以指教一下,小狮对PHP还是个门外汉呢 :)

包含并创建实例

PHPmailer在WP中的的路径是wp-includes/class-phpmailer.php,在使用的时候需要把该文件包含进去,WP中包含文件的函数是require_once();,文件包含进来之后,就可以创建该类的新实例了,创建实例的代码也非常简单,跟大多数语言的创建方法一样:$mail = new PHPMailer;

PHPmailer详解

创建PHPmailer的实例之后,还需要设置一些必要的参数,比如收件人地址、邮件主题、邮件内容等等,好让PHPmailer知道你要把邮件发送给谁以及发送哪些内容。

打开phpmailer.php文件之后,该类的结构和相关变量就一目了然了,这里小狮只把几个比较核心的参数写出来,剩下的大家可以自己去看。

方法函数:

  • IsHTML($bool):设置邮件内容为HTML格式(可以带格式信息,如粗体、链接等)。
    $bool:布尔值
    返回值 :无
  • AddAddress($address, $name = “”):添加一个收件人邮箱地址。
    $address:字符串,收件人邮箱地址
    $name:字符串,收件人姓名
    返回值:无
全局变量:
  • $Subject:字符串,邮件的主题。
  • $Body :字符串,邮件内容。如果IsHTML为Ture,则字符串中的HTML字符将被解析成相应的格式。
  • $From:发件人地址,默认是localhost.localdomain。在小狮的contact代码中是直接把留言者的邮箱地址作为发件人了。
  • $FromName:发件人姓名,默认是Support。与$from一样,小狮把留言者的姓名直接作为发件人姓名了。

设置完这些参数之后PHPmailer已经知道你把什么内容发送给谁,但是现在还没办法发送,因为发送邮件是需要一个邮件发送服务器(SMTP Server)的,设置好SMTP 服务器的地址之后,PHPmailer就会把这些参数信息推送给这个SMTP服务器,让后由这个服务器把邮件发送出去。

代码如下:

		$mail->IsHTML(true);
		$mail->AddAddress("h198741@126.com"); // 收件人
		$mail->Subject = $emailInfo_subject; // 邮件主题
		$mail->Body = $emailInfo_body; // 邮件内容
		$mail->From = $_POST["email"];
		$mail->FromName = $_POST["names"];

设置SMTP Server

需要注意的是,如果不指定SMTP服务器的话,PHPmailer会使用localhost作为SMTP服务器来发送邮件,因为小狮租用的服务器自带一个邮件服务器,所以这里就没有设置SMTP也一样可以发送邮件。

现在有很多邮箱都把自己的SMTP服务器提供给注册用户免费使用,比如网易的126和Gmail,只要注册一个帐号就可以使用他们提供的SMTP服务器了。下面小狮把PHPmailer的SMTP相关设置介绍一下,其实只要用过Outlook之类的邮件客户端都能明白。

  • $Host:字符串,SMTP服务器地址。一般都是smtp.126.com这种格式。
  • $Username:字符串,SMTP服务器的登陆账户名。比如你注册的是126邮箱的话,就把你的126邮箱帐号写上就行了。
  • $Password:字符串,SMTP服务器的登陆密码。同上。
最后是一个方法函数:IsSMTP(),作用是将PHPmailer的发送模式设置为SMTP模式。

代码如下:

		$mail->IsSMTP; //设置为使用使用SMTP服务器发送邮件的模式
		$mail->Host = "smtp.gmail.com";  //使用Gmail的发件服务器来发送邮件
		$mail->Username = "username"; //输入你在Gmail的用户名
		$mail->password = "password"; //输入你在Gmail的密码

搞定,发送!

现在一切设置都已经完毕了,加上$mail-> send();这么一行代码就OK了!当执行到这一行的时候,程序就会按照参数将mail中的内容发送到指定的SMTP服务器上,SMTP服务器将会接收这些信息,并且按照其中的设置进行发送。

小狮的Contact页的完整代码如下(注意小狮是没有设置SMPT模式的哦):

	<?php
		if ($_POST) {
		require_once(ABSPATH.WPINC.'/class-phpmailer.php');
		// 实例化 PHPMailer 类
		$mail = new PHPMailer;

		$BR = "<br>";

		$contact_senderName = "<b>".$_POST["names"]."</b>";;
		$contact_senderEmail = "<a href='mailto:".$_POST['email']."'>".$_POST["email"]."</a>";
		$contact_senderURL = "<a href='".$_POST["url"]."'>".$_POST["url"]."</a>";
		$contact_senderPhoneNum = $_POST["contactnum"];
		$contact_subject = $_POST["subject"];
		$contact_msg = $_POST["message"];

		$emailInfo_subject = "Contac Page的新消息:".$_POST["names"];
		$emailInfo_body =
			"姓名: ".$contact_senderName.$BR
			."Email: ".$contact_senderEmail.$BR
			."个人网站: ".$contact_senderURL.$BR
			."联系方式: ".$contact_senderPhoneNum.$BR.$BR
			."标题: ".$contact_subject.$BR
			.$contact_msg;

		// 填入最基本的参数
		$mail->IsHTML(true);
		$mail->AddAddress("h198741@126.com"); // 收件人
		$mail->Subject = $emailInfo_subject; // 邮件主题
		$mail->Body = $emailInfo_body; // 邮件内容
		$mail->From = $_POST["email"];
		$mail->FromName = $_POST["names"];

		if(!$mail->Send()) // 发送邮件
		{
		echo "<p class='result'>信息发送失败, 请重新尝试或选择其他联系方式...</p>";
		exit;
		}

		echo "<p class='result'>信息发送成功! 你的留言已经发送到Liony的邮箱中, 他会在稍后联系你.</p>";
		}
    ?>
        <form action="/contact" method="post" onSubmit="return checkfrm_contact();" id="contactform">
          <fieldset>
          <label for="names">姓名</label>
          <input type="text" value="" maxlength="50" name="names" id="names"/>
          <label for="email">E-mail 地址</label>
          <input type="text" value="" class="t" maxlength="100" name="email" id="email"/>
          <label for="url">个人网站</label>
          <input type="text" value="" maxlength="100" name="url" id="url"/>
          <label for="contactnum">联系方式</label>
          <input type="text" value="" onKeyPress="return numbersonly(this, event)" maxlength="100" name="contactnum" id="contactnum"/>
          </fieldset>
          <fieldset id="msg">
          <label for="subject">标题</label>
          <input type="text" maxlength="100" name="subject" id="subject"/>
          <label for="message">内容</label>
          <textarea rows="12" cols="30" name="message" id="message"></textarea>
          </fieldset>
          <fieldset>
          <button value="1" name="submit" type="submit">Submit</button>
          </fieldset>
        </form>