Программирование >>  Oracle 

1 ... 451 452 453 [ 454 ] 455 456 457 ... 469


Пакет UTL SMTP и отправка электронной почт

1785

4 g crlf

5 g mail conn

6 g mailhost

char(2)defaultchr(13)chr(10);

utl smtp.connection;

varchar2(2 55) := yourserver.acme.com;

Далее идет служебная (не опубликованная) функция для передачи сообщения нескольким адресатам - она, по сути, формирует адреса для сообщения. В то же время, она формирует строки То: или CC:, которые посылаются как часть текста сообщения, и возвращает строку в соответствующем формате. Функция реализована отдельно, поскольку это действие придется выполнять отдельно для списков адресатов To, CC и BCC:

function

return varchar2

10 11 12 13 14 15 16

18 19 20 21

25 26

address email(p string in varchar2 , p recipients in array)

long;

p recipients.count

p recipients(i));

l recipients begin

for i in 1 ..

loop

utl smtp.rcpt(g mail conn, if (l recipients is null)

then

l recipients :=p string

else

l recipients := l recipients end if; end loop;

return l recipients;

end;

p recipients(i) ;

, p recipients(i);

Теперь рассмотрим функцию, входящую в спецификацию, - с ее помощью пользователи и будут пос1лать сообщения. Она начинается со служебной процедуры writeData, упрощающей передачу заголовков сообщения (записей To:, From:, Subject:). Если запись заголовка не пуста, процедура будет использовать для ее передачи соответствующий вызов пакета UTL SMTP, добавляя необходимую метку конца строки (возврат каретки/перевод строки):

27 procedure send(p sender email in varchar2.

30 31

34 is

38 39

l to list l cc list l bcc list l date

p from

p to p bcc

p subject p body

long; long; long;

in varchar2 default NOLL, in array default array() , in array default array() , in array default array() , in varchar2 default NOLL, in long default NOLL)

varchar2(255) default to char(SYSDATE, ddMonyyhh2 4:mi:ss);



1786

Приложение А

41 procedure writeData(p text invarchar2)

42 as

43 begin

44 if (p text is not null)

45 then

46 utl smtp.write data(g mail conn, p text g crlf);

47 end if; 4 8 end;

Теперь все готово для передачи сообщения. Эта часть мало отличается от простейшей процедуры, с которой мы начали. Она начинается точно так же - с подключения к SMTP-серверу и организации сеанса:

49 begin

50 g mail conn :=utl smtp.open connection(g mailhost, 25); 51

52 utl smtp.helo(g mail conn, groailhost);

53 utl smtp.mail(g mail conn, p sender email); 54

Вот тут начинаются отличия - вместо однократного вызова UTL SMTP.RCPT мы вызываем функцию address email, которая (потенциально) может вызвать эту процедуру несколько раз, создавая попутно списки То: и CC:. Создается также список BCC:, но мы не буем включать его в сообщение (мы не хотим, чтобы адресаты видели этот список)

55 l to list :=address email(To: p to);

56 lcclist :=addressemail(Cc: , pcc);

57 lbcclist := addressemail(Bcc: , pbcc); 58

Теперь вызовем процедуру OPEN DATA, чтобы передать текст сообщения. Код в строках 61-68 генерирует раздел заголовков. Строка 69 посылает текст сообщения (его содержимое), а строка 70 завершает передачу.

59 utl smtp.open data(g mail conn); 60

61 writeData(Date: l date);

62 writeData(From: nvl( p from, p sender email));

63 writeData(Subject: nvl(p subject, (nosubject)));

65 writeData(l to list);

66 writeData(l cc list); 67

68 utl smtp.write data(g mail conn, g crlf);

69 utl smtp.write data(g mail conn, p body) ;

70 utl smtp.close data(g mail conn) ;

71 utl smtp.quit (g mail conn) ;

72 end;

75 end;



Пакет UTL SMTP и отправка электронной почты

1787

76 /

Package body created.

Работу этого пакета можно проверить следующим образом:

tkyte@TK:E816> begin

2 mail pkg.send

3 (p sender email => me@acme.com,

4 p from => Oracle Database Account <me@aone.com>,

5 p to=>mail pkg.array(you@acme.com,us@acme.com) ,

6 p cc => mail pkg.array( them@acme.com ) ,

7 p bcc => mail pkg.array(noone@dev.null),

8 p subject => This is a subject,

9 p body => Hello Tom, this is the mail you need) ;

10 end;

11 /

PL/SQL procedure successfully completed.

В результате генерируется сообщение со следующим текстом:

Date: 13 May 01 12:33:22

From: Oracle Database Account <me@acme.com Subject: This is a subject To:you@acme.com, us@acme.com Cc: them@acme.com

Hello Tom, this is the mail you need

Это сообщение пос1лается всем адресатам, включая noone@dev.null, хотя его адреса в тексте нет, поскольку он задавался в строке BCC:.

Этот пакет реализует наиболее типичные варианты использования средств стандартного пакета UTL SMTP. Ранее я написал, что он позволяет посылать сообщения с вложениями и т.п., но для этого пользователю придется немало потрудиться. Необходимо:

сформировать многосекционный документ, закодированный с помощью mime, что

само по себе непросто;

закодировать двоичные данные алгоритмом Base-64 (или любым аналогичным методом кодирования, таким так uuencode, binhex и т.д.).

Для этого потребуется (по скромной оценке) написать несколько сотен, если не тысяч, строк PL/SQL-кода. Вместо этого я рекомендую использовать уже написанный и очень надежный интерфейс JavaMail, который рассматривается далее.

Загрузка и использование интерфейса JavaMail

Чтобы использовать пакет UTL SMTP, поддержка языка Java должна быть сконфигурирована в базе данных на сервере Oracle 8i. Дело в том, что пакет UTL SMTP использует средства пакета UTL TCP, а тот, в свою очередь, построен на основе Java-функций. (Помните: если поддержка языка Java в базе данных не включена, для передачи



1 ... 451 452 453 [ 454 ] 455 456 457 ... 469

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика