由于图书馆业务需求,所以笔者花了一礼拜的时间把这个自动发送邮件的系统做好了,这里一步步的教你怎么使用Php中的phpmailer邮件类通过公司邮箱服务器发送邮件。
公司的邮件服务器地址SMTP= demuprx016.emea.nsn-intra.net 端口号PORT=25。
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所示,我们把IP和DNS,已经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代码就是把这几个步骤分开来做,找出原因,然后寻找方法。回显的结果大概有如下几种:
说明域名无法解析。可能是DNS级别的问题。检查一下自己的DNS是否设置好或者更换服务商.
如果用pfsockopen函数连接服务器成功了,则修改class.smtp.php 的$this->smtp_conn =fsockopen( 为$this->smtp_conn= pfsockopen( 。使PHPmailer恢复正常使用
成功和远程主机建立连接,不过对方没有安装SMTP协议发送220响应码,说明SMTP服务器可能有问题.
附件:
1、send.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; }} ?>
2、sendmail.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>