在专用 Exadata 基础结构上的 Autonomous Database 上发送电子邮件

您可以使用电子邮件传送服务或 DBMS_CLOUD_NOTIFICATION 过程在 Autonomous Database on Dedicated Exadata Infrastructure 上发送电子邮件。本文介绍了如何使用这两个选项发送电子邮件。

Autonomous Database 上使用电子邮件传送服务发送电子邮件

介绍使用 Autonomous Database on Dedicated Exadata Infrastructure 上的 UTL_SMTP 发送电子邮件的步骤。

要使用 UTL_SMTP 发送电子邮件,请执行以下操作:
  1. 确定用于电子邮件传送的 SMTP 连接端点。
    1. 如果要使用 Oracle Cloud Infrastructure (OCI) 电子邮件传送服务,请确定电子邮件传送的连接端点。例如,当 US West (Phoenix) 是发送区域时,选择 smtp.email.us-phoenix-1.oci.oraclecloud.com。有关更多信息,请参见 Configure SMTP Connection

      注意:

      如果电子邮件传送在当前区域中不可用,您可能需要订阅其他 Oracle Cloud Infrastructure 区域。
    2. 如果要使用第三方 SMTP 服务器,网络管理员必须配置 SMTP 服务器及其与 Autonomous Database 租户的连接并提供 SMTP 连接端点信息。
  2. 为 OCI 用户的电子邮件传送生成 SMTP 身份证明。
    在您发送电子邮件时,UTL_SMTP 使用凭据与电子邮件传送服务器进行验证。有关更多信息,请参见 Generate SMTP Credentials for a User
  3. 为电子邮件传送创建批准的发件人。
    如果您使用的是 OCI 电子邮件传送服务,请为用作 UTL_SMTP.MAIL 的“发件人”的所有电子邮件地址完成此步骤。有关更多信息,请参见管理批准的发件人
  4. 通过附加访问控制条目 (Access Control Entry,ACE) 为具有管理员角色的用户允许 SMTP 主机访问。
    要使用安全 SMTP,除了 SMTP 主机访问外,还必须将数据库用户设置为访问控制条目 (Access Control Entry,ACE) 以进行 wallet 访问。要使用 OCI 电子邮件传送服务进行安全 SMTP 访问,必须使用简单验证和安全层 (SASL) 协议(例如 PLAIN、CRAM-MD5、LOGIN)对 Oracle Cloud Infrastructure 账户进行验证。例如,请参见 SMTP Send Email Sample Code 中的示例代码。
  5. 编写 PL/SQL 代码以使用 UTL_MAIL 发送电子邮件。

    提示:

    如果您正在自行开发发送电子邮件过程,请确保您的代码符合 SMTP Send Email Sample Code
  6. 使用您在步骤 5 中创建的 PL/SQL 过程发送测试电子邮件。
    例如:
    execute send_mail('taylor@example.com', 'Email from Oracle Autonomous Database', 'Sent using UTL_SMTP');

See UTL_SMTP in Oracle Database 19c PL/SQL Packages and Types Reference or Oracle Database 23ai PL/SQL Packages and Types Reference for further reference.

有关将 UTL_SMTPAutonomous Database 结合使用的更多信息,请参阅关于使用 Database PL/SQL Packages 的说明

SMTP 发送电子邮件示例代码

显示在 an Autonomous Database 上使用 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;
/

以电子邮件形式从 Autonomous Database 发送消息

适用于:适用 仅限 Oracle Public Cloud

您可以使用 DBMS_CLOUD_NOTIFICATION 以电子邮件形式发送消息。
  1. 确定用于电子邮件传送的 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

  2. 为电子邮件传送生成 SMTP 身份证明。在您发送电子邮件时,UTL_SMTP 使用凭据对电子邮件传送服务器进行验证。

    有关更多信息,请参见 Generate SMTP Credentials for a User

  3. 为电子邮件传送创建批准的发件人。对于使用 UTL_SMTP.MAIL 作为 "From" 的所有电子邮件地址,请完成此步骤。

    有关更多信息,请参见管理批准的发件人

  4. 通过附加访问控制条目 (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;
    /
  5. 创建身份证明对象并使用 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、主题、接收者和接收者。

    • sender :指定步骤 3 中批准的发件人的电子邮件 ID。

    • smtp_host :指定步骤 2 中的 SMTP 主机名。

    • subject :指定电子邮件的主题。

    • 收件人:指定收件人的电子邮件 ID。当有多个收件人时,在电子邮件 ID 之间使用逗号。

    • to_cc :指定接收电子邮件抄送的电子邮件 ID。当有多个抄送收件人时,在电子邮件 ID 之间使用逗号。

    • to_bcc :指定接收电子邮件密件抄送的电子邮件 ID。当有多个密件抄送收件人时,在电子邮件 ID 之间使用逗号。

    有关更多信息,请参见SEND_MESSAGE Procedure

以电子邮件形式从 Autonomous Database 发送查询结果

适用于:适用 仅限 Oracle Public Cloud

可以使用 DBMS_CLOUD_NOTIFICATION 程序包以电子邮件形式发送查询结果。

要使用 DBMS_CLOUD_NOTIFICATION 发送邮件,请执行以下操作:

  1. 确定用于电子邮件传送的 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

  2. 为电子邮件传送生成 SMTP 身份证明。在您发送电子邮件时,UTL_SMTP 使用凭据对电子邮件传送服务器进行验证。

    有关更多信息,请参见 Generate SMTP Credentials for a User

  3. 为电子邮件传送创建批准的发件人。对于使用 UTL_SMTP.MAIL 作为 "From" 的所有电子邮件地址,请完成此步骤。

    有关更多信息,请参见管理批准的发件人

  4. 通过附加访问控制条目 (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;
    /
  5. 创建身份证明对象并使用 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 参数指定发件人、smtp_host、主题、收件人、CC 或 BCC 的收件人、消息、数据类型以及 String 值中的标题。
    • sender :指定步骤 3 中批准的发件人的电子邮件 ID。

    • smtp_host :指定步骤 2 中的 SMTP 主机名。

    • subject :指定电子邮件的主题。最大大小为 100 个字符。

    • 收件人:此项指定收件人的电子邮件 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