I have written small anonymous block which sends an email :
DECLARE
vSender VARCHAR2(30) := 'support@leo.com';
vRecip VARCHAR2(30) := 'r.d@leosoftsys.com';
vSubj VARCHAR2(50) := 'test';
vMesg VARCHAR2(4000) := 'test';
vMType VARCHAR2(30) := 'text/plain; charset=us-ascii';
BEGIN
utl_mail.send
(vSender, vRecip, NULL, NULL, vSubj, vMesg, vMType, NULL);
END;
When i execute this plsql blcock i am getting error as :
ORA-29279: SMTP permanent error: 550 5.7.1 <r.d@leo.com>: Recipient address rejected: Mail appeared to be SPAM or forged. Ask your Mail/DNS-Administrator to correct HELO and DNS MX settings or to get removed from DNSBLs; MTA helo: w010a893.k, MTA hostname: p50936657.dip0.t-ipconnect.de[80.147.102.87] (helo/hostname mismatch)
ORA-06512: at "SYS.UTL_MAIL", line 654
ORA-06512: at "SYS.UTL_MAIL", line 671
ORA-06512: at line 14
29279. 00000 - "SMTP permanent error: %s"
*Cause: A SMTP permanent error occurred.
*Action: Correct the error and retry the SMTP operation.
I’m getting an ORA-29279 error when running the below snipped. Suggest me if some issue in this
CREATE OR REPLACE PROCEDURE CPO.fsc_temp_MAIL (l_from IN VARCHAR2,
l_to IN VARCHAR2,
Subject IN VARCHAR2,
Mesg IN VARCHAR2,
Cc IN VARCHAR2 default null,
P_Html BOOLEAN := FALSE) IS
l_to1 VARCHAR2(32000) := l_to;
Mhost VARCHAR2(64) := '192.168.0.6';
crlf varchar2(2) := CHR(13) || CHR(10);
conn UTL_SMTP.connection;
Address varchar2(32700);
BEGIN
conn := UTL_SMTP.open_connection(Mhost,25);
UTL_SMTP.helo(conn, Mhost);
UTL_SMTP.mail(conn, l_from);
GET_TEMP_INFO_MAIL(conn,l_to1);
If Cc is not null then
GET_TEMP_INFO_MAIL(conn,Cc);
end if;
IF P_Html THEN
Address := 'Date: ' || TO_CHAR(SYSDATE, 'DD MON RRRR HH24:MI:SS') ||
crlf ||'From: ' || l_from ||
crlf ||'To: ' || l_to ||
crlf ||'Cc: ' || Cc ||
crlf ||'Subject: ' || Subject || crlf
|| 'Content-Type: text/html; charset=us-ascii' || crlf
|| 'Content-Transfer-Encoding: 7bit' || crlf
|| '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' || crlf
|| '<html>' || crlf
|| '<head>' || crlf
|| '<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">' || crlf
|| '<title>' || subject || '</title>' || crlf
|| '</head>' || crlf
|| '<body>' || crlf|| utl_tcp.crlf
|| mesg || crlf
|| '</body></html>';
ELSE
Address := 'Date: ' || TO_CHAR(SYSDATE, 'DD MON RRRR HH24:MI:SS') ||
crlf ||'From: ' || l_from ||
crlf ||'To: ' || l_to ||
crlf ||'Cc: ' || Cc ||
crlf ||'Subject: ' || Subject ||
crlf || utl_tcp.crlf || mesg;
END IF;
UTL_SMTP.data(conn, Address);
UTL_SMTP.quit(conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);
END;
when I execute that procedure
execute fsc_temp_MAIL('usmanafb@ctm.com.pk','abc@ctm.com.pk','test for subject ','sdf','xyz@ctm.com.pk',True);
ORA-29279: SMTP permanent error: 530 5.7.1 Client was not authenticated
don’t know how to deal with this
this is some kind of smtp setting ? all email address is valid
if some one have better solution then tell me I create these pocedure in plsql
Как я спам слал
Время на прочтение
6 мин
Количество просмотров 28K
Введение
В этой небольшой статье я хочу рассказать о том, как я настраивал отправку почты из Oracle и чем это закончилось. Хочу сразу уточнить две вещи: во-первых, делал я это не для рассылки спама, во-вторых, ранее я не имел дела с настройкой почтовых серверов, поскольку это лежит вне области моей профессиональной деятельности.
Настройка Oracle
Решая одну из своих задач, я столкнулся с необходимостью рассылать пользователям данные для аутентификации, т.е. логины и пароли, которые лежат в таблице. Скажем откровенно, в данный момент пользователей не сотни и не тысячи, так что можно было бы каждому отослать письмо руками, но это пару часов ручного труда – интересней ведь потратить в два-три раза больше времени, но все автоматизировать, не так ли?
На прошлом месте работы мне уже приходилось слать джобом ежемесячные отчеты на почту пользователям, так что задача не выглядела для меня чем-то экзотичным, более того, я рассчитывал, что справлюсь за соизмеримое с ручным трудом время. С другой стороны там была вся необходимая инфраструктура под рукой + специалисты нужных тематик, с которыми можно было поговорить. Здесь же не было ничего — нужно разбираться самому.
Oracle имеет множество методов отсылки почты из БД, вот некоторые из пакетов, имеющие нужную функциональность:
- UTL_MAIL
- UTL_SMTP
- UTL_TCP
- UTL_HTTP
Любой из перечисленных пакетов полностью содержит необходимую логику. Самый свежий – это пакет UTL_MAIL, его я и решил использовать. Скажу сразу, этот пакет не входит в сборку Oracle по умолчанию, его нужно устанавливать руками. Части пакета лежат в двух файлах:
1. спецификация пакета находится в файле @$ORACLE_HOMErdbmsadminutlmail.sql
2. тело пакета зашифровано и лежит в файле @$ORACLE_HOMErdbmsadminprvtmail.sql
Накатывать это нужно из-под пользователя SYS, нормально установить пакет из Command Window PL/SQL Developer’a мне не удалось, т.е. он установился, но выдавал ошибки компиляции. Из sqlplus все установилось отлично.
После наката нужно выдать гранты на использование пакета. Некоторые авторы предлагают давать гранты на Public, но это не есть хорошая идея по причинам безопасности. После выдачи грантов нужному пользователю наша работа под пользователем SYS закончена (однако он нам еще понадобиться ситуации, когда нужно делать alter system).
Почтовый сервер
Как оказалось, для отправки почты все же нужна инфраструктура, т.е. кроме Oracle нужен почтовый сервер, которого у меня не было, а уж устанавливать и настраивать я его вообще не представлял как, да и нужно ли?
После недолгих поисков я нашел следующую статью http://jiri.wordpress.com/2010/03/24/send-emails-using-utl_mail-and-google-gmail-smtp-server/, описывающую как слать почту через GMAIL. Автор статьи попал в аналогичную моей ситуацию и предлагал простое решение, которым я решил воспользоваться. Завел новый ящик на GMAIL, который будет использоваться для автоматической отсылки писем, скачал и установил E-MailRelay. Сразу у меня все не заработало, пришлось немного почитать документацию и поискать еще статей, описывающих взаимодействие с данным сервером. В итоге все нужное параметры были внесены в bat-файл, данные почтового ящика в файл emailrelay.auth и сервер успешно запущен.
Отправка писем
После установки почтового сервера (или SMTP-прокси, как в нашем случае) нужно указать Oracle его адрес:
alter system set smtp_out_server = 'ip-address:port' scope=Both;
В моем случае, Oracle и SMTP-прокси стоят на одной машине, поэтому адрес 127.0.0.1, порт 25.
Попытаемся теперь отправить письмо с помощью utl_mail.send, для этого пришлось еще немного поиграться с настройками, например, оказалось, что в поле sender обязательно нужен адрес в следующем формате:
«<any_mail@any_mail_server.com>», там же можно указать имя отправителя:
» Sender Name <my_mail@any_mail_server.com>», но письмо придет все равно с вашего реального gmail-ящика, и выглядеть это будет так:
» Sender Name <my_mail@any_mail_server.com>» <real_mailbox@gmail.com>
Немного экспериментов с mime_type и отсылкой на разные почтовые серверы показало, что для русского текста желательно использовать ‘text/html; charset=«UTF-8»’.
После контрольной отсылки писем себе была написана процедура, которая выбирала нужные данные и слала каждому пользователю его логин/пароль. Запустив эту процедуру для отсылки данных первым двадцати пользователям, я ушел обедать.
Минут через 40 оказалось, что ушло только первых 4 письма, остальные где-то застряли. Готовясь к дебагу, я отправил той же процедурой 10 писем себе на ящик. Новый пакет «протолкнул» потерянные письма и все они успешно ушли. В общем SMTP-прокси работал, хотя и с некоторым непостоянством.
Продолжение истории
Через день, занимаясь своими делами на сервере, я увидел, что SMTP-прокси отослал около 80 писем, хотя я после первой рассылки больше через него ничего не отправлял. Решил проверить ящик на gmail’e. Во входящих красовалось три пачки писем:
Все три цепочки содержали ответы почтовых серверов об отправке сообщения на несуществующие ящики. В отправленных сообщениях наблюдалась следующая картина:
Получалось, что с моего ящика ушло по два письма на ящики vbibiorm@gmail.com и w852@ymail.com, причем каждое письмо в теме содержало IP-адрес машины, на которой стоял мой SMTP-прокси, тело писем было пустым, но письма имели по одному аттачу с именем noname и размером ноль байт.
Очевидно, что SMTP-прокси имел уязвимость, и мне неизвестно, проявлялась ли она только при отправке писем с аттачем, или аттач должен был содержать какую-то дополнительную информацию относительно уязвимостей/характеристик машины. Поскольку время отправки сообщений на оба ящика совпадает, я делаю вывод, что они принадлежат одному и тому же человеку. В результате найденной уязвимости через SMTP-прокси были посланы письма такого вида:
Гугл-транслейт определяет язык писем как китайский. Поиск в гугле информации по данным е-мейлам показал, что пользователи часто жалуются на непонятную активность почтовых серверов, связанную с отсылкой писем на эти ящики. В общем, так у меня в словаре появилось словосочетание «open relay». SMTP-прокси я выключил, но остался вопрос, что с этим делать дальше? Я видел три варианта:
- Поскольку почту отправлять планировалось не часто и целыми пакетами, то можно оставить все как есть, т.е. включать почтовый прокси только на время отправки писем – наиболее дешевое по времени решение.
- Можно досконально разобраться с темой почтовых серверов и либо корректно настроить данный, либо сменить его на более надежный – довольно дорогой по времени вариант, к тому же в дальнейшем мне эти знания будут абсолютно бесполезны.
- Найти воркэраунд, с использованием имеющихся знаний – затраты по времени не известны.
- Найти разбирающегося в почтовых серверах знакомого.
Учитывая исходную задачу, наиболее перспективно выглядел 3-ий вариант, при условии получения «fun’a» от процесса решения. Далее, примерно равнозначны варианты 1 и 4.
Варианты
Самым простым и идеальным вариантом является отправка почты сразу через Gmail, без дополнительных серверов. Попробуем:
alter system set smtp_out_server = 'smtp.gmail.com:587' scope=Both;
Теперь попытка отсылки письма возвращает следующую ошибку: «ORA-29279: SMTP permanent error: 530 5.7.0 Must issue a STARTTLS command first. m29sm5336584poh.20». Я сходил в документацию Gmail’a и попробовал другие порты, попробовал также установить в настройках ящика работу через http, а не https. В результате сообщение об ошибке менялось, но почта не уходила. Поиск в интернете указал на несколько моментов:
- Gmail и Yahoo требуют использования STARTTLS(другое название SSL).
- UTL_MAIL не поддерживает STARTTLS.
- Особо упорные товарищи пробовали использовать пакет utl_smtp и команду utl_smtp.command(conn,’STARTTLS’), но потерпели фиаско. Где-то в документации я нашел, что STARTTLS поддерживается Ораклом начиная с версии 11.2.
- Общее мнение сообщества сводилось к следующему:
- Используйте не Gmail и не Yahoo и не морочьте себе голову.
- Если вы хотите использовать Gmail, поставьте себе SMTP-прокси (вариант. описанный в начале статьи).
- Если вы понимаете что делаете, можете попытаться авторизоваться на почтовом сервере через пакет utl_smtp.
Я решил попробовать реализовать пункт 4.а – ищу другой почтовый сервер, нахожу там настройки для SMTP, делаю alter system. Пытаюсь послать письмо, получаю ошибку: «ORA-29278: Временная ошибка SMTP: 421 Service not available». Перечитываю настройки, пытаюсь подключить варианты с использованием авторизации через пакет utl_smtp (обсуждение этого варианта можно посмотреть, например, здесь). Ничего не работает, ни через другой почтовик ни через Gmail. Постоянно закрываю в браузере вкладки с описанием того, что я уже знаю, но количество потенциально полезных стремиться к бесконечности:
Понимаю, что пора с этим заканчивать, во время очередного поиска нахожу простую мысль: а не закрыт ли у меня порт 25? Проверяю (оказывается, я теперь умею это делать) – закрыт. Делаю alter system с указанием моего альтернативного почтового сервера и порта 587. Пробую отправить письмо с помощью UTL_MAIL и получаю ошибку «ORA-29279: Постоянная ошибка SMTP: 501 sender address must contain a domain». Почти получилось, избавляюсь в имени отправителя от необходимых Gmail’y «<>», и письмо уходит.
Заключение
В этой статье я описал свой опыт работы с отправкой почты в полевых условиях и при отсутствии необходимых знаний о работе почтовых серверов. Полученный результат не является вполне удовлетворительным, поскольку я нашел такой же «дырявый» почтовый сервер, как и ранее установленный мною SMTP-прокси. Потратив еще минуту, я выяснил, что могу отправить письмо от имени любого существующего на почтовом сервере ящика, просто указав, например
v_sender varchar2(200):='Вася Пупкин <admin@mail.******>'
где mail.****** — имя найденного почтового сервера. Однако свои задачи я решил, от дырявого прокси и необходимости разбираться с его настройками я избавился, узнал немного больше про пакеты UTL_MAIL и UTL_SMTP. Также я планировал разобраться с вариантом 4.с, но сходу у меня не вышло, и я решил не тратить больше времени, если кто-то добьет таки отправку писем из Oracle напрямую через Gmail будет интересно про это почитать. На перенастройку отправления почты (после обнаружения спама) и параллельное написание статьи я потратил где-то около 6-7 часов.
Please help me, I’m trying to send mail from Oracle database 11g and while sending the mail from database, I’m getting the following error.
enter image description here
CREATE OR REPLACE PROCEDURE send_mail_deepak_test (p_to IN VARCHAR2,
p_from IN VARCHAR2,
p_subject IN VARCHAR2,
p_message IN VARCHAR2,
p_smtp_host IN VARCHAR2,
p_smtp_port IN NUMBER DEFAULT 25)
AS
l_mail_conn UTL_SMTP.connection;
BEGIN
l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
UTL_SMTP.helo(l_mail_conn, p_smtp_host);
UTL_SMTP.mail(l_mail_conn, p_from);
UTL_SMTP.rcpt(l_mail_conn, p_to);
UTL_SMTP.open_data(l_mail_conn);
UTL_SMTP.write_data(l_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, p_message || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_SMTP.close_data(l_mail_conn);
UTL_SMTP.quit(l_mail_conn);
END;
/
While checking if procedure APEX_MAIL.SEND could send out a message to multiple users and being too lazy to open up the on-line help window and check what the documentation says, i made an attempt for sending a message to multiple recipients as follows:
begin
apex_mail.send(
p_to => 'first@somedomain.com;second@somedomain.com',
p_from => 'apex@someaddress.com',
p_body => 'test message'
);
apex_mail.push_queue;
end;
But looking at view APEX_MAIL_QUEUE, i saw the message below in column MAIL_SEND_ERROR
ORA-29279: SMTP permanent error: 501 Bad address syntax
This is caused by the semicolon (;) used for separating the addresses.
Use commas (,) instead.
To delete undeliverable messages from APEX_MAIL_QUEUE, just execute:
delete from APEX_MAIL_QUEUE
where MAIL_SEND_ERROR is not null;
See message translations for ORA-29279 and search additional resources.
ORA-29279: Errore permanente SMTP:
ORA-29279: error permanente de SMTP:
ORA-29279: error permanent de SMTP:
ORA-29279: erreur permanente SMTP :
ORA-29279: Permanenter SMTP-Fehler:
ORA-29279: μόνιμο σφάλμα SMTP:
ORA-29279: permanent SMTP-fejl:
ORA-29279: Permanent SMTP-fel:
ORA-29279: permanent SMTP-feil:
ORA-29279: pysyvä SMTP-virhe:
ORA-29279: SMTP állandó hiba:
ORA-29279: eroare permanentă SMTP:
ORA-29279: Permanente SMTP-fout:
ORA-29279: erro permanente de SMTP:
ORA-29279: erro permanente de SMTP:
ORA-29279: Постоянная ошибка SMTP:
ORA-29279: Permanentní chyba SMTP:
ORA-29279: trvalá chyba SMTP:
ORA-29279: trwały błąd SMTP:
ORA-29279: SMTP kalıcı hatası: