如何使用 PL/SQL 发送电子邮件?

Posted

技术标签:

【中文标题】如何使用 PL/SQL 发送电子邮件?【英文标题】:How to send email using PL/SQL? 【发布时间】:2014-09-08 08:04:41 【问题描述】:

各位朋友,我有一个任务,我的任务是编写一个用于发送电子邮件的 pl/sql 程序,该程序使用 gmail 作为邮件服务器。

我写这个程序

CREATE OR REPLACE PROCEDURE send_mail (p_to        IN VARCHAR2,
                                       p_from      IN VARCHAR2,
                                       p_message   IN VARCHAR2,
                                       p_smtp_host IN VARCHAR2,
                                       p_smtp_domain IN varchar2, 
                                       p_smtp_port IN NUMBER DEFAULT 465) AS
  l_mail_conn   UTL_SMTP.connection;
BEGIN
  l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  UTL_SMTP.ehlo(l_mail_conn, p_smtp_domain);  
  UTL_SMTP.command(l_mail_conn,'AUTH LOGIN');  
  UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw('mygmail@gmail.com')));
  UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw('mypassword')));
  UTL_SMTP.mail(l_mail_conn, p_from);
  UTL_SMTP.rcpt(l_mail_conn, p_to);
  UTL_SMTP.data(l_mail_conn, p_message || UTL_TCP.crlf || UTL_TCP.crlf);
  UTL_SMTP.quit(l_mail_conn);
END;
/

程序创建成功

为了执行这个过程,我使用了以下代码

BEGIN
  send_mail(p_to        => 'someone@gmail.com',
            p_from      => 'mygmail@gmail.com',
            p_message   => 'This is a test message.',
            p_smtp_host => 'smtp.gmail.com',
        p_smtp_domain => 'gmail.com'
);
END;
/

执行后出现以下错误

ERROR at line 1:
ORA-29278: SMTP transient error: 421 Service not available
ORA-06512: at "SYS.UTL_SMTP", line 17
ORA-06512: at "SYS.UTL_SMTP", line 96
ORA-06512: at "SYS.UTL_SMTP", line 138
ORA-06512: at "ZAHID.SEND_MAIL", line 11
ORA-06512: at line 2

如果我更改了端口号 25,则会收到此错误:

ERROR at line 1:
ORA-29279: SMTP permanent error: 530 5.7.0 Must issue a STARTTLS command first. t9sm10042472wjf.41
- gsmtp
ORA-06512: at "SYS.UTL_SMTP", line 17
ORA-06512: at "SYS.UTL_SMTP", line 98
ORA-06512: at "SYS.UTL_SMTP", line 158
ORA-06512: at "ZAHID.SEND_MAIL", line 13
ORA-06512: at line 2

我的oracle版本是Oracle9i,我找了很多解决上述错误的方法,但没有成功,请检查我的代码并帮助我解决,我将非常感谢你。

【问题讨论】:

Configuring UTL_MAIL Package Prerequisites 的可能重复项 不明白sathya,它没有解决我的问题。 【参考方案1】:

你认为421 Service not available error 是什么?您需要提供 smtp 凭据。

Oracle 只是受害者,罪魁祸首是邮件服务器配置。做:

ALTER SYSTEM SET smtp_out_server = 'your_config' scope=spfile;

然后提供正确的凭据。尝试使用测试电子邮件。看看http://www.orafaq.com/forum/m/588498/?srch=421+Service+not+available#msg_588498

总结一下,你的 SMTP 服务器没有启动。也许,我上面没说清楚,

ORA-29278: SMTP transient error: 421 Service not available 表示凭据不正确。

ORA-29279: SMTP permanent error: 530 5.7.0 Must issue a STARTTLS command first. t9sm10042472wjf.41 - gsmtp 表示 SMTP 服务器未启动。需要哪个 STARTTLS 命令。


更新:伙计们,我真诚地道歉,我完全错过了 OP 已经提到他在 9i 上。

【讨论】:

他已提供凭据(send_mail 的第 3 行)。 utl_mail 不支持 TLS,正如 Justin 所提到的链接问题和 gmail 需要 TLS 来启动身份验证 我知道,这就是为什么我提到了建议“您的 SMTP 服务器未启动”的链接。也许,我应该在我的答案中添加这个。 您能详细说明一下吗?这对我来说不是很清楚: OP 错误是否意味着服务器需要 TSL ?更改配置会解决这个问题吗? SMTP 服务器不是 OP 启动的,他连接的 SMTP 服务器是 Gmail 的。如果 gmail 的 smtp 服务器“没有启动”,很确定每个人都会注意到。这个答案现在完全错误了。 @MTO_UPAP 第 1 步。升级到 Oracle 11g r2+ 第 2 步:... 第 3 步:盈利!

以上是关于如何使用 PL/SQL 发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

通过pl/sql发送邮件

在 PL/SQL Developer 中通过电子邮件发送查询结果

PL/SQL 下邮件发送程序

Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)

来自 Oracle pl/sql 的电子邮件中的特殊字符

PL/SQL 在游标中引用另一个游标?