什么时候在Oracle 10中打开UTL_MAIL连接

Dan*_*Dan 4 sql email oracle plsql

我有一个pl/sql程序,通过电子邮件发送给很多人(20,000+).我的问题与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;
/
Run Code Online (Sandbox Code Playgroud)

我想知道连接是否每个人打​​开一次,或者是否为第一个人打开,并保持打开直到程序完成?

如果每个人打开一次 - 这是不好的编码?如果我遇到不良数据会轰炸吗?

如果需要更多信息,请询问.谢谢!!

Ann*_*awn 6

UTL_MAIL隐藏了下面的SMTPAPI UTL_SMTP.通常优选易于使用.如果你看到,UTL_SMTP你会发现你必须utl_smtp.Rcpt为每个电子邮件地址做一个,不幸的是它一次只接受一个电子邮件ID.因此,对多个电子邮件地址说这个基础逻辑是相同的,即循环通过电子邮件地址并呼叫utl_smtp.Rcpt每个电子邮件地址.更好的解决方案是使用电子邮件分发列表,即一个电子邮件ID,其中包含一组其他电子邮件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;
Run Code Online (Sandbox Code Playgroud)

我没有看到代码看起来像编程方式有任何糟糕的编程,如果你有多个电子邮件ID,它是唯一的方法.Oracle引擎需要将电子邮件有效负载提交给SMTP服务器(由你指定)每个电子邮件ID,例如将消息提交到队列.一个相当明显的建议是创建一些分发列表,其中包含一堆均匀分布的电子邮件ID,并使用DL ID而不是实际的电子邮件ID.

这是我的" 问汤姆 "问题之一,可能会清楚这一点.

另一种快速方法是修改您的代码以构建逗号分隔的电子邮件地址字符串,因为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;
/
Run Code Online (Sandbox Code Playgroud)