【问题标题】:How Can I Send Emails in PL/SQL (Oracle)?如何在 PL/SQL (Oracle) 中发送电子邮件?
【发布时间】:2019-07-24 21:02:52
【问题描述】:

我有一个程序可以计算 SMS_OUTBOX 表中的行数,如果它的行数超过 1000 则发送电子邮件。我的程序如下:

CREATE OR REPLACE PROCEDURE SEND_EMAIL_ABOUT_PENDING_SMS IS
  CHECK_SMS_COUNT NUMBER := 1000;
  CURRENT_SMS_COUNT NUMBER;
BEGIN
  SELECT COUNT(1) INTO CURRENT_SMS_COUNT FROM SMS_SCHEMA.SMS_OUTBOX;

  IF CURRENT_SMS_COUNT >= CHECK_SMS_COUNT THEN
    UTL_MAIL.SEND(
        sender=>'<SENDER_EMAIL>',
        recipients=>'<RECIPIENT_EMAIL>',
        subject=>'Pending SMS',
        Message=>'Pending SMS count exceeded.'
    );
  END IF;
END SEND_EMAIL_ABOUT_PENDING_SMS;
/

当我编译上面的代码时,我得到了这个错误。

然后我尝试这行代码在没有过程的情况下执行:

EXEC UTL_MAIL.SEND(
    sender=>'<SENDER_EMAIL>',
    recipients=>'<RECIPIENT_EMAIL>',
    subject=>'Pending SMS',
    Message=>'Pending SMS count exceeded.'
);

然后我得到了这个错误:

PLS-00302:必须声明组件“SEND”

我对 Oracle(和 PL/SQL)非常陌生。谁能帮我在Oracle中发送电子邮件以及需要什么配置?

【问题讨论】:

标签: oracle plsql oracle11g oracle10g utl-mail


【解决方案1】:

请检查UTL_MAIL是否安装正确。

点击链接UTL_MAIL获取所需信息和配置

Setup
The package is loaded by running the following scripts.

CONN sys/password AS SYSDBA
@$ORACLE_HOME/rdbms/admin/utlmail.sql
@$ORACLE_HOME/rdbms/admin/prvtmail.plb

In addition the SMTP_OUT_SERVER parameter must be set to identify the SMTP server.

CONN sys/password AS SYSDBA
ALTER SYSTEM SET smtp_out_server='smtp.domain.com' SCOPE=SPFILE;

-- Instance restart only necessary in 10gR1.
SHUTDOWN IMMEDIATE
STARTUP

【讨论】:

  • 我在Oracle中配置SMTP时,在Oracle中找不到任何关于SMTP密码配置的文章。这是我目前的困惑。他们只配置 SMTP 服务器和端口。由于我是 Oracle 新手,我是否遗漏了什么?
  • 您需要为 SMTP 服务器配置 ACL。这就是 Oracle 文档所说的“此 UTL_MAIL 包现在是调用者的权限包,调用用户将需要 ACL 中授予的连接权限(访问控制list) 分配给他想要连接的远程网络主机。
  • 请注意,Oracle 不包括实际的 SMTP 服务器。因此,如果您还没有电子邮件服务器,则需要安装电子邮件服务器。
【解决方案2】:

或者,您可以使用utl_http.request 方法

  v_url := 'http://<yourWebSite>/notification.asp?sender=<SENDER_EMAIL>
                                                 &recipients=<RECIPIENT_EMAIL>
                                                 &subject=Pending SMS
                                                 &message=Pending SMS count exceeded.';

  v_rep := utl_http.request(utl_url.escape(v_url, false, 'UTF-8'));

在哪里

  v_url varchar2(4000);
  v_rep varchar2(4000);

需要在begin关键字之前声明。

【讨论】:

    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2011-12-06
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多