def send_alarm_sms():
    #组装飞信发送列表,测试数据为2012月7月2日12时
    clock = datetime(2012,7,2,16,0,0,0) if MODE == 'TEST' else current_clock_dt()    
    current_alarms = Alarm.objects.filter(pub_time=clock)    
    to_send_list = []
    for current_alarm in current_alarms :
        # if is_ignore_city(current_alarm.title):
            # continue
        '''省级预警存在市级行政区字样时忽略'''    
        if len(current_alarm.area_code) == 5 and in_ignore_text(current_alarm.title):
            continue
        users = User.objects.filted_with_cid(current_alarm.area_code)
        if (len(users)>0 and current_alarm.content == ''):
            current_alarm.content = Alarm.fetch_content(current_alarm.url)
            current_alarm.save()
        for user in users:
            try:
                alarm_log = AlarmLog.objects.get(alarm=current_alarm,user=user)
                continue
            except:
                to_send_list.append((user,current_alarm))                
    #开始发送(单线程)
    send_count = 0
    if len(to_send_list) > 0 :
        for i in range(0,LOGIN_LIMIT):
            try:
                ft = MyFetion(PHONE,PSW)
                break
            except:i+=1         
        else:
            Log(level=1,event="failed to initial MyFetion in sending sms")
            sys.exit(1)
        #这里可以一次最大发送量
        for user,alarm in to_send_list[0:SEND_MAX]:
            fid = MyFetion.test_id if MODE == 'TEST' else user.fid
            tail = u'via飞信天气网(预警短信Beta)'
            content = u'[%s]\n%s %s' % (alarm.title,alarm.content,tail)            
            #测试和开发时给自己发送
            #if MODE != 'PRODUCT':pass
            details = u'status:ready %s-%s:%s'  %(user.phone_num,alarm.area_code,content)
            #保证先写入库成功再发送,不会造成重复发送,入库时失败,不会向该用户发送
            #但是存在一个问题,即入库成功,但发送失败,即下面的sendBYid失败后,不会再向该用户发送
            #如果脚本在sendBYid中断,日志信息(details列)也不会获得更新,即使是发送成功,也会显示status:failed。
            try:                
                AlarmLog(alarm=alarm,user=user,details=details).save()
            except Exception,e :
                error_msg = 'alarmlog write to db error:%s:%s:%s' % (e,alarm,user)
                Log(level=0,event = error_msg).save()
                if MODE != 'PRODUCT': print error_msg  
            else:
                send_result = ft.sendBYid(fid, content.encode('utf-8'))            
                if send_result == True or send_result == None: 
                    send_count +=1
                    did = "OK" if send_result == True else "Failed"
                    details = 'status:%s,%s,area_code:%s,content:%s' % (
                    did,user.phone_num,alarm.area_code,content)
                    AlarmLog.objects.filter(
                    alarm=alarm,user=user).update(details=details)
            #将发送结果发给自己        
            ft.send2self(details.encode('utf-8'))
            if MODE != 'PRODUCT': print user.phone_num,content        
        ft.logout()