当前位置:首页 > 帝国CMS学习

帝国CMS多邮件发送功能操作实战

作者:Shu | 时间:2019-04-07 | 栏目:帝国CMS学习 | 围观热度:1164

使用帝国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、扩展变量的邮箱集合,账号密码必须正确,要不然是会发送失败。