通过PL / SQL脚本

时间:2017-11-09 09:17:57

标签: oracle email smtp

我从互联网上收到以下程序

CREATE OR REPLACE PROCEDURE send_email (
p_sender IN VARCHAR2,
p_recipient IN VARCHAR2,
p_message IN VARCHAR2
)
AS
mailcon UTL_SMTP.connection;
BEGIN
mailcon := UTL_SMTP.open_connection ('localhost');
UTL_SMTP.helo (mailcon, 'localhost');
UTL_SMTP.mail (mailcon, p_sender);
UTL_SMTP.rcpt (mailcon, p_recipient);
UTL_SMTP.DATA (mailcon,
'From: '
|| p_sender
|| UTL_TCP.crlf
|| 'To: '
|| p_recipient
|| UTL_TCP.crlf
|| 'Subject: SMS From Database'
|| UTL_TCP.crlf
|| p_message
);
UTL_SMTP.quit (mailcon);
END; 

此过程正在成功编译。 执行程序时

exec SEND_email('abc@gmail.com', 'xyz@gmail.com','My first EMAIL');

我收到以下错误消息

第1行的错误:

ORA-29279: SMTP permanent error: 554 Can not connect to e-mail server. Error:100502
ORA-06512: at "SYS.UTL_SMTP", line 17
ORA-06512: at "SYS.UTL_SMTP", line 98
ORA-06512: at "SYS.UTL_SMTP", line 138
ORA-06512: at "PERFECT.SEND_SMS", line 9
ORA-06512: at line 1

请帮忙

1 个答案:

答案 0 :(得分:0)

首先测试

首先测试您的SMTP服务器是否正常工作。你需要telnet实用程序(或类似的,nc netcat也可以工作)。

ip-172-31-3-158:~$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ip-172-31-3-158.eu-west-1.compute.internal ESMTP Exim 4.86_2 Ubuntu Thu, 09 Nov 2017 10:55:59 +0000
MAIL FROM: abc@gmail.com
250 OK
RCPT TO: xyz@gmail.com
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
From: abc@gmail.com
To: xyz@gmail.com
Subject: SMS From Database

message body
.
250 OK id=1eCkVW-00018X-Ak
QUIT
221 ip-172-31-3-158.eu-west-1.compute.internal closing connection
Connection closed by foreign host.
ip-172-31-3-158:~$ 

然后检查您是否收到250 OK,最后是否收到目标电子邮件。

为什么失败

请注意,您通过localhost发送了一封来自gmail.com帐户的电子邮件广告。最有可能的问题是,您的localhost SMTP服务器无权以gmail.com的身份发送电子邮件。电子邮件可能会立即被拒绝或排队,最后被删除。

所以这意味着,对:SMTP服务器和邮件域很重要。使用smtp.gmail.com发送xx@gmail.com并使用smtp.acme.org发送为yyy@acme.org。这种机制是为了避免伪造电子邮件地址。这句话是一种简化,但你明白了。

以Google格式发送

您需要做什么才能以Google用户身份发送?连接到Google SMTP服务器本身(端口25不起作用,smtp.gmail.com:465需要SSL连接),验证您自己,然后发送电子邮件。首先使用原始SMTP协议进行测试。它比第一眼看上去更复杂 - 需要额外的数据库设置才能到达外部SMTP(不是本地主机),而SSL可能是Oracle的一个问题。寻找下面更实用的解决方案。

实用解决方案

另一个更好的选择是从您的组织的SMTP服务器(或实际上是您的localhost)发送电子邮件地址中的SMTP域的电子邮件。通常,组织允许从组织的IP地址范围内的客户端发送未经身份验证的电子邮件。

所以假设您希望继续localhost,只需提供真实的电子邮件地址(假设您是acme.org并且数据库是从oracle运行的用户,使用from: oracle@acme.org)。 "首先测试" - 如果它与telnet一起工作并且电子邮件已发送,那么请关注PLSQL部分。

相关问题