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

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


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

Пакет UTL SMTP, впервые появившийся в версии Oracle 8.1.6, представляет собой интерфейс к протоколу Simple Mail Transfer Protocol (простой протокол передачи электронной почты). Он требует наличия в сети SMTP-сервера. Обычно в сети организаций работает по крайней мере один SMTP-сервер, поскольку протокол SMTP является наиболее популярным способом отправки сообщений электронной почты.

Пакет UTL SMTP лучше всего подходит для отправки небольших текстовых сообщений из базы данных. Хотя он и поддерживает передачу вложений в любых форматах, но формировать документ с вложениями (multi-part document), например преобразовы-ватьдвоичные файлы-вложения в документы, закодированные с помощью средств mime, должен сам пользователь.

Здесь я возвращаюсь к примеру, который мы рассматривали в разделе, посвященном пакету DBMS JOB (в этом примере использовались средства пакета UTL SMTP), но добавлю к созданному в нем пакету новые функциональные возможности. Мы также рассмотрим альтернативы пакету UTL SMTP, обеспечивающие больше возможностей, включая отправку вложений вместе с сообщениями. Поскольку SMTP - протокол низкого уровня, используем существующий общедоступный код для создания интерфейса более высокого уровня к протоколу SMTP; для этого понадобится очень немного кода.

UTL SMTP - расширенный пример использования

В разделе, посвященном пакету DBMS JOB, мы разобрались, как посылать сообщения электронной почты с помощью протокола UTL SMTP, а также создавать види-



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

мость быстрой передачи, за счет асинхронного ее выполнения. В этом разделе мы также обеспечили включение передачи сообщений в транзакцию; при откате транзакции сообщение не отправлялось, а при фиксации - отправлялось. Поэтому я настоятельно рекомендую использовать пакет DBMS JOB как дополнительный уровень интерфейса при создании средств передачи сообщений. Ранее в примере рассматривалась следующая процедура, работающая с пакетом UTL SMTP:

tkyte@TKYTE816>create or replace

2 PROCEDURE send mail (p sender IN VARCHAR2,

3 p recipient IN VARCHAR2,

4 p message IN VARCHAR2)

5 as

6 l mailhost VARCHAR2(255) := yourserver.acme.com1;

7 l mail conn utl smtp.connection;

8 BEGIN

9 l mail conn :=utl smtp.open connection(l mailhost, 25);

10 utl smtp.helo(l mail conn, l mailhost);

11 utl smtp.mail(l mail conn, p sender) ;

12 utl smtp.rcpt(l mail conn, p recipient) ;

13 utl smtp.open data(l mail conn);

14 utl smtp.write data(l mail conn, p message) ;

15 utl smtp.close data(l mail conn);

16 utl smtp.quit (l mail conn);

17 end;

18 /

Procedure created.

tkyte@TKYTE816> begin

2 send mail(me@acme.com,

3 you@acme.com,

4 Hello Tom) ;

5 end;

PL/SQL procedure successfully completed.

Эта процедура работает, но ее возможности весьма ограничены. Она посылает сообщение только одному адресату, т.е. нельзя посылать копии (CC - Carbon Copy) или скрытые копии (BCC - Blind Carbon Copy), нельзя задать тему сообщения (сообщение всегда приходит с пустой строкой темы. Хотелось бы поддержать больше вариантов посылки сообщений.

Полное описание всех возможностей пакета UTL SMTP требует глубокого изучения протокола SMTP, что в1ходит за рамки книги. Читатели, котор1х интересуют все возможности протокола SMTP, должны обратиться к рабочему документу RFC812, описанию протокола SMTP. Его можно получить по адресу http: www.faqs.org/rfcs/ rfc821.html. Ниже я кратко опишу, как послать с помощью пакета UTL SMTP сообщение, в котором поддерживаются:

несколько адресатов To;

несколько адресатов CC;



1784 Приложение А

несколько адресатов BCC;

размер текста до 32 Кбайт;

строка темы;

описательная строка from (так, что в клиенте в поле From: указывается не только адрес электронной почты отправителя).

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

tkyte@TKYTE816> create or replace package mail pkg

2 as

3 type array is table of varchar2(255); 4

5 procedure send(p sender e-mail in varchar2,

6 p from in varchar2,

7 p to in array default array(),

8 p cc in array default array() ,

9 p bcc in array default array() ,

10 p subject in varchar2,

11 p body in long);

12 end;

13 / Package created.

Тело пакета, реализующего перечисленные возможности, покажется достаточно простым, если понимать основы работы протокола SMTP, a также структуру сообщения электронной почты (как клиенты получают поля From, To, CC и т.д.)- Прежде чем изучать код, давайте разберемся, какую структуру может иметь сообщение. Рассмотрим следующий текст:

From: Oracle Database Account <me@acme.com>

Subject: This is subject

To: you@acme.com, us@acme.com

Cc:them@acme.com

Hello Tom, this is the mail you need

Именно это надо передать в качестве текста сообщения с помощью пакета UTL SMTP, чтобы клиент электронной почты установил значения полей From, Subject и т.д. Для этого нет специальных команд в протоколе SMTP; заголовки помещаются в сообщение и отделяются от текста сообщения пустой строкой. Разобравшись в этом, послать сообщение со всеми необходимыми опциями будет очень легко. Для того чтобы послать сообщение нескольким адресатам, надо вызвать UTL SMTP.RCPT несколько раз с различными адресами.

Итак, переходим к телу пакета. Оно начинается с объявления глобальных переменных. Разумеется, необходимо заменить в коде значение g mailhost, указав имя сервера, к которому вы имеете доступ. Я указал формальное имя, yourserver.acme.com:

tkyte@TKYTE816> create or replace package body mail pkg 2 as



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

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