4

多くの人(20,000人以上)にメールを送信するpl/sqlプロシージャがあります。私の質問は、utl_mail パッケージと、接続が実際に電子メール サーバーに対して開かれたときに関するものです。

例:

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

LOOP
  UTL_MAIL.send(sender => 'me@address.com',
                recipients => 'you@address.com',
                subject => 'Test Mail',
                message => 'Hello World',
                mime_type => 'text/html');
FETCH CUR_person INTO REC_person;                  
END LOOP;

...
END;
/

接続は 1 人につき 1 回開かれるのか、それとも最初の人のために開かれ、手順が完了するまで開いたままになるのか疑問に思っていました。

1 人につき 1 回開かれる場合、それは悪いコーディングですか? 不良データに遭遇した場合、爆撃しますか?

さらに情報が必要な場合は、お問い合わせください。ありがとう!!

4

1 に答える 1

6

UTL_MAILである下にあるSMTPAPI を非表示にしますUTL_SMTP。これは、一般的に使いやすさのために好まれます。ご覧のとおり、メール アドレスごとUTL_SMTPに を実行する必要があり、残念ながら一度に 1 つのメール ID しか受け付けないことに気付くでしょう。utl_smtp.Rcptしたがって、複数の電子メール アドレスに対してこれを言ったので、基本的なロジックは同じです。つまり、電子メール アドレスをループして、utl_smtp.Rcpt各電子メール アドレスを呼び出します。これに対するより良い解決策は、電子メール配信リスト、つまり他の電子メール ID のグループを持つ 1 つの電子メール ID を使用することです。それで、UTL_SMTPそれは以下のようになります-

declare
  v_From      VARCHAR2(80) := 'yourhelper@fun.com';
  v_cc        VARCHAR2(80) := 'gethelp@fun.com';  
  v_Recipient VARCHAR2(80) := 'yourhelper@fun.com';
  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;

あなたのコードがどのように見えるかという点で悪いプログラミングは見当たりません. 複数の電子メールIDを持っている場合、それを行う唯一の方法です.メッセージをキューに送信するなど、各電子メール ID。かなり明白な提案は、均等に分散された一連の電子メール ID を持ついくつかの配布リストを作成し、実際の電子メール ID ではなく DL ID を使用することです。

これは、これを少しクリアするかもしれない私の " Ask Tom " の質問の 1 つです。

別の簡単な方法は、コードを変更して、カンマ区切りのメールアドレスを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 => 'me@address.com',
                recipients => email_list,
                subject => 'Test Mail',
                message => 'Hello World',
                mime_type => 'text/html');
       email_list := NULL; 
       email_count := 0; 
   end if;
END LOOP

...
END;
/
于 2012-09-14T14:47:35.967 に答える