夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          郵件群發反屏蔽的原理是這樣的:
              1.每封郵件內容不同(針對反垃圾郵件的HASH技術)
              2.每封郵件主題不同(針對反垃圾郵件的HASH技術\關鍵詞過濾技術)
              3.郵件發件人不同(針對反垃圾郵件的HASH技術)
              4.發送郵件的ip不同(針對反垃圾郵件的黑白名單技術\反向查詢技術)
              5.單位時間內向某SMTP發送的數量不能超過經驗值(針對反垃圾郵件的黑白名單技術)
              就本次項目,偶寫了如下存過程:
              包頭:

          CREATE OR REPLACE
          PACKAGE "EDM_PACK" 
          AS
            
          PROCEDURE FETCH_SENDER(
             i_current_time 
          IN NUMBER,
             i_other_smtp 
          IN VARCHAR2,
             i_unknown_smtp 
          IN VARCHAR2,
             o_email_id OUT NOCOPY 
          NUMBER,
             o_email OUT NOCOPY 
          VARCHAR2,
             o_password OUT NOCOPY 
          VARCHAR2,
             o_smtp OUT NOCOPY 
          VARCHAR2);   
          END;
              包體:
          CREATE OR REPLACE
          PACKAGE BODY "EDM_PACK" 
          AS
            
          PROCEDURE FETCH_SENDER(
                i_current_time 
          IN NUMBER,
                i_other_smtp 
          IN VARCHAR2,
                i_unknown_smtp 
          IN VARCHAR2,
                o_email_id OUT NOCOPY 
          NUMBER,
                o_email OUT NOCOPY 
          VARCHAR2,
                o_password OUT NOCOPY 
          VARCHAR2,
                o_smtp OUT NOCOPY 
          VARCHAR2)
                
          IS
                    temp_count_other_smtp 
          NUMBER DEFAULT 0;
                    temp_anti_shield_id 
          NUMBER DEFAULT NULL;
                    temp_current_day DATE 
          DEFAULT NULL;
                
          BEGIN
                   
          SELECT COUNT(DISTINCT other_smtp)
                     
          INTO temp_count_other_smtp
                   
          FROM anti_shields
                   
          WHERE other_smtp = i_other_smtp;
                   
          --查看i_other_smtp是否在反屏蔽的smtp之內
                   IF temp_count_other_smtp = 0
                   
          THEN
                       
          --此other_smtp未列入返屏蔽之內
                       --從anti_shields中隨機取出一條符合指定other_smtp,
                       --且sending_time大于最小間隔的記錄的id
                       UPDATE anti_shields 
                           
          SET sending_time = i_current_time
                       
          WHERE id IN (
                           
          SELECT *  FROM 
                               (
          SELECT id 
                               
          FROM anti_shields
                               
          WHERE i_current_time - 
                                   NVL(sending_time,i_current_time) 
          > 
                                   
          86400000/NVL(count_per_day,500)
                                 
          AND other_smtp = i_unknown_smtp
                               
          ORDER BY DBMS_RANDOM.Value 
                               )
                           
          WHERE ROWNUM <=1)
                       RETURNING id 
          INTO temp_anti_shield_id;
                   
          ELSE
                       
          --此other_smtp已列入返屏蔽之內
                       --從anti_shields中隨機取出一條符合指定other_smtp,
                       --且sending_time大于最小間隔的記錄的id
                       UPDATE anti_shields 
                           
          SET sending_time = i_current_time
                       
          WHERE id IN (
                           
          SELECT *  FROM 
                               (
          SELECT id 
                               
          FROM anti_shields
                               
          WHERE i_current_time - 
                                   NVL(sending_time,i_current_time) 
          > 
                                   
          86400000/NVL(count_per_day,500)
                                 
          AND other_smtp = i_other_smtp
                               
          ORDER BY DBMS_RANDOM.Value 
                               )
                           
          WHERE ROWNUM <=1)
                       RETURNING id 
          INTO temp_anti_shield_id;
                   
          END IF;
                   
          --從anti_shields中隨機取出一條符合指定other_smtp,
                   --且sending_time大于最小間隔的記錄的id
                    UPDATE anti_shields 
                      
          SET sending_time = i_current_time
                    
          WHERE id IN (
                        
          SELECT *  FROM 
                           (
          SELECT id 
                            
          FROM anti_shields
                            
          WHERE i_current_time - 
                                NVL(sending_time,i_current_time) 
          > 
                                
          86400000/NVL(count_per_day,500)
                              
          AND other_smtp = i_other_smtp
                              
          ORDER BY DBMS_RANDOM.Value 
                            )
                        
          WHERE ROWNUM <=1)
                    RETURNING id 
          INTO temp_anti_shield_id;
                    
          --如果得到了記錄
                    IF temp_anti_shield_id IS NOT NULL
                    
          THEN
                      
          --得到指定id的記錄的current_day并存入temp_current_day中
                      SELECT current_day 
                        
          INTO temp_current_day
                      
          FROM anti_shields
                      
          WHERE id = temp_anti_shield_id;
                      
          --如果得到了當前時間
                      IF temp_current_day IS NOT NULL
                      
          THEN
                         
          --看是否更新current_day和count_day
                         IF TO_CHAR(SYSDATE,'YYMMDD'!=
                            TO_CHAR(temp_current_day,
          'YYMMDD')
                         
          THEN
                         
          --更新current_day和count_day
                           UPDATE anti_shields
                             
          SET current_day = SYSDATE,count_day = 0
                           
          WHERE id = temp_anti_shield_id;
                         
          END IF;
                      
          END IF;
                      
          --得到我們自己SMTP服務器的ip
                      SELECT ourself_smtp 
                        
          INTO o_smtp
                      
          FROM anti_shields
                      
          WHERE id = temp_anti_shield_id;
                      
          --如果ourself_smtp不為NULL
                      IF o_smtp IS NOT NULL
                      
          THEN
                          
          --隨機從自已的SMTP服務器上取得一帳號
                          SELECT id 
                          
          INTO o_email_id 
                          
          FROM
                            (
          SELECT id 
                             
          FROM senders 
                             
          WHERE ourself_smtp = o_smtp
                                 
          ORDER BY DBMS_RANDOM.Value 
                            )
                          
          WHERE ROWNUM <=1;
                          
          --如果得到帳號
                          IF o_email_id IS NOT NULL
                          
          THEN 
                             
          --得到email帳號
                             SELECT email 
                              
          INTO o_email 
                             
          FROM senders
                             
          WHERE id = o_email_id;
                             
          --得到email密碼
                             SELECT password 
                               
          INTO o_password
                             
          FROM senders
                             
          WHERE id = o_email_id;
                          
          END IF;
                          
          --判斷是否更改日發送量和發送總量
                          IF o_email_id IS NOT NULL
                            
          AND o_email IS NOT NULL
                            
          AND o_password IS NOT NULL
                            
          AND o_smtp IS NOT NULL
                         
          THEN
                            
          --更改日發送量和發送總量
                            UPDATE anti_shields
                              
          SET count_day = count_day + 1,
                                total_count 
          = total_count + 1
                            
          WHERE id = temp_anti_shield_id;
                         
          END IF
                      
          END IF;
                    
          END IF;
                    EXCEPTION
                        
          WHEN OTHERS
                        
          THEN
                           o_email_id :
          = NULL;
                           o_email :
          = NULL;
                           o_password :
          = NULL;
                           o_smtp :
          = NULL;
            
          END;
          END;
              存儲過程,美麗優雅的波浪,呵呵....
          posted on 2008-01-22 12:09 HUIKK 閱讀(360) 評論(0)  編輯  收藏 所屬分類: DataBase
          主站蜘蛛池模板: 蚌埠市| 手游| 城步| 保山市| 扶风县| 呼玛县| 霍山县| 鲁甸县| 凤阳县| 灵璧县| 湖口县| 梁平县| 东阿县| 嘉善县| 潢川县| 海宁市| 通榆县| 玛多县| 大新县| 西丰县| 大方县| 兴宁市| 庄河市| 阿克陶县| 灵川县| 搜索| 东至县| 巴青县| 沁源县| 沾化县| 都江堰市| 东光县| 扶绥县| 松潘县| 嘉义县| 泾源县| 西乌| 正镶白旗| 福鼎市| 阜城县| 运城市|