powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_SMTP multiple recipients
7 сообщений из 7, страница 1 из 1
UTL_SMTP multiple recipients
    #37075349
Edgar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне требуется послать мэйл нескольким получателям.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
c utl_smtp.connection;
rc integer;
msg_to varchar2( 200 ):='abc1@mail.ru,abc2@mail.ru,abc3@mail.ru,abc4@mail.ru,';
msg_cc varchar2( 200 ):='abc1@mail.ru,abc2@mail.ru,abc3@mail.ru,abc4@mail.ru,';

mailhost VARCHAR2( 30 ) := 'mail.host.local'; 

BEGIN
	c := utl_smtp.open_connection(mailhost,  2525 ); 
	utl_smtp.helo(c, mailhost);
	utl_smtp.mail(c, msg_from);
	utl_smtp.rcpt(c, msg_to);
	
	utl_smtp.data(c,'From: ROBOT'|| utl_tcp.crlf ||
	'Content-Type: text/html;"'  || utl_tcp.crlf ||
	'To: ' || msg_to || utl_tcp.crlf ||
	'Cc: ' || msg_cc || utl_tcp.crlf ||
	'Subject: ' || msg_subject ||
	utl_tcp.crlf || msg_text);
	utl_smtp.quit(c);
END

насколько я понял utl_smtp.rcpt(c, msg_to); надо вызывать в цикле столько раз сколько есть получателей - пожалуйста подтвердите.
А как CSV строчку разбить и вызывать в цикле?
я подумал так:

Код: plaintext
1.
2.
3.
4.
5.
i:= 0 ;j:= 0 ;
while j < length(msg_to) loop
  i:=instr(msg_to,',',j) ;
  utl_smtp.rcpt(c, substr(msg_to,i,j));
  j:=i+ 1 ;
end loop;
так?
...
Рейтинг: 0 / 0
UTL_SMTP multiple recipients
    #37075842
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edgar...
насколько я понял utl_smtp.rcpt(c, msg_to); надо вызывать в цикле столько раз сколько есть получателей - пожалуйста подтвердите.
А как CSV строчку разбить и вызывать в цикле?
я подумал так:

Код: plaintext
1.
2.
3.
4.
5.
i:= 0 ;j:= 0 ;
while j < length(msg_to) loop
  i:=instr(msg_to,',',j) ;
  utl_smtp.rcpt(c, substr(msg_to,i,j));
  j:=i+ 1 ;
end loop;
так?да, всё правильно каждого получателя отдельно в формате: 'abc1@mail.ru'
цикл проверь, выведи на экран получателей, заменив utl_smtp.rcpt на dbms_output.put_line

проще в своей процедуре использовать массив строк, например, у Кайта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function address_email( p_string in varchar2,
                        p_recipients in array ) return varchar2
is
    l_recipients long;
begin
   for i in  1  .. p_recipients.count
   loop
      utl_smtp.rcpt(g_mail_conn, p_recipients(i) );
      if ( l_recipients is null ) 
      then
          --p_string 'To: '
          l_recipients := p_string || p_recipients(i) ;
      else
          l_recipients := l_recipients || ', ' || p_recipients(i);
      end if;
   end loop;
   return l_recipients;
end;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UTL_SMTP multiple recipients
    #39179885
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь моск сломал...(

Почему у меня вот так отсылается письмо без проблем:
Код: plsql
1.
 utl_smtp.rcpt(mail_conn, 'vasya@somemail.ru'); 



А так нет:

Код: plsql
1.
2.
3.
for z in (select 'vasya@somemail.ru' email from dual) loop
     utl_smtp.rcpt(mail_conn, z.email);
end loop;




И так нет:

Код: plsql
1.
2.
3.
for z in (select '''vasya@somemail.ru''' email from dual) loop
     utl_smtp.rcpt(mail_conn, z.email);
end loop;



ORA-29279 - ...Invalid address
...
Рейтинг: 0 / 0
UTL_SMTP multiple recipients
    #39179890
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фууххх...

Вот так заработало!

Код: plsql
1.
2.
3.
for z in (select '<vasya@somemail.ru>;' email from dual) loop
     utl_smtp.rcpt(mail_conn, z.email);
end loop;
...
Рейтинг: 0 / 0
UTL_SMTP multiple recipients
    #39394340
неавтор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EdgarМне требуется послать мэйл нескольким получателям.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare
c utl_smtp.connection;
rc integer;
msg_to varchar2(200):='abc1@mail.ru,abc2@mail.ru,abc3@mail.ru,abc4@mail.ru,';
msg_cc varchar2(200):='abc1@mail.ru,abc2@mail.ru,abc3@mail.ru,abc4@mail.ru,';

mailhost VARCHAR2(30) := 'mail.host.local'; 

BEGIN
	c := utl_smtp.open_connection(mailhost, 2525); 
	utl_smtp.helo(c, mailhost);
	utl_smtp.mail(c, msg_from);
	utl_smtp.rcpt(c, msg_to);
	
	utl_smtp.data(c,'From: ROBOT'|| utl_tcp.crlf ||
	'Content-Type: text/html;"'  || utl_tcp.crlf ||
	'To: ' || msg_to || utl_tcp.crlf ||
	'Cc: ' || msg_cc || utl_tcp.crlf ||
	'Subject: ' || msg_subject ||
	utl_tcp.crlf || msg_text);
	utl_smtp.quit(c);
END

подскажите, почему получатели указываются в двух местах, а копия - в одном?
...
Рейтинг: 0 / 0
UTL_SMTP multiple recipients
    #39394351
неавтор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот тут каждый список используется по два раза
https://oracle-base.com/articles/misc/email-from-oracle-plsql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
CREATE OR REPLACE PROCEDURE send_mail (p_to        IN VARCHAR2,
                                       p_cc        IN VARCHAR2 DEFAULT NULL,
                                       p_bcc       IN VARCHAR2 DEFAULT NULL,
                                       p_from      IN VARCHAR2,
                                       p_subject   IN VARCHAR2,
                                       p_message   IN VARCHAR2,
                                       p_smtp_host IN VARCHAR2,
                                       p_smtp_port IN NUMBER DEFAULT 25)
AS
  l_mail_conn   UTL_SMTP.connection;
  
  PROCEDURE process_recipients(p_mail_conn IN OUT UTL_SMTP.connection,
                               p_list      IN     VARCHAR2)
  AS
    l_tab string_api.t_split_array;
  BEGIN
    IF TRIM(p_list) IS NOT NULL THEN
      l_tab := string_api.split_text(p_list);
      FOR i IN 1 .. l_tab.COUNT LOOP
        UTL_SMTP.rcpt(p_mail_conn, TRIM(l_tab(i)));
      END LOOP;
    END IF;
  END;
BEGIN
  l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  UTL_SMTP.helo(l_mail_conn, p_smtp_host);
  UTL_SMTP.mail(l_mail_conn, p_from);
  process_recipients(l_mail_conn, p_to);
  process_recipients(l_mail_conn, p_cc);
  process_recipients(l_mail_conn, p_bcc);

  UTL_SMTP.open_data(l_mail_conn);
  
  UTL_SMTP.write_data(l_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  IF TRIM(p_cc) IS NOT NULL THEN
    UTL_SMTP.write_data(l_mail_conn, 'CC: ' || REPLACE(p_cc, ',', ';') || UTL_TCP.crlf);
  END IF;
  IF TRIM(p_bcc) IS NOT NULL THEN
    UTL_SMTP.write_data(l_mail_conn, 'BCC: ' || REPLACE(p_bcc, ',', ';') || UTL_TCP.crlf);
  END IF;
  UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
  UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf || UTL_TCP.crlf);
  
  UTL_SMTP.write_data(l_mail_conn, p_message || UTL_TCP.crlf || UTL_TCP.crlf);
  UTL_SMTP.close_data(l_mail_conn);

  UTL_SMTP.quit(l_mail_conn);
END;
/
...
Рейтинг: 0 / 0
UTL_SMTP multiple recipients
    #39394662
неавтор, то, что вставляется в письмо, и кому рассылать - это две разные сучности.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_SMTP multiple recipients
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]