gpt4 book ai didi

sql - 向 UTL_MAIL.SEND 提供凭据以绕过 ORA-29278

转载 作者:行者123 更新时间:2023-12-04 01:40:04 27 4
gpt4 key购买 nike

我正在尝试使用 UTL_MAIL.Send 打包过程从 PL/SQL 程序发送电子邮件。但我收到以下错误:

ORA-29278: SMTP transient error: 421 Service not available



我在网上查了一下,发现这个错误是因为运行我的Oracle数据库的主机上没有SMTP服务。

现在如果我想使用另一个 SMTP 服务器,例如,hotmail 的“smtp.live.com”,我需要我的用户名和密码。

如何将我的密码输入 UTL_MAIL.Send程序调用?

(根据我的理解,为了使用任何其他 SMTP 服务器,我必须提供我的用户名/密码)。我知道要使用 UTL_MAIL包,我们用初始化参数设置SMTP服务器,我们可以在“Sender”参数中提供用户名,但问题是我们应该在哪里提供密码?

最佳答案

基本上你必须使用“较低级别” UTL_SMTP 包,以便发送远程 SMTP 服务器所需的各种 SMTP 消息。
验证
来自 Stefano Ghio's blog :

 -- prepare base64 encoded username and password
l_encoded_username := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(username)));
l_encoded_password := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(password)));

-- Open connection and send EHLO and AUTH messages
l_conn := UTL_SMTP.open_connection(smtpHost, smtpPort);
UTL_SMTP.ehlo(l_conn, smtpHost);--DO NOT USE HELO
UTL_SMTP.command(l_conn, 'AUTH', 'LOGIN');
UTL_SMTP.command(l_conn, l_encoded_username);
UTL_SMTP.command(l_conn, l_encoded_password);
这里的主要问题是您需要能够发送 AUTH为您的服务器使用“正确”身份验证方案的消息。我不能专门说“smtp.live.com”,但根据服务器的配置,它们可能是不同的身份验证方案,例如 PLAINLOGIN , DIGEST_MD5 , ... 通常(总是?)参数( usernamepassword )是 base64 编码的。
发送邮件
但坏消息是,由于您现在使用的是低级库,您必须实现 SMTP protocol 的客户端部分。你自己。来自与上述相同的来源(由我自己编辑以只保留绝对最少的必要内容):
UTL_SMTP.mail(l_conn, mailFrom);
UTL_SMTP.rcpt(l_conn, rcptTo);
[...]

--start multi line message
UTL_SMTP.open_data(l_conn);

--prepare mail header
UTL_SMTP.write_data(l_conn, 'To: ' || rcptTo || crlf);
UTL_SMTP.write_data(l_conn, 'From: ' || mailFrom || crlf);
UTL_SMTP.write_data(l_conn, 'Subject: ' || messageSubject || crlf);

--include the message body
UTL_SMTP.write_data(l_conn, messageBody || crlf || crlf);

--send the email and close connection
UTL_SMTP.close_data(l_conn);
UTL_SMTP.quit(l_conn);
使用 SSL/TLS
而现在,对于 非常坏的消息 : 某些服务器需要安全连接。声称类似 530 Must issue a STARTTLS command first .不幸的是, UTL_SMTP.STARTTLS 仅从 Oracle Database 11g 第 2 版 (11.2.0.2) 开始支持。
如果您足够幸运使用最新版本的 Oracle,您应该编写类似的内容来打开与您的服务器的安全连接:
l_conn := UTL_SMTP.open_connection(l_conn, smtpHost,
wallet_path => 'file:/oracle/wallets/smtp_wallet',
wallet_password => 'password',
secure_connection_before_smtp => FALSE);
UTL_SMTP.starttls(l_conn);
引用 Oracle 的文档:

SSL/TLS requires an Oracle wallet which must be specified when the connection was opened by the OPEN_CONNECTION Functions.


请查看相应文档查看 how to create and manage wallet

再读几本:
  • Oracle's documentation about sending e-mail from PL/SQL 也有一些很好的例子来描述您使用 UTL_SMTP 正确发送邮件消息.
  • SMTP Authentification Wikipedia page用于典型 SMTP session 的转录。
  • 关于sql - 向 UTL_MAIL.SEND 提供凭据以绕过 ORA-29278,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186179/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com