2

Oracle PL/SQL パッケージで電子メールを複数の受信者に送信する方法は? Oracle パッケージ内に以下の pl/sql プロシージャがありますが、これは 1 つのレシーバーに対してのみ機能します。「To: David Festool; Peter Makita; John Dewalt」のように、同時に複数の受信者にメールを送信できるように機能を改善する必要があります。どんな体でも私を助けることができます。修正したコードを教えてください。


procedure email(p_recip   in varchar2,
                p_subject in varchar2,
                p_message in varchar2) is

  c   utl_smtp.connection;
  msg varchar2(4000);

  procedure send_header(name in varchar2, header in varchar2) as
  begin
    utl_smtp.write_data(c, name || ': ' || header || utl_tcp.crlf);
  end;
begin
  --Open SMTP connection
  c := utl_smtp.open_connection('ExchangeServerName');

  -- Write SMTP header
  utl_smtp.helo(c, 'ExchangeServerName');
  utl_smtp.mail(c, 'Email@MyCompany.on.ca');
  utl_smtp.rcpt(c, p_recip);
  utl_smtp.open_data(c);
  send_header('From', '"Title" <Email@MyCompany.on.ca');
  send_header('To', p_recip);
  send_header('Subject', p_subject);
  send_header('Mime-Version', '1.0');
  send_header('Content-Type', 'multipart/mixed; boundary="DMW.Boundary.605592468"');

  -- Write MIME boundary line for the message body
  msg := utl_tcp.crlf || '--DMW.Boundary.605592468' || utl_tcp.crlf ||
         'Content-Type: text/plain' || utl_tcp.crlf ||
         'Content-Transfer-Encoding: 7bit' || utl_tcp.crlf ||
         utl_tcp.crlf;
  utl_smtp.write_data(c, msg);

  -- Write message body
  utl_smtp.write_data(c, p_message || utl_tcp.crlf);

  -- Clean up
  utl_smtp.close_data(c);
  utl_smtp.quit(c);
exception
  when utl_smtp.transient_error or utl_smtp.permanent_error then
    begin
      utl_smtp.quit(c);
    exception
      when utl_smtp.transient_error or utl_smtp.permanent_error then
        null;
        -- When the SMTP server is down or unavailable, we don't have
      -- a connection to the server. The QUIT call will raise an
      -- exception that we can ignore.
    end;

    raise_application_error(-20000, 'Failed to send mail due to the following error: ' ||
                             sqlerrm);
end;
--------------------------------------------------------------
4

3 に答える 3

8

utl_smtp.rcpt受信者ごとに 1 回ずつ、複数回呼び出す必要があります。1 回の呼び出しで値のリストを与えることはできません。

UTL_SMTP.RCPT ドキュメントから:

メッセージを複数の受信者に送信するには、このルーチンを複数回呼び出します。呼び出しごとに、1 つの電子メール アドレスへの配信がスケジュールされます。

つまり、個々のアドレスを解析して満足しない限り、実際には名前の文字列を渡すことはできません。おそらく、値の配列を渡す方が簡単でしょう。

TOヘッダーは別の問題です。私の記憶が正しければ、それは実際には表示用であり、(または) ヘッダーではなくrcptとしてアドレスを持つことが、 BCC の実装方法です。引用は必要ですが...TOCC

これは、これを示す古いAskTomの記事です。ただし、UTL_MAIL を使用するという jonearles の提案は調査する必要があります。

于 2013-07-18T22:53:22.330 に答える
1

形式は次のとおりです。

UTL_MAIL.SEND (sender, recipientlist, cc, bcc, subject, Message, mime_type, priority)

recipientlist、cc、および bcc パラメーターはすべて、受信者、コピー先、およびブラインド コピーの電子メール アドレスのコンマ区切りリストです。

送信者、件名、メッセージ、および mime_type パラメーターはすべて単一項目フィールドです。

于 2014-07-30T07:40:05.527 に答える