С учетом того, что smtp системы перешли на SSL/TLS
оракл необходимо поднастроить с учетом этого
1. создать wallet
mkdir /opt/oracle/wallet
mkstore -wrl "/opt/oracle/wallet" -create
2) посмотреть корневой сертификат вашего смтп сервера
openssl s_client -connect smtp.yandex.ru:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = PL, O = Unizeto Sp. z o.o., CN = Certum CA
verify return:1
depth=1 C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Level IV CA
verify return:1
depth=0 C = RU, O = Yandex LLC, OU = ITO, L = Moscow, ST = Russian Federation, CN = smtp.yandex.ru, emailAddress = pki@yandex-team.ru
verify return:1
закачать этот сертификат себе
и записать в wallet
orapki wallet add -wallet /opt/oracle/wallet/ewallet.p12 -trusted_cert -cert unizeto.crt
оракл необходимо поднастроить с учетом этого
1. создать wallet
mkdir /opt/oracle/wallet
mkstore -wrl "/opt/oracle/wallet" -create
2) посмотреть корневой сертификат вашего смтп сервера
openssl s_client -connect smtp.yandex.ru:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = PL, O = Unizeto Sp. z o.o., CN = Certum CA
verify return:1
depth=1 C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Level IV CA
verify return:1
depth=0 C = RU, O = Yandex LLC, OU = ITO, L = Moscow, ST = Russian Federation, CN = smtp.yandex.ru, emailAddress = pki@yandex-team.ru
verify return:1
и записать в wallet
orapki wallet add -wallet /opt/oracle/wallet/ewallet.p12 -trusted_cert -cert unizeto.crt
3) Не забыть настроить ACL для соотствующих портов
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'acl_smtp.xml',
host => 'smtp.yandex.ru',
lower_port => 587,
upper_port => 587);
COMMIT;
END;
просмотреть чего там в ACL настроено можно так
SELECT host, lower_port, upper_port, acl
FROM dba_network_acls;
SELECT * FROM dba_network_acl_privileges;
4) ну и цепляемся к серверу
l_reply := UTL_SMTP.OPEN_CONNECTION(
host => common.GET_SETTING('MAILSERVER',MAILSERVER),
port => common.GET_SETTING('MAILPORT',MAILPORT),
c => l_mail_conn,
wallet_path => 'file:/opt/oracle/wallet',
wallet_password => 'wallet_pas',
secure_connection_before_smtp => FALSE
);
IF l_reply.code != 220
THEN
raise_application_error(-20000, 'utl_smtp.open_connection: '||l_reply.code||' - '||l_reply.text);
END IF;
dbms_output.put_line('utl_smtp.ehlo');
l_replies := utl_smtp.ehlo(l_mail_conn, 'pmga.ru');
FOR ri IN 1..l_replies.COUNT
LOOP
dbms_output.put_line(l_replies(ri).code||' - '||l_replies(ri).text);
END LOOP;
l_reply := UTL_SMTP.STARTTLS(l_mail_conn);
IF l_reply.code != 220
THEN
raise_application_error(-20000, 'utl_smtp.starttls: '||l_reply.code||' - '||l_reply.text);
END IF;
l_reply := UTL_SMTP.AUTH(
c => l_mail_conn,
username => common.GET_SETTING('MAILLOGIN','pmgadmin'),
password => common.GET_SETTING('MAILPASS','pwd13pmg'),
schemes => utl_smtp.all_schemes);
IF l_reply.code != 235
THEN
raise_application_error(-20000, 'utl_smtp.auth: '||l_reply.code||' - '||l_reply.text);
END IF;
А дальше стандартное общение
UTL_SMTP.MAIL(l_mail_conn, common.GET_SETTING('MAILLOGIN',SENDER_EMAIL));
UTL_SMTP.RCPT(l_mail_conn, in_mailto);
UTL_SMTP.OPEN_DATA(l_mail_conn); -- open data sheet
UTL_SMTP.WRITE_DATA(l_mail_conn, l_data);
UTL_SMTP.CLOSE_DATA(l_mail_conn);
UTL_SMTP.QUIT(l_mail_conn);