使用帝国CMS自带的邮件功能方便的收集到网站的一些反馈信息,或者通知用户信息。默认情况下只能是使用一些固定的账号去发送邮件,如果你的发送频率不大,那以下内容就可以跳过了。
然而如果你是高频率的使用同一邮箱账号去发送邮件,很可能会被邮件系统给限制的。
某用户说自己的网站因为发送邮件太频繁,时不时被腾讯邮件给限制了,要求能增加多个邮件账号循环发送。
想要多邮件账号,那就要考虑到把账号存储起来。存储的方式有很多种,大致有2种:1、存储到文件 2、存储到数据表
存储到文件虽然简单,但是会造成后期可能网站升级迁移造成文件丢失,所以不建议,这里也不做介绍。
存储到数据表又有两种,一种是存储到系统内置的表,一种是存储到自定义的新表,两种方式选那种?
这里我选择了第一种:系统内置的表。选择系统内置表的优点是:1、不需要自己重建新表。2、能更好的兼容系统。
那么问题来了?我们要把数据存放到那个系统内置表呢?答案是:phome_enewspubvar(扩展变量数据表)
先增加一个扩展变量:emails,格式为:邮箱地址|邮箱登陆密码,不写入缓存,如下图:
再增加一个扩展变量:isdfs,用于控制当前系统是否支持多邮件发送功能,这样可以达到想开就开,就关就关的效果。操作如下图:
说明一下:两个变量,一个写入缓存,一个不写入缓存主要还是遵循帝国CMS的大内容不写入缓存,小内容写入缓存的原则,提高程序性能。
两个变量添加好以后,是不是完事了呢?答案是:NO!NO!NO! 接下来我们要做最重要的一步↓
如果你研究过帝国的源码,你会知道,发送邮件的核心函数是 e/class/SendEmail.inc.php 文件的 EcmsToSendMail 函数。换句话讲就是在帝国CMS系统中,只要是关于发送邮件的,这个文件就必定会被引入进去。所以,我们只要修改一下此函数即可,修改代码如下:
//发送邮件 将 e/class/SendEmail.inc.php 下的 EcmsToSendMail 函数替换如下代码
function EcmsToSendMail($email,$title,$text){
global $empire,$dbtbpre,$public_r;
$pr=$empire->fetch1("select sendmailtype,smtphost,fromemail,loginemail,emailusername,emailpassword,smtpport,emailname from {$dbtbpre}enewspublic limit 1");
if($public_r['add_isdfs']) {
$emails=ReturnPublicAddVar('emails');
$emailsR=explode(PHP_EOL,$emails);
$emailsR=array_filter($emailsR);
if($emailsR) {
$one_email = array_shift($emailsR);
$new_f_emailR=explode('|',$one_email);
$pr['fromemail']=$new_f_emailR[0];
$pr['emailusername']=$new_f_emailR[0];
$pr['emailpassword']=$new_f_emailR[1];
array_push($emailsR,$one_email);
$newEmails=implode(PHP_EOL,$emailsR);
$empire->query("update {$dbtbpre}enewspubvar set varvalue='$newEmails' WHERE myvar='emails'");
}
}
//发送初使化
$mailer=FirstSendMail($pr,$title,$text);
if(is_array($email))
{
$count=count($email);
for($i=0;$i<$count;$i++)
{
$email[$i]=RepPostVar($email[$i]);
if($email[$i])
{
$mailer->AddAddress($email[$i]);
}
}
}
else
{
$email=RepPostVar($email);
$mailer->AddAddress($email);
}
if(!$mailer->Send())
{
return false;
}
return true;
}
如此简单几步,即可实现多邮件账号的循环发送。
1、多邮件账号必须同属一个域。也就是说你不能在系统参数设置->Ftp/Email设置的是qq邮箱,在扩展变量里有网易邮箱
2、扩展变量的邮箱集合,账号密码必须正确,要不然是会发送失败。