Correo manual de Oracle Apex
Primero, abra los permisos de ACL del usuario (Lista de control de acceso)
Nuevo archivo de configuración de ACL
dbms_network_acl_admin.create_acl(acl => 'email.xml', --xml名称
DESCRIPTION => 'email', --描述
principal => 'APEX_190200', --数据库名,大小写敏感
is_grant => TRUE,
PRIVILEGE => 'connect', --权限名
start_date => NULL,
end_date => NULL);
ACL asignado a usuarios
dbms_network_acl_admin.add_privilege(acl => 'email.xml', --同上xml名称
principal => 'APEX_190200', --数据库名
is_grant => TRUE,
privilege => 'connect', --权限名
start_date => null,
end_date => null);
Registro de ACL
dbms_network_acl_admin.assign_acl ( -- 该段命令意思是允许访问acl名为utl_sendmail.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
acl => 'email.xml',
host => '*' -- ip地址或者域名
);
Use el siguiente comando para verificar si la asignación es exitosa
SELECT * From dba_network_acls;
SELECT acl,
principal,
privilege,
is_grant,
TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
From dba_network_acl_privileges;
Si desea asignar permisos a más usuarios , ejecute el siguiente comando
EXECUTE DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('email.xml','APEX_190200', TRUE, 'connect');
Enviar correo
La parte de ACL anterior se ha completado. En este momento, el error APEX ya no debería estarlo.ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝
Para usar plsql para enviar correos electrónicos, generalmente se utilizan los paquetes de funciones UTL.SMTP y UTL.TCP. Los usuarios predeterminados de Oracle no pueden usar estos dos paquetes de funciones, por lo que debe otorgar manualmente permisos de usuario
grant execute on UTL_TCP to APEX_190200;
grant execute on UTL_SMTP to APEX_190200;
Se completó la configuración de envío de correo APEX anterior.
El siguiente es el código de muestra de envío de correo plsql, compatible con chino y HTMl (para obtener más ejemplos, consulte https://oracle-base.com/articles/misc/email-from-oracle-plsql)
create or replace PROCEDURE send_mail (p_to IN VARCHAR2,
p_subject IN VARCHAR2,
p_text_msg IN VARCHAR2 DEFAULT NULL,
p_html_msg IN VARCHAR2 DEFAULT NULL)
AS
l_mail_conn UTL_SMTP.connection;
l_boundary VARCHAR2(50) := '----=*#abc1234321cba#*=';
--下面四个变量请根据实际邮件服务器进行赋值
v_smtphost VARCHAR2(30 ) := 'smtp.qq.com'; --SMTP服务器地址(hotmail为smtp.live.com,测试未通过)
v_smtpport number(5 ) := 587; --smtp服务端口
v_user VARCHAR2(30 ) := '[email protected]' ; --登录SMTP服务器的用户名
v_pass VARCHAR2(20 ) := 'tqxobadrrneohdah'; --登录SMTP服务器的密码
p_from VARCHAR2(20 ) := '[email protected]';
BEGIN
l_mail_conn := UTL_SMTP.open_connection(v_smtphost, v_smtpport);
--是用 ehlo() 而不是 helo() 函数
UTL_SMTP.ehlo(l_mail_conn, v_smtphost);
-- smtp服务器登录校验
UTL_SMTP.command(l_mail_conn, 'AUTH LOGIN');
UTL_SMTP.command(l_mail_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));
UTL_SMTP.command(l_mail_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));
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_raw_data(l_mail_conn, UTL_RAW.cast_to_raw('Subject: ' || p_subject || UTL_TCP.crlf));
UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Type: multipart/alternative; boundary="' || l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
IF p_text_msg IS NOT NULL THEN
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/plain; charset="utf8"' || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_SMTP.write_raw_data(l_mail_conn, UTL_RAW.cast_to_raw(p_text_msg));
UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF;
IF p_html_msg IS NOT NULL THEN
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/html; charset="utf8"' || UTL_TCP.crlf || UTL_TCP.crlf);
UTL_SMTP.write_raw_data(l_mail_conn, UTL_RAW.cast_to_raw(p_html_msg));
UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF;
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || '--' || UTL_TCP.crlf);
UTL_SMTP.close_data(l_mail_conn);
UTL_SMTP.quit(l_mail_conn);
END;
/
Ejemplo de uso
DECLARE
l_html VARCHAR2(32767);
BEGIN
l_html := '<html>
<head>
<title>Test HTML message</title>
</head>
<body>
<p>This is a <b>HTML</b> <i>version</i> of the test message.</p>
<p><img src="https://github.com/TjFish/Image-Hosting/raw/master/images/background/bg1.jpg"/>
</body>
</html>';
send_mail(p_to => '[email protected]',
p_subject => 'Test Message',
p_text_msg => 'This is a test message.',
p_html_msg => l_html);
END;
/