phpmailer 发送邮件,利用公司邮箱服务器

       由于图书馆业务需求,所以笔者花了一礼拜的时间把这个自动发送邮件的系统做好了,这里一步步的教你怎么使用Php中的phpmailer邮件类通过公司邮箱服务器发送邮件。

      公司的邮件服务器地址SMTP= demuprx016.emea.nsn-intra.net 端口号PORT=25


  • 运行环境:WampServer Version 2.2,这个软件集成了Phpmysqlapache三个软件,wamp的配置这里不再叙述。
  • 第一步:需要下载PHPMailer文件包,我这里的版本是5.1,大家可前往官网下载。
  • 第二步:解压PHPMailer包,把里面的class.phpmailer.phpclass.smtp.php复制到一个文件里面,我这里放在了C盘,具体路径为:C:\wamp\www\library,这路径大家可以自己选择。
  • 第三步:建立一个文档叫做send.php,把这个文档和两个class放在同一文件夹里面。这里面我定义了一个函数,好方便以后调用,每个函数我都有解释,大家可以自己看。函数代码在附件1
  • 第四步:建立一个叫做sendmail.php的文档,把这个文档和两个class放在同一文件夹里面。里面的代码很简单,反正就是直接调用第三步中建的那个函数就可以了。函数源码在附件2。附件3里面包含了查找数据库中即将到期的图书的功能。

 

  • 环境配置:单独是有上面的代码是不够的,我们还需要配置一下自己的环境。

1)、在wamp里面的php.ini文件中找到“;SMTP = localhost,并且改为“SMTP=demuprx016.emea.nsn-intra.net

2)、打开wamp里面的几项php拓展功能选项。方法:wamp->php->php extensions,打开php_sockets,php_openssl两个选项。

3)、class.phpmailer.php里面进行如下操作。即将smtp改为大写的。

function IsSMTP() {

$this->Mailer = 'smtp';

}

改成:

function IsSMTP() {

$this->Mailer = 'SMTP';

}

 

注意:如果是虚拟机通过代理上公司的网,并且不是自动获取IP,这里则需要配置一下DNS。公司的“连接特定的DNS后缀”是china.nsn-net.net,这个怎么看的呢?我们可以在dos下面通过ipconfig查看,这里如图1所示。并且通过命令nslookup查看DNS信息,这里如图2所示。我们看到DNS为:10.159.192.10。最后如图3所示,我们把IPDNS,已经DNS后缀都填好在IPV4的属性里面。

如果IP是自动获取的我们就不需要弄这些了,这里为什么要弄呢,我们是为了把IP固定,好使公司内部人员都通过这个IP去访问我们的图书馆。自动获取IP的话,每次重启电脑的时候IP可能会变化。

  

                                                     

错误信息调试:

如果发现错误信息: Error:Could not connect to SMTP host等等,你可以用以下代码去检测,看看是哪里出了问题.

<html>
<body>
<h3>phpmailer Test</h3>
<?php
$fp = fsockopen("demuprx016.emea.nsn-intra.net", 25,&$errno, &$errstr, 10);// NOT work
if(! $fp)
echo "demuprx016.emea.nsn-intra.net -$errstr($errno)<br>\n";
else
echo "demuprx016.emea.nsn-intra.net - ok<br>\n";
fwrite($fp, "");
$out0= fgets($fp, 128);
#echo $out0;
if (strncmp($out0,"220",3)==0){ // ÅжÏÈýλ×Ö·ûÄÚÈÝ
echo '220 SMTP server ok<HR>';
}else{
echo 'server error<HR>';}
 
$host="demuprx016.emea.nsn-intra.net";
$Get_host=gethostbyname($host);
echo "try to connect $host ...<br> ";
if(!$Get_host){
$str= "translate failure (1)<HR>";
}elseif($Get_host==$host){
$str= "解析失败 (2): 可能是一个无效的主机名<HR>";
}else{
echo "translate yuming wei $Get_host ...<br>";
}
echo $str;
?>
</body>
</html>


       想要搞清楚Could not connect to SMTP host的原因,自然要明白连接服务的步骤一次完整有效的SMTP发信过程应该包括:解析域名、连接SMTP服务器、验证身份、确定收件人和信件内容、发送.

 

      上面那段PHP代码就是把这几个步骤分开来做,找出原因,然后寻找方法。回显的结果大概有如下几种:

 

  • 1、解析失败 (2) 可能是一个无效的主机名

说明域名无法解析。可能是DNS级别的问题。检查一下自己的DNS是否设置好或者更换服务商.

 

  • 2、服务器不支持Fsockopen,尝试pFsockopen函数

如果用pfsockopen函数连接服务器成功了,则修改class.smtp.php $this->smtp_conn =fsockopen( $this->smtp_conn= pfsockopen( 。使PHPmailer恢复正常使用

 

  • 3、服务器端错误

成功和远程主机建立连接,不过对方没有安装SMTP协议发送220响应码,说明SMTP服务器可能有问题.

 

附件:

1send.php源码

<?php
functionsendmail($addr){
require_once("class.phpmailer.php"); //下载的phpmailer类里面的文件
require_once("class.smtp.php");
 
$mail = new PHPMailer(); //得到一个PHPMailer实例
//$mail->CharSet = "utf-8"; //设置采用utf-8中文编码(内容不会乱码)
$mail->CharSet= "GB2312";
$mail->IsSMTP(); //设置采用SMTP方式发送邮件
$mail->Host = " demuprx016.emea.nsn-intra.net "; //设置邮件服务器的地址(我们公司的邮件服务器就是这个。若为163邮箱,则是smtp.163.com)
$mail->Port = 25; //设置邮件服务器的端口,默认为25
$mail->From = "[email protected] "; //设置发件人的邮箱地址
$mail->FromName = "Li,ShaoShu"; //设置发件人的姓名(可随意)
$mail->SMTPAuth = true; //设置SMTP是否需要密码验证,true表示需要
$mail->SMTPKeepAlive= true;
$mail->SMTPDebug = 1; //debug 调试用
$mail->Username="shaoshu.li.ext"; //(后面有解释说明为何设置为发件人)
$mail->Password= "SULsul1240 ";
$mail->Subject = "图书归还提醒"; //主题
$mail->AltBody= "text/html"; // optional, comment out and test
$mail->Body = "hi,您有图书即将到期,请按时归还!";//内容
$mail->IsHTML(true);
$mail->AddAddress("$addr","to"); //设置收件的地址(to可随意)
if(!$mail->Send())
{
echo"send fialure. <p>";
echo"reason: " . $mail->ErrorInfo;
exit;
}}
?>

2sendmail.php源码

<html>
<body>
<h3>phpmailerTest</h3>
 
<?php
include("send.php");
$addr="[email protected]";
sendmail($addr);
?>
 
</body>
</html>

3、查询数据库,并且发送email

<html>
<body>
<h3>phpmaileropen successful!</h3>
echo "<script>alert('注意!!!,开启这个功能后不要刷新页面,请关闭这个页面!');</script>";
 
<?php
require_once("conn/conn.php");
require_once("send.php");
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*60*24;// 每隔一天运行一次
 
do{
$sql=mysql_query("select * from tb_borrow whereifback=0"); //下面三条语句是从数据库获得归还时间
while($info=mysql_fetch_array($sql)){
 
$backTime=$info[backTime];
$time1 = time(); //把当前时间换成时间截
$time2 = strtotime("$backTime"); //把归还时间转换成时间截
$time =$time2-$time1;
if($time>0 && $time<3600*24*1) //图书到期前一天提醒
{
$nid=$info[readerid];
$sqs=mysql_query("select * from tb_reader wherensnid=$nid"); //下面三条语句是从数据库获得归还时间
$inf=mysql_fetch_array($sqs);
$email=$inf[email];
 
if($email){
$fp=fopen("test.txt","a+");
fwrite($fp,date("Y-m-dH:i:s")." $email!\n");
fclose($fp);
sendmail($email);
}
else{
$fp=fopen("test.txt","a+");
fwrite($fp,date("Y-m-dH:i:s")."invalid email!\n");
fclose($fp);
}
}
 
}
sleep($interval);// 等待的时间
}while(true);
 
?>
</body>
</html>



你可能感兴趣的:(发送邮件,利用phpmailer)