2012-09-14 3 views
4

나는 많은 사람들 (20,000 명 이상)에게 이메일을 보내는 pl/sql 프로 시저를 가지고있다. 내 질문은 utl_mail 패키지와 관련이 있으며, 실제로 전자 메일 서버에 대한 연결이 열렸을 때 발생합니다.Oracle에서 UTL_MAIL 연결이 언제 열리는가?

예 :

BEGIN 
... 
OPEN CUR_person; 
FETCH CUR_person INTO REC_person;  
WHILE CUR_person%FOUND 

LOOP 
    UTL_MAIL.send(sender => '[email protected]', 
       recipients => '[email protected]', 
       subject => 'Test Mail', 
       message => 'Hello World', 
       mime_type => 'text/html'); 
FETCH CUR_person INTO REC_person;     
END LOOP; 

... 
END; 
/

내가 연결이 한 번 인당 연됩니다 궁금하거나 한 것이 처음 사람을 위해 열리고, 절차가 완료 될 때까지 열려 있다면?

일인당 한 번 열리면 나쁜 코딩입니까? 내가 나쁜 데이터를 만난다면 폭탄은 터질 것인가?

더 많은 정보가 필요하면 질문하십시오. 감사!!

+0

예, UTL_MAIL.send의 각 실행이 열리고로 삼았, 이메일 주소의 쉼표로 구분 된 문자열을 구축하기 위해 코드를 수정하는 것 메일 서버에 대한 연결을 닫습니다. 그러나 이것이 문제인지 여부는 처리중인 행 수, 이메일에있는 데이터의 양 및 프로 시저가 호출되는 빈도에 따라 달라집니다. 숫자가 낮 으면 큰 문제가되지 않을 것입니다. –

답변

6

UTL_MAILSMTP API 인 UTL_SMTP을 숨 깁니다. 일반적으로 사용하기 쉽기 때문에 바람직합니다. 표시되는 경우 UTL_SMTP을 입력하면 각 이메일 주소에 utl_smtp.Rcpt을 입력해야하며 불행히도 한 번에 하나의 이메일 ID 만 허용됩니다. 따라서 두 개 이상의 이메일 주소에 대해 이렇게 말한 경우 기본 로직은 이메일 주소를 반복하고 각 이메일 주소에 utl_smtp.Rcpt을 호출합니다. 이것에 대한 더 나은 해결책은 전자 우편 배포 목록, 즉 다른 이메일 아이디 그룹을 가진 하나의 이메일 아이디를 사용하는 것입니다. 그래서, UTL_SMTP으로 내가 당신의 코드처럼 보이는 방법으로 어떤 나쁜 프로그래밍, 여러 이메일 id's.Oracle 엔진이있는 경우 그것을 할 수는 오히려 유일한 방법이 표시되지 않는

declare 
    v_From  VARCHAR2(80) := '[email protected]'; 
    v_cc  VARCHAR2(80) := 'geth[email protected]'; 
    v_Recipient VARCHAR2(80) := '[email protected]'; 
    v_Subject VARCHAR2(80) := 'test Subject'; 
    v_Mail_Host VARCHAR2(50) := 'hub.fun.com'; 
    v_Mail_Conn utl_smtp.Connection; 
    crlf  VARCHAR2(2) := chr(13)||chr(10); 
begin 

v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25); 
utl_smtp.Helo(v_Mail_Conn, v_Mail_Host); 
utl_smtp.Mail(v_Mail_Conn, v_From); 

utl_smtp.Rcpt(v_Mail_Conn, v_Recipient); 
utl_smtp.Rcpt(v_Mail_Conn, v_cc); -- To CC recepient 

utl_smtp.Data(v_Mail_Conn, 
    'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf || 
    'From: ' || v_From || crlf || 
    'Subject: '|| v_Subject || crlf || 
    'To: '  || v_Recipient || crlf || 
    'Cc: '  || v_cc || crlf || 
    'Content-Type: text/html;' ||crlf || 
    'Hello this is a test email'); 

utl_smtp.Quit(v_mail_conn); 
end; 

below-과 같이 보입니다 대기열에 메시지를 제출하는 것과 같이 각 이메일 ID에 대해 (사용자가 지정한대로) SMTP 서버에 이메일 페이로드를 제출해야합니다. 오히려 분명한 제안은 균등하게 분산 된 이메일 ID가 여러 개있는 Distribution List 두 개를 만들고 실제 이메일 ID가 아닌 DL ID를 사용하는 것입니다.

이것은 내 "Ask Tom"질문 중 하나입니다. UTL_MAIL는 쉼표로 구분 된 이메일 주소를 수용 할 수있는

또 다른 빠른 방법은

BEGIN 
... 
email_list VARCHAR2(10000) := NULL; 
email_count NUMBER(10) := 0; 
FOR c_rec in CUR_person 
LOOP 
    email_list := c_rec.CUR_person || ' , ' || email_list; 
    email_count := email_count +1; 
    if (email_count = 100) --100 email ids at a time 
    then 
     UTL_MAIL.send(sender => '[email protected]', 
       recipients => email_list, 
       subject => 'Test Mail', 
       message => 'Hello World', 
       mime_type => 'text/html'); 
     email_list := NULL; 
     email_count := 0; 
    end if; 
END LOOP 

... 
END; 
/
+0

굉장한 대답, 고마워요! – Dan