帝国CMS新订单、新反馈信息、新投稿 各种场景 各种给管理员发通知邮件

新订单、新反馈信息、新投稿 各种场景 各种给管理员发通知邮件
帝国不知道从什么时候就引入了一个发送邮件类,还可以在后台设置管理员邮箱,和发送邮件的相关参数,但是准备了这么多材料,实际上系统用到的机会不多,大约只在会员注册验证、会员重置密码,和管理员向会员发送消息时用到了邮件功能。实际上帝国这么多功能,在很多关键位置如果能增加一个给管理员发送通知邮件的功能,那会使管理员带来很大的方便,起码不用一直挂着后台了。由于帝国已经支持发送邮件了,所以这些功能实现起来很简单,有需要的同学可以参考一下。一、设置管理员邮件地址和发邮参数后台,系统设置,系统参数设置基本属性标签:管理员邮箱。以后的通知邮件都会发到这一邮箱FTP/EMAIL标签:如果主机支持mail函数,则个人感觉用这个效率可能高一点,主机不支持的话也没关系,还可以用SMTP,设置方法跟邮件客户端一样。需要说明的是,如果想用gmail的帐号发送实现起来比较麻烦,gmail的smtp需要ssl,且不说帝国自带的邮件发送类不支持ssl,就是帝国后台设置邮件的地方也没有提供ssl选项,所以就不折腾了,用国内的邮箱帐号发就是了。二、新增给管理员发邮件的函数找到e/class/SendEmail.inc.php,结尾下加入以下代码

本文实例讲述了phplist及phpmailer通过gmail发送邮件的配置方法。分享给大家供大家参考,具体如下:

PHPMailer类-php发送邮件好帮手  cheny
发布于:2009-05-06  

//给管理员信箱发送通知邮件新增函数function SendNoticeToAdmin($subject,$body){ global $empire,$dbtbpre; $empire=new mysqlquery(); $pr=$empire-fetch1("select email from {$dbtbpre}enewspublic limit 1"); if(is_array($body)){ foreach($body as $value){ $key=key($body); next($body); $msgtext .= "$key:"."$value"."/n"; } }else{ $msgtext=$body; } $msgtext .= "/r/n/r/n此邮件由系统自动发出,请管理员尽快处理/n/r"; $sm=EcmsToSendMail($pr['email'],$subject,$msgtext); return $sm;}

一般来说,只要你使用的不是gmail邮箱,那么利用phplist发送邮件只要按照前面《PHP的邮件群发系统phplist配置方法详细总结》配置就够了。但若你如同我一样不幸,必须使用gmail这种有ssl验证的邮箱,那么恭喜你,我的不幸现在已然成为你的幸运,经过数天的尝试,我终于成功将gmail与phplist组合在了一起。现将经验分享于此,希望对各位同我一般境遇的同志有用。另外,phplist的核心是phpmailer,我提出的解决方案也主要是围绕phpmailer的,所以需要使用phpmailer通过gmail发送邮件而不能成功者也可以参考我的方法。

来源:

三、给管理员发邮件,以下是不同的场景,可以根据需要自由修改1.有新订单时修改e/enews/index.php,在大约184行AddDd($_POST);在这一行前面加上

首先按照《PHP的邮件群发系统phplist配置方法详细总结》中的配置方法通过gmail发送邮件,在发送测试邮件时phplist会报告发送邮件失败,在事件日志里会有错误提示“Mailer
Error: The following From address
failed:…”,说是发件人地址存在问题。难道是已经连上smtp服务器,但是发送邮件过程中存在问题吗?可以用一个方法试验一下到底连没连上smtp服务器:我把config.php文件中的邮箱帐户密码故意填错,结果发送测试邮件时仍然报同样的错误,看来是根本就没连上smtp服务器,这phplist的错误报告也太……

PHPMailer 是一个专门用于php语言的邮件发送类,功能十分地强大,丰富了 PHP
本身单一的 mail() 函数。支持 SMTP 等甚至于附件。 

@include("../class/SendEmail.inc.php"); SendNoticeToAdmin("有新订单!订单号".$_POST[ddno],$_POST);

知道是没连上smtp服务器那就说明问题出现在phplist发送邮件的核心——另一款着名开源软件phpmailer。

PHPMailer 遵守 LGPL 授权,可以免费下载,当前版本是PHPMailer v2.2.1
更新于2007 年11月16日。 

完活,这只是起到一个提醒功能,所以邮件界面什么的就不用考虑了,管理员收到邮件后去帝国后台处理就是了。2.有新的投稿时修改e/class/qinfofun.php,在大约850行

上网查了一下phpmailer发送gmail邮件的资料,发现人们说旧版本的phpmailer不支持ssl验证,不能连接gmail的smtp服务器,而此问题已在新版的phpmailer中解决了。

下载地址:

printerror("AddQinfoSuccess",$reurl,1);

打开lists/admin/phpmailer/ChangeLog.txt,发现最新版的phplist自带的phpmailer的版本是1.73,是2005年出的,确实不算新。于是上phpmailer的官网下了个最新的5.1的。

 

在这一行前面加上

我想先研究一下新版的phpmailer是如何解决ssl验证的问题的,于是看了一下其自带的一些说明文档,碰巧发现在PHPMailer_v5.1/docs下有一个use_gmail.txt,看来是官方比较重视gmail问题,专门出了一个demo供人参考。打开一看也确实是一个完整的php页面文件,基本上修改了文件扩展名、邮箱用户名和密码就能使用,但如果仅仅如此修改,在访问该测试页面时会报错,也不知官方出的demo怎么会有这样的错误,居然会调用一个未定义的函数,而且有一些没有必要的成分。我们只不过想先测试一下能否正常发送邮件,所以我将其修改为:

注:下载时有后缀分别为 .tar.gz 和 .zip
之分,其实它们包含的文件都是一样的,只是压缩格式不同,.tar.gz
经过了双重压缩,文件更小罢了,WinRAR 软件能正确地解压这两种格式。

@include('SendEmail.inc.php'); SendNoticeToAdmin("收到来自".$add['title']."的投稿",$add);
IsSMTP(); $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier $mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server $mail->Port = 465; // set the SMTP port $mail->Username = "myname@gmail.com"; // GMAIL username $mail->Password = "mypassword"; // GMAIL password $mail->From = "myname@gmail.com"; $mail->FromName = "Webmaster"; $mail->Subject = "This is the subject"; $mail->AltBody = "This is the body when user views in plain text format"; //Text Body $mail->WordWrap = 50; // set word wrap $mail->MsgHTML; $mail->AddReplyTo("myname@gmail.com","Webmaster"); $mail->AddAddress("myname@gmail.com","First Last"); $mail->IsHTML; // send as HTML if { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; }?>

 

3.有新的信息反馈时

结果发现访问此页面时仍然报错,真是令人无奈,官方给的demo怎么会无法运行?

◆使用方法:

修改e/class/q_functions.php,在大约468行

这时我忽然想起PHPMailer_v5.1/docs下有一个名为Note_for_SMTP_debugging.txt的文件,现在我不正是在为连不上smtp服务器而烦恼吗,不妨看一下里面提供的调试方法。

 

$reurl=DoingReturnUrl("../tool/feedback/?bid=$bid",$add['ecmsfrom']);

打开文件看完第一行就眼前一亮,这正是我所需要的!其实使用方法也很简单,只要在

☆ 前注:解压后,文件包中会有一个 examples
文件夹,里面有“pop3_before_smtp_test.php” 和 “test1.php”
两个文件。其中第一个文件是教授基本的使用方法(见下),而 “test1.php”
则主要介绍了一些新增的特性,这些都在同文件夹下的“index.html”
作出了详细的说明,另一个文件“contents.html”
则是邮件内容,以后可以替换为邮件模版,用以增加邮件的规范化和丰富化。

在这一行前面加上:

$mail->IsSMTP();

$mail->SMTPDebug = 1;

 

@include("SendEmail.inc.php"); SendNoticeToAdmin("收到来自".$add['title']."的信息反馈",$add);

便可在报错同时得到更见详细的错误信息。真是好东西^_^

☆基本方法:pop3_before_smtp_test.php

4.有新留言时修改e/enews/index.php,在大约215行AddGbook($_POST);在这一行前面加上:

按照这样修改完后,我在访问页面时得到了更加详细的说明——“SMTP -> ERROR:
Failed to connect to server: Unable to find the socket transport “ssl” –
did you forget to enable it when you configured PHP? ”。

<?php
require ‘class.phpmailer.php’;
require ‘class.pop3.php’;
$pop = new POP3();
// 建立对象,收邮件
$pop->Authorise(’pop3.example.com’, 110, 30, ‘mailer’, ‘password’,
1);
// 设置收邮件的用户信息
// pop3.example.com:改写成邮箱的 pop3 服务器
// 例如,163 为 pop3.163.com
// mailer:用户名
// password:密码
$mail = new PHPMailer();
// 建立对象,发邮件,如果仅仅是发邮件可以去掉上面
// pop3 部份以及对 class.pop3.php 的包含
$mail->IsSMTP();
// 不变
$mail->SMTPDebug = 2;
$mail->IsHTML(true);
// 是否使支持 HTML 邮件的发送,默认为 false ,
// 为了方便后面使用“邮件模版”,我们把它改为 true
$mail->Host = ‘relay.example.com’;
// 发邮件的服务器
// 例如,163邮箱 为 smtp.163.com
$mail->From
= ‘mailer@example.com’;
// 你的邮箱
$mail->FromName = ‘Example Mailer’;
// 你的姓名
$mail->Subject = ‘My subject’;
// 邮件标题
$mail->Body = ‘Hello world’;
// 邮件内容,这里可以使用新特性调用邮件模版,具体详情看后面。
$mail->AddAddress(’name@anydomain.com’,
‘First Last’);
// 收件人邮箱和姓名
if (!$mail->Send())
{
echo $mail->ErrorInfo;
}
?>
◆新增特性-邮件模版:test1.php 
☆前注:新增特性就单从 test1.php
来看主要是增加了对邮件模版的支持,可以将以下代码添加到上面就可以实现邮件模版功能了。
……省略部分代码……
$body = $mail->getFile(’contents.html’);
// 调用邮件模版
$body = eregi_replace(”[]”,”,$body);
// 替换内容,例如邮件中的姓名及称谓
$subject = eregi_replace(”[]”,”,$subject);
// 替换主题,必要的时候上面都可以做一些针对性修改
……省略部分代码……
◆特注:
(1)注意事项:
getFile()函数内部使用了fopen()函数来实现对文件的调用,函数中设置了能调用的最大文件为
1M,所以不能调用大于 1M
的文件,调用的文件既可以是本地文件也可以是远程文件,PHPMailer
中的全部方法请参考这里。
(2)文件的填写方法:
第一行为 UNIX 系统使用,即是相对地址;第二行是 Windows
系列系统的用法,即是绝对地址;第三、四行则为 URL
的使用范例,即网络地址,这些规范同样适用于上面的 getFile() 函数。
<?
$fp = fopen(”/home/rasmus/file.txt”, “rb”);
$fp = fopen(”c:\mydata\info.txt”, “rb”);
$fp = fopen(”, “rb”);
$fp = fopen(”ftp://user:password@my.com/”, “w”);
?>
(3)emegi_replace(”$var1″,”$var2″,$var3)函数:
emegi_replace(”$var1″,”$var2″,$var3) 函数跟 emeg_replace()
函数功能上差不多,都是在 $var3 中查找 $var1 并将其替换为 $var2
,不同的是 eregi_replace() 函数不区分大小写。更多资料参考这里!
(4)针对 Gmail 的 ssl 加密链接:
前两天才搞定的企业邮局就是为了用来进行 Email 的发送,不过 ssl 加密的
Gmail
并不能简单地使用上面的方法解决,大家可以看看下面这些文章,在文章中提到了解决方法,不过我还没来得及做实验验证!
———-Update 2007.12.1———-
在新版的 PHPMailer 中实现 Gmail 发邮件,只需要在 class.phpmailer.php
中查找
if(eregi(’^(.+):([0-9]+)$‘, $hosts[$index], $hostinfo)) {
$host = $hostinfo[1];
$port = $hostinfo[2];
} else {
$host = $hosts[$index];
$port = $this->Port;
}

@include("../class/SendEmail.inc.php"); SendNoticeToAdmin("收到新留言",$_POST);

原来如此,于是我打开了我的php配置文件搜索ssl,果然搜到一个关于ssl的扩展

更改为:
if(eregi(’^#(([a-z]+://)?[^:]+):(d+)#i‘, $hosts[$index],
$hostinfo)) {
$host = $hostinfo[1];
$port = $hostinfo[3];
} else {
$host = $hosts[$index];
$port = $this->Port;
}
就可以了,有变化的地方做了加粗与倾斜显示。
使用方法:
……
$mail->Host = “ssl://smtp.gmail.com:465″;   // SMTP servers
……

5.有会员在网站上注册修改e/enews/index.php,在大约74行

;extension=php_openssl.dll

Gmail 的端口号为 465
,这种修改方法同时支持原有方法,即如果是163,则可以使用以下方法:

register($username,$password,$repassword,$email);

它没有被打开。去掉其前面用于注释的“;”,然后重启服务器,再次访问测试页面use_gmail.php,仍然是同样的错误提示。

 

在这一行前面加上

没办法了,我上网查了一下关于php以及apache的ssl配置的文章,发现仅仅是将ssl扩展模块开启是不够的,还要对openssl进行配置,在Windows环境下配置方法倒是很简单——找到php安装目录下的ssleay32.dll和libeay32.dll,将这二者复制到windows下的system32目录中即可(在php.ini中开启extension=php_openssl.dll还是必要的)。当然,不想“污染”system32目录的同志们可以用修改环境变量的方法,只要让ssleay32.dll和libeay32.dll在系统路径下就可以了。(如果你使用的不是winidows操作系统,请上网查找针对你的操作系统的配置ssl的方法,应该不难找到)

……

@include('../class/SendEmail.inc.php'); SendNoticeToAdmin("新会员注册,用户名:".$username,$_POST);

这回再访问use_gmail.php发现可以成功发送了!

 

6.网站后台启用注册需要邮箱验证,验证通过后会员会收到一封欢迎信由于这个邮件是给会员看的,所以内容格式排版上就要讲究一下了

在此基础上,我们的phplist的问题也可以解决了:用新版phpmailer中的class.phpmailer.php和class.smtp.php覆盖lists/admin/phpmailer中的对应文件,然后修改lists/admin/class.phplistmailer.php中36行左右处的

$mail->Host = “smtp.163.com”;   // SMTP servers

(1)在e/class下新增一条文件,命名user_template_register.txt,内容如下欢迎[!—USERNAME–]注册本网站。(2)修改e/class/qmemberfun.php,在大约188行printerror(ActUserSuccess,$public_r[newsurl],1);在这一行前面加上

$this->SMTPAuth = true;$this->Helo = getConfig;$this->Host = PHPMAILERHOST;

$this->IsSMTP(); # Add$this->SMTPAuth = true;$this->SMTPSecure = "ssl"; # Add$this->Helo = getConfig;$this->Host = PHPMAILERHOST;$this->Port = 465 # Add

 

@include('SendEmail.inc.php'); $msgtext=file_get_contents("user_template_register.txt"); $msgtext=str_replace('[!---USERNAME--]',$r[username],$msgtext); EcmsToSendMail($r[username],"欢迎注册",$msgtext);

其中phpmailer默认端口号为25,是大多数smtp服务器的端口号,但是gmail使用的端口号是465,所以要重新设置。

……

此久,还有一些场景也需要用到邮件,比如1)网站没有启用邮箱验证,但是会员注册后需要管理员手工审核,审核通过后会员会收到一封欢迎信2)商城系统,会员下单后会实时收到邮件通知,订单通过审核后,也会再给客户一封邮件实现起来都不难,有需要的自己加上就是了

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

 

希望本文所述对大家PHP程序设计有所帮助。

———-End  Update ———-

 

阅读文章:PHPMailer con GMail

 

阅读文章:让phpmailer支持gmail发送邮件

 

阅读文章:终于能够通过phpmailer使用gmail账号发送邮件了

 

(5)邮件模版下载:

 

网上流传甚广的30套邮件模版 直接下载,挺不错的,在国内 126,163,QQ
这些邮箱中经测试表现都很正常,在 Gmail 中显示不正确, HotMail 未测试。

 

(6)成功发送邮件后却发现是乱码,怎么办呢?

 

PHPMailer 使用的字符集为
iso-8859-1,这个字符集并不能准确的显示中文,修改办法是给前面的程序增加一行代码,将字符集指定为
UTF-8:

 

$mail->CharSet = “UTF-8″; // 这里指定字符集!

 

为了保险,我们再修改 class.phpmailer.php 文件,找到第 50 行,将

 

var $CharSet = ‘iso-8859-1′;

 

修改为:

 

var $CharSet = ‘UTF-8′;

 

经测试,这种修改后均能在 126163qqgmail 中正确显示

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图