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

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


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

простых сообщений по электронной почте можно использовать пакет UTL HTTP; пример представлен в соответствующем разделе приложения А). Так что, если вы можете использовать пакет UTL SMTP, обратитесь на сайт компании Sun и загрузите интерфейс JavaMail. Это позволит посылать из базы данных более сложные сообщения, включающие вложения. Дальнейшее изложение основано на результатах работы моего коллеги, Марка Пьермарини (Mark Piermarini), который помогает мне решить множество проблем, связанных с использованием языка Java.

Обратившись к странице http: java.sun.com/products/javamal/index.html, вы сможете загрузить с нее интерфейс JavaMail API. B загруженном архиве будет несколько сотен файлов, из которых понадобится только один. После загрузки интерфейса JavaMail API не забудьте также загрузить расширения JavaBeans Activation Framework, или JAF javax.activation). Это необходимо для работы пакета JavaMail.

После загрузки этих двух наборов файлов извлеките из архива JavaMail API файл mail.jar, а из архива JAF - файл activation.jar. Нам понадобятся только они, но вы можете прочитать соответствующую документацию и обнаружить множество других возможностей, которые мы не используем. Мы используем только часть интерфейса, связанную с передачей сообщений по электронной почте. Интерфейс включает также функции получения сообщений по протоколам IMAP, POP и другие средства.

С помощью loadjava загрузите в базу данных архивы mail.jar и activation.jar, но перед этим их необходимо упаковать в другом формате. Эти jar-файлы упакованы в формате, который не понимает интерпретатор байт-кода сервера. Необходимо распаковать ( unjar ) и снова упаковать ( rejar ) без сжатия или использовать средства типа WinZip для переупаковки их в виде zip-файла. В Windows 2000 я делал следующее:

с помощью WinZip распаковывал содержимое файла mail.jar в каталог c:\temp\mail;

с помощью WinZip создавал новый архив, c:\temp\mail8i.zip;

помещал в этот новый архив содержимое c:\temp\maiI\*.*, в том числе подкаталоги.

То же самое я проделал для activation.jar, заменяя mail на activation. Теперь все готово для загрузки полученных zip-файлов (или jar-файлов, если вы заархивировали их в этом формате) в базу данных. Файлы должны загружаться в базу данных от имени пользователя SYS, поскольку они включают защищенные пакеты Java, которые обычным пользователям загружать не разрешено. Используем следующие команды loadjava:

loadjava -u sys/manager -o -r -v -f -noverify -synonym -g public activation8i.zip

loadjava -u sys/manager -o -r -v -f -noverify -synonym -g public mail8i.zip

Где:

u sys/manager - идентификатор и пароль пользователя SYS. Защищенные пакеты должны загружаться от имени пользователя SYS.

о - сокращение для -oci8. Я использую драйвер oci8. Вы можете использовать и thin-драйвер, но тогда команду придется соответственно изменить.



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

1789

r - сокращение для -resolve. Выполняется разрешение всех внешних сс1лок в заг-руженн1х классах; это позволяет убедиться, что Java-классы после загрузки смогут работать.

v - сокращение для -verbose. Эта опция обеспечивает выдачу сообщений по ходу работы программы loadjava, т.е. можно следить за ходом выполнения.

f - сокращение для -force. При первой загрузке эту опцию указывать необязательно, но не помешает. Если при выполнении команды loadjava произойдет ошибка, можно будет исправить ее и повторить загрузку. В этом случае придется либо сначала удалить jar-файл из базы данных с помощью команды dropjava, либо указать опцию -force. Использование опции -force упрощает повторную загрузку.

noverily - не проверять байт-код. Для выполнения этой опции необходимо получить привилегию oracle.aurora.security.JServerPermission(Verifier). Кроме того, эту опцию необходимо указывать вместе с опцией -r. Пользователь SYS имеет соответствующую привилегию. Опцию необходимо указывать, потому что средства проверки байт-кода сообщат о проблемах в файле mail.jar, а так мы сможем его успешно загрузить.

synonym - создает общедоступные синонимы для классов. Поскольку мы не создаем от имени пользователя SYS пакет, использующий эти Java-классы, эта опция позволит нам увидеть классы, загруженные от имени SYS.

g public - предоставляет привилегию execute на загруженные классы роли

PUBLIC. Если это нежелательно, укажите после -g только имя пользователя, в схеме которого будут создавать процедуры отправки почты, например -g UTILITY ACCT.

Подробнее о программе loadjava и ее опциях можно почитать в руководстве OracleSi JavaDevelopers Guide.

После загрузки этих пакетов все готово для создания хранимой процедуры на языке Java, фактически обеспечивающей передачу сообщений. Процедура, обращаясь к интерфейсу JavaMail API, позволит создать в PL/SQL связывающую функцию с такой спецификацией:

tkyte@TKYTE816>desc send FUNCTION send RETURNS NUMBER

Argument Name

Type

P FROM

VARCHAR2

P TO

VARCHAR2

P CC

VARCHAR2

P BCC

VARCHAR2

P SUBJECT

VARCHAR2

P BODY

VARCHAR2

P SMTP HOST

VARCHAR2

P ATTACHMENT DATA

BLOB

P ATTACHMENT TYPE

VARCHAR2

P ATTACHMENT FILE NAME

VARCHAR2

Default?



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

Эта функция позволит использовать списки адресатов CC и BCC и посылать вложения. В качестве упражнения предлагаю читателю реализовать передачу массивов объектов типа BLOB или перезагрузку этой функции для работы с вложениями типа CLOB или BFILE.

Далее представлена соответствующая хранимая процедура на Java. Она использует базовые средства интерфейса класса JavaMail API и весьма проста. Мы снова не будем вникать в детали использования JavaMail API (этому можно посвятить отдельную книгу), рассмотрим только основы. Представленный ниже класс mail имеет один метод, send. Именно этот метод мы будем использовать для передачи сообщения. В представленной реализации он возвращает число 1 в случае успешной передачи и 0 - в противном случае. Эта реализация очень проста, можно предложить куда более сложную, поддерживающую вложение данных многих других типов (CLOB, BFILE, LONG и т.д.). Можно также выдавать вызывающему точную причину ошибки, полученную с сервера SMTP, например invalid recipient, no transport.

tkyte@TKYTE816>create or replace and compile

2 java source named mail

3 as

4 import java.io.*;

5 import java.sql.*;

6 importjava.util.Properties;

7 import java.util.Date;

8 import javax.activation.*;

9 import javax.mail.*;

10 import javax.mail.internet.*;

11 import oracle.jdbc.driver.*;

12 import oracle.sql.*;

14 public class mail

15 {

16 static String dftMime = application/octet-stream ;

17 static String dftName = filename.dat ;

19 public static oracle.sql.NUMBER

2 0 send(String from,

21 String to,

22 String cc, 2 3 String bcc,

24 String subject,

2 5 String body,

2 6 String SMTPHost,

2 7 oracle.sql.BLOB attachmentData,

2 8 String attachmentType,

29 String attachmentFileName)

Представленный выше список аргументов соответствует спецификации вызова в PL/SQL, которая была показана ранее, - назначение аргументов вполне очевидно. Разъяснений требуют лишь два: attachmentType и attachmentFileName. В качестве attachmentType необходимо указывать тип MIME (Multi-purpose Internet Mail Extensions - многоцелевые расширения электронной почты для Internet), с которым вы могли встре-



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

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