在专用 Exadata 基础结构上的自治 AI 数据库上发送电子邮件
您可以使用电子邮件传送服务或 DBMS_CLOUD_NOTIFICATION 过程在专用 Exadata 基础结构上的自治 AI 数据库上发送电子邮件。本文介绍了如何使用这两个选项发送电子邮件。
在自治 AI 数据库上使用电子邮件传送服务发送电子邮件
介绍在专用 Exadata 基础结构上的自治 AI 数据库上使用 UTL_SMTP 发送电子邮件的步骤。
要使用 UTL_SMTP 发送电子邮件,请执行以下操作:
-
确定电子邮件传送的 SMTP 连接端点。
-
如果要使用 Oracle Cloud Infrastructure (OCI) 电子邮件传送服务,请确定电子邮件传送的连接端点。例如,如果美国西部(凤凰城)是发送区域,请选择
smtp.email.us-phoenix-1.oci.oraclecloud.com。有关更多信息,请参见 Configure SMTP Connection 。注:如果电子邮件传送在当前区域中不可用,则可能需要订阅其他 Oracle Cloud Infrastructure 区域。
-
如果要使用第三方 SMTP 服务器,网络管理员必须配置 SMTP 服务器及其与自治 AI 数据库租户的连接,并提供 SMTP 连接端点信息。
-
-
为 OCI 用户生成电子邮件传送的 SMTP 身份证明。
当您发送电子邮件时,
UTL_SMTP使用身份证明对电子邮件传送服务器进行验证。有关更多信息,请参见 Generate SMTP Credentials for a User 。 -
为电子邮件传送创建批准的发件人。
如果您使用的是 OCI 电子邮件传送服务,请在
UTL_SMTP.MAIL中针对用作“发件人”的所有电子邮件地址完成此步骤。有关详细信息,请参阅管理批准的发件人。 -
通过附加访问控制条目 (Access Control Entry,ACE),允许具有管理员角色的用户访问 SMTP 主机。
要使用安全 SMTP,除了 SMTP 主机访问外,还必须将数据库用户设置为访问控制条目 (Access Control Entry,ACE) 以进行 wallet 访问。为了使用 OCI Email Delivery Service 进行安全 SMTP 访问,必须使用简单验证和安全层 (SASL) 协议(例如 PLAIN、CRAM-MD5、LOGIN)对 Oracle Cloud Infrastructure 账户进行验证。例如,请参见 SMTP Send Email Sample Code 中的示例代码。
-
编写 PL/SQL 代码以使用
UTL_MAIL发送电子邮件。提示:如果您要自行开发发送电子邮件过程,请确保您的代码符合 SMTP Send Email Sample Code 。
-
使用在步骤 5 中创建的 PL/SQL 过程发送测试电子邮件。
例如:
execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');
有关进一步参考,请参阅 Oracle Database 19c PL/SQL Packages and Types Reference 或 Oracle Database 26ai PL/SQL Packages and Types Reference 中的 UTL_SMTP 。
有关将 UTL_SMTP 与自治 AI 数据库配合使用的更多信息,请参见 Notes on the Use of Database PL/SQL Packages 。
SMTP 发送电子邮件示例代码
显示在自治 AI 数据库上使用 UTL_SMTP 发送电子邮件的示例代码。
样本代码
-- As ADMIN user, set up ACE to access SMTP host
connect admin/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com
begin
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
host => '[SMTP_Server_address]',
lower_port => 25,
upper_port => 25,
ace => xs$ace_type(
privilege_list => xs$name_list('smtp'),
principal_name => '[database_user]',
principal_type => xs_acl.ptype_db));
end;
/
-- If using secure SMTP, set up ACE to wallet for certificate-based secure (TLS) email
declare
m_wallet_path VARCHAR2(512);
begin
select property_value into m_wallet_path
from database_properties
where property_name like '%SSL%';
m_wallet_path := 'file:' || m_wallet_path;
DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
wallet_path => m_wallet_path,
ace => xs$ace_type(
privilege_list => xs$name_list('use_client_certificates'),
principal_name => '[database_user]',
principal_type => xs_acl.ptype_db));
end;
/
-- As ADMIN or regular database user with privileges set up above, use UTL_SMTP to send email
connect [database_user]/[password]@[ADBD-host]/[pdbname]_tp.atp.oraclecloud.com
-- Example of normal (non-secure) email
DECLARE
c UTL_SMTP.CONNECTION;
reply UTL_SMTP.REPLY;
host varchar2(64) := '[SMTP_Server_address]',
port pls_integer := 25;
sender varchar2(64) := '[sender-address@domain.com]';
recipient varchar2(64) := '[recipient-address@domain.com]';
BEGIN
c := UTL_SMTP.OPEN_CONNECTION (host, port);
if (reply.CODE != 220) then
raise_application_error(-20000,'UTL_SMTP.CONNECTION: '
|| reply.CODE || ' - ' || reply.TEXT);
end if;
UTL_SMTP.HELO(c, host);
UTL_SMTP.MAIL(c, sender);
UTL_SMTP.RCPT(c, recipient);
UTL_SMTP.OPEN_DATA(c);
UTL_SMTP.WRITE_DATA(c,'From:[Sender] <' || sender || '>' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c,'To:[Recipient] <' || recipient || '>' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c,'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c,'Mail Content');
UTL_SMTP.CLOSE_DATA(c);
dbms_output.put_line('Close Data: ' || reply.code);
UTL_SMTP.QUIT(c);
END;
/
-- Example of secure email using OCI Mail Server as the SMTP server
DECLARE
m_wallet_path VARCHAR2(256);
c UTL_SMTP.CONNECTION;
reply UTL_SMTP.REPLY;
host varchar2(64) := 'smtp.email.[region].oci.oraclecloud.com';
port pls_integer := 25;
sender varchar2(64) := '[sender-address@domain.com]';
recipient varchar2(64) := '[recipient-address@domain.com]';
BEGIN
select property_value into m_wallet_path
from database_properties
where property_name like '%SSL%';
m_wallet_path := 'file:' || m_wallet_path;
-- secure connection with SSL/TLS made *before* SMTP communication
-- use hostname matched against CN or SMTP server's certificate
reply := UTL_SMTP.OPEN_CONNECTION (
host => host,
port => port,
c => c,
wallet_path => m_wallet_path,
wallet_password => NULL,
secure_connection_before_smtp => FALSE,
secure_host => NULL);
if (reply.CODE != 220) then
raise_application_error(-20000,'UTL_SMTP.OPEN_CONNECTION: '
|| reply.CODE ||' - ' || reply.TEXT);
end if;
UTL_SMTP.STARTTLS(c);
-- username is the 'SMTP credential' for the user's email address
-- obtained from OCI Identity -> Users -> email address.
-- Scheme refers to SASL (Simple Authentication and Security Layer)
-- Authentication Schemes for SMTP protocol - PLAIN, CRAM-MD5, LOGIN
-- https://docs.oracle.com/en-us/iaas/Content/Email/Concepts/overview.htm
UTL_SMTP.AUTH(
c => c,
username => '[ocid1.user.verylongaddresscreatedinOCIforuseraddress.com]',
password => '[password-provided-from-create]',
schemes => 'PLAIN');
UTL_SMTP.HELO(c, host);
UTL_SMTP.MAIL(c, sender);
UTL_SMTP.RCPT(c, recipient);
UTL_SMTP.OPEN_DATA(c);
UTL_SMTP.WRITE_DATA(c, 'From: Sender <' || sender || '>' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, 'To: Recipient <' || recipient || '>' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, 'Subject: Email from UTL_SMTP App' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(c, 'Mail Content');
UTL_SMTP.WRITE_DATA(c, 'Sender is a domain-owned approved sender in OCI Mail Service');
UTL_SMTP.CLOSE_DATA(c);
dbms_output.put_line('Close Data: ' || reply.code);
UTL_SMTP.QUIT(c);
END;
/
从自治 AI 数据库以电子邮件形式发送消息
适用于:
仅限 Oracle Public Cloud
您可以使用 DBMS_CLOUD_NOTIFICATION 将邮件作为电子邮件发送。
-
确定电子邮件传送的 SMTP 连接端点。如果电子邮件传送在当前区域中不可用,则可能需要订阅其他 Oracle Cloud Infrastructure 区域。
例如,为 SMTP 连接端点选择以下选项之一:
-
smtp.us-phoenix-1.oraclecloud.com
-
smtp.us-ashburn-1.oraclecloud.com
-
smtp.email.uk-london-1.oci.oraclecloud.com
-
smtp.email.eu-frankfurt-1.oci.oraclecloud.com
有关更多信息,请参见 Configure SMTP Connection 。
-
-
为电子邮件传送生成 SMTP 凭证。
UTL_SMTP使用身份证明在发送电子邮件时通过电子邮件传送服务器进行验证。有关更多信息,请参见 Generate SMTP Credentials for a User 。
-
为电子邮件传送创建已批准的发件人。对于您在
UTL_SMTP.MAIL中用作 "From" 的所有电子邮件地址,请完成此步骤。有关详细信息,请参阅管理批准的发件人。
-
通过附加访问控制项 (Access Control Entry,ACE) 来允许 ADMIN 用户的 SMTP 访问。
例如:
BEGIN -- Allow SMTP access for user ADMIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.us.example.com', lower_port => 587, upper_port => 587, ace => xs$ace_type(privilege_list => xs$name_list('SMTP'), principal_name => 'ADMIN', principal_type => xs_acl.ptype_db)); END; / -
创建身份证明对象并使用
DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE以电子邮件形式发送消息。BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'EMAIL_CRED', username => 'username', password => 'password' ); END; / BEGIN DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE( provider => 'email', credential_name => 'EMAIL_CRED', message => 'Subject content', params => json_object('recipient' value 'mark@example.com, suresh@example.com', 'to_cc' value 'nicole@example.com, jordan@example.com', 'to_bcc' value 'manisha@example.com', 'subject' value 'Test subject', 'smtp_host' value 'smtp.email.example.com', 'sender' value 'approver_sender@example.com' ) ); END; /使用
params参数在string值中指定 CC 或 BCC 的发件人、smtp_host、主题、收件人以及收件人。-
发件人:指定步骤 3 中已批准发件人的电子邮件 ID。
-
smtp_host :指定步骤 2 中的 SMTP 主机名。
-
主题:指定电子邮件的主题。
-
recipient :指定收件人的电子邮件 ID。存在多个收件人时,在电子邮件 ID 之间使用逗号。
-
to_cc :指定接收电子邮件抄送的电子邮件 ID。存在多个抄送收件人时,在电子邮件 ID 之间使用逗号。
-
to_bcc :指定接收电子邮件密件抄送的电子邮件 ID。存在多个密件抄送收件人时,在电子邮件 ID 之间使用逗号。
有关更多信息,请参见 SEND_MESSAGE Procedure 。
-
从自治 AI 数据库以电子邮件形式发送查询结果
适用于:
仅限 Oracle Public Cloud
您可以使用 DBMS_CLOUD_NOTIFICATION 程序包以电子邮件形式发送查询结果。
要使用 DBMS_CLOUD_NOTIFICATION 发送邮件,请执行以下操作:
-
确定电子邮件传送的 SMTP 连接端点。如果电子邮件传送在当前区域中不可用,则可能需要订阅其他 Oracle Cloud Infrastructure 区域。
例如,为 SMTP 连接端点选择以下选项之一:
-
smtp.us-phoenix-1.oraclecloud.com
-
smtp.us-ashburn-1.oraclecloud.com
-
smtp.email.uk-london-1.oci.oraclecloud.com
-
smtp.email.eu-frankfurt-1.oci.oraclecloud.com
有关更多信息,请参见 Configure SMTP Connection 。
-
-
为电子邮件传送生成 SMTP 凭证。
UTL_SMTP使用身份证明在发送电子邮件时通过电子邮件传送服务器进行验证。有关更多信息,请参见 Generate SMTP Credentials for a User 。
-
为电子邮件传送创建已批准的发件人。对于您在
UTL_SMTP.MAIL中用作 "From" 的所有电子邮件地址,请完成此步骤。有关详细信息,请参阅管理批准的发件人。
-
通过附加访问控制项 (Access Control Entry,ACE) 来允许 ADMIN 用户的 SMTP 访问。
例如:
BEGIN -- Allow SMTP access for user ADMIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.us.example.com', lower_port => 587, upper_port => 587, ace => xs$ace_type(privilege_list => xs$name_list('SMTP'), principal_name => 'ADMIN', principal_type => xs_acl.ptype_db)); END; / -
创建身份证明对象并使用
DBMS_CLOUD_NOTIFICATION.SEND_DATA以电子邮件形式发送查询的输出。BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'EMAIL_CRED', username => 'username', password => 'password' ); END; / BEGIN DBMS_CLOUD_NOTIFICATION.SEND_DATA( provider => 'email', credential_name => 'EMAIL_CRED', query => 'SELECT tablespace_name FROM dba_tablespaces', params => json_object('recipient' value 'mark@example.com, suresh@example.com', 'to_cc' value 'nicole@example.com1, jordan@example.com', 'to_bcc' value 'manisha@example.com', 'subject' value 'Test subject', 'type' value 'json', 'title' value 'mytitle', 'message' value 'This is the message', 'smtp_host' value 'smtp.email.example.com', 'sender' value 'approver_sender@example.com' ) ); END; /使用
params参数指定 CC 或 BCC 的发件人、smtp_host、主题、收件人、收件人、消息、数据类型以及String值中的标题。-
发件人:指定步骤 3 中已批准发件人的电子邮件 ID。
-
smtp_host :指定步骤 2 中的 SMTP 主机名。
-
subject(主题):指定电子邮件的主题。最大大小为 100 个字符。
-
recipient(收件人):此项指定收件人的电子邮件 ID。存在多个收件人时,在电子邮件 ID 之间使用逗号。
-
to_cc :指定接收电子邮件抄送的电子邮件 ID。存在多个抄送收件人时,在电子邮件 ID 之间使用逗号。
-
to_bcc :指定接收电子邮件密件抄送的电子邮件 ID。存在多个密件抄送收件人时,在电子邮件 ID 之间使用逗号。
-
message :指定消息文本。
-
type :将输出格式指定为 CSV 或 JSON。
-
title(标题):指定 SQL 输出的附件标题。由于标题用于生成文件名,标题应仅包含字母、数字、下划线、连字符或点作为其值的字符。
用于邮件通知的
DBMS_CLOUD_NOTIFICATION.SEND_DATA的最大消息大小为 32k 字节。有关更多信息,请参见 SEND_DATA Procedure 。
-