Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_SMTP multiple recipients / 7 сообщений из 7, страница 1 из 1
24.01.2011, 13:58
    #37075349
Edgar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
Мне требуется послать мэйл нескольким получателям.

Код: 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
24.01.2011, 16:41
    #37075842
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
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
Период между сообщениями больше года.
26.02.2016, 14:46
    #39179885
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
Весь моск сломал...(

Почему у меня вот так отсылается письмо без проблем:
Код: 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
26.02.2016, 14:55
    #39179890
LETME
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
Фууххх...

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

Код: 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
30.01.2017, 07:46
    #39394340
неавтор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
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
30.01.2017, 08:47
    #39394351
неавтор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTL_SMTP multiple recipients
вот тут каждый список используется по два раза
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
30.01.2017, 14:11
    #39394662
UTL_SMTP multiple recipients
неавтор, то, что вставляется в письмо, и кому рассылать - это две разные сучности.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UTL_SMTP multiple recipients / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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