我从互联网上收到以下程序
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
请帮忙
答案 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 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部分。