ORACLE 存储过程 邮件服务器 反屏蔽

邮件群发反屏蔽的原理是这样的:
    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 ;
    存储过程,美丽优雅的波浪,呵呵....

你可能感兴趣的:(oracle)