如何使用 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 Developer 中通过电子邮件发送查询结果