|
Программирование >> Oracle
Пакет 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 в базе данных не включена, для передачи
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |