exim配置

服务器是debian,用apt-get安装exim4,exim4-config,exim4-daemon-light
之后配置/etc/exim4/update-exim4.conf.conf,配置文件如下:

dc_eximconfig_configtype=’smarthost’ #用smarthost发信;通过SMTP或fetchmail接收信件
dc_other_hostnames=”
dc_local_interfaces=’127.0.0.1′ #只接收本机的SMTP请求,只在本机使用Exim4
dc_readhost=”
dc_relay_domains=”
dc_minimaldns=’false’
dc_relay_nets=”
dc_smarthost=’smtp.gmail.com’ #gmail的smtp主机
CFILEMODE=’644′
dc_use_split_config=’false’ #不使用分散方式的配置文件
dc_hide_mailname=’false’
dc_mailname_in_oh=’true’
dc_localdelivery=’mail_spool

然后编辑/etc/mailname

修改/etc/exim4/passwd.client,按照举例添加smtp地址和用户名密码,google的smtp真实地址为:gmail-smtp-msa.l.google.com。
修改/etc/exim4/email-addresses,添加用户对应的外部地址。

utf-8编码时统计字数

写该程序的目的是因为utf-8编码时,中文和数字、英文字母所占字节数不同,在进行截取时不方便处理。

[php]
function utf8_array(msg){ result=array();
strlen = strlen(msg);
for(i=0; i<strlen; i++) {
str=substr(msg, i, 1); if(ord(str)>0xA0 ){
result[]=substr(msg, i, 3); i =i+2; }else{ result[]=substr(msg, i,1);
}
}
return result; } //下面为示例 function sendSms(tele_num,msg){ header(“Content-type:text/html;charset=utf-8”); sms=D("sms");
msg_data=utf8_array(msg);
msg_count=count(msg_data);//字数
msg_num=1;//短信条数 if(msg_count>65){
msg_num=ceil(msg_count/62);
}

if(msg_num==1){ insert_data=array("is_sent"=>0,"tele_num"=>tele_num,”add_time”=>time(),”send_time”=>0,”send_content”=>msg);
sms->add(insert_data);
}else{
for(i=0;i<msg_num;i++){
msg_send=””; for(j=i*62;j<(i+1)*62;j++){
if(j<msg_count)
msg_send.=msg_data[j]; } msg_send.="(".(i+1).”)”; insert_data=array("is_sent"=>0,"tele_num"=>tele_num,”add_time”=>time(),”send_time”=>0,”send_content”=>msg_send);
sms->add(insert_data);
}
}

}
[/php]

短信发送队列设计

有个应用场景,发送短信限制为相同手机号发送短信时间间隔必须是15s,且长度限制为65字,而一些订单必须拆成几条短信,故设计此发送方案、

短信队列设计方案

 设计方案:

              短信拆分方案:

(1) 少于66字,一条发送

(2) 多于65字,拆成62字一条,后面加上(x) x表示页码

      短信发送方案:

(1) 所有短信存入数据库存档,并赋予发送状态标志位is_sent =0,加上时间,发送人卡号,内容,ID自增长

(2) 每隔20s,扫描数据库提取未发送的短信,并保证每个号码发送条数为1,装入taskqueue发送

(3) Taskqueue发送成功后,置is_sent=1

(4) 不成功滚入下一次发送队列

     数据库设计:

ID
cardn
Send_time
Add_time
Tele_num
Send_content
Is_sent

CREATE TABLE `think_sms` (

`id` int(100) NOT NULL,

`cardn` int(20) NOT NULL,

`send_time` int(20) NOT NULL,

`add_time` int(20) NOT NULL,

`tele_num` bigint(30) NOT NULL,

`send_content` varchar(80) NOT NULL,

`is_sent` int(2) NOT NULL DEFAULT ‘0’,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;