Для давнишнего проекта нужно было отсылать технические уведомления по почте. Помню, нашел какой то стандартный простейший пример на сайте ORACLE, попробовал. Вроде бы все проходит, а кодировка косячная. Немножко изменил код - все заработало как надо. Здесь привожу тестовый исходник, который правильно заработал после правки. Единственный минус этого примера - то, что письма можно слать только в plain text'е. Эта проблема впоследствии тоже была решена, но это уже совсем другая история.
declare -- Объявляем переменные mailhost VARCHAR2(64) := 'smtp.server.name.at.domain.name'; sender VARCHAR2(64) := 'sender@domain.name'; recipient VARCHAR2(32000) := 'recipient@domain.name'; subject VARCHAR2(254) := 'Тема письма'; message VARCHAR2(32000) := 'Привет, я - отправленное письмо'; mail_conn utl_smtp.connection; -- Отправка заголовков procedure out_header( p_Header IN VARCHAR2, p_Data IN VARCHAR2 ) is begin utl_smtp.write_raw_data(mail_conn, utl_raw.CONVERT(utl_raw.cast_to_raw(p_Header || ': ' || p_Data), 'RUSSIAN_CIS.CL8MSWIN1251', 'RUSSIAN_CIS.CL8MSWIN1251')); utl_smtp.write_data(mail_conn, utl_tcp.crlf); end; -- Отправка данных procedure out_data( p_Data IN VARCHAR2 ) is begin utl_smtp.write_raw_data(mail_conn, utl_raw.CONVERT(utl_raw.cast_to_raw(p_Data), 'RUSSIAN_CIS.CL8KOI8R', 'RUSSIAN_CIS.CL8MSWIN1251')); utl_smtp.write_data(mail_conn, utl_tcp.crlf); end; begin -- соединяемся, шлем информацию о соединении mail_conn := utl_smtp.open_connection(mailhost, 25); utl_smtp.helo(mail_conn, mailhost); utl_smtp.mail(mail_conn, sender ); utl_smtp.rcpt(mail_conn, recipient); -- начинаем отправлять заголовок utl_smtp.open_data(mail_conn); out_header('MIME-Version', '1.0'); out_header('Content-Type', 'text/plain;'); out_header('From', sender); out_header('To', recipient); out_header( 'Subject', subject || utl_tcp.crlf); -- Шлем данные (plain text) out_data (message ); -- Закрываем соединение utl_smtp.close_data(mail_conn); utl_smtp.quit(mail_conn); end;
Комментариев нет:
Отправить комментарий