我使用的是 Oracle 21.C。多年来我一直使用 Oracle 的 UTIL_SMTP 从 Hotmail 帐户发送邮件。 据我了解,微软最近取消了以微软身份登录的“基本身份验证”。 微软似乎没有针对单用户 hotmail 帐户的替代方案。 有谁知道使用 Oracle 的 SMTP 向 Microsoft 进行身份验证的方法吗? 这是我的示例代码:
--This test procedure now fails on the utl_smtp.auth statement on line 65
DECLARE
l_smtp_hostname varchar2(1024);
l_smtp_port varchar2(1024);
l_wallet_path varchar2(1024);
l_wallet_password varchar2(1024);
l_domain varchar2(1024);
l_smtp_username varchar2(1024);
l_smtp_password varchar2(1024);
l_source_app varchar2(1024);
l_location varchar2(1024);
l_smtp_conn utl_smtp.connection;
l_smtp_reply utl_smtp.reply;
l_smtp_replies utl_smtp.replies;
BEGIN
l_smtp_hostname := 'outlook.office365.com';
l_smtp_port := '587';
l_domain := 'hotmail.com';
l_smtp_username := '[email protected]';
l_smtp_password := 'mYpASSWORD';
l_source_app := '111';
l_wallet_path := 'My Wallet Path';
l_wallet_password := 'My Wallet Password';
-- Open the initial connection
l_location := 'utl_smtp.OPEN_CONNECTION';
l_smtp_reply := utl_smtp.open_connection
( host => l_smtp_hostname
, port => l_smtp_port
, c => l_smtp_conn
, wallet_path => l_wallet_path
, wallet_password => l_wallet_password
, secure_connection_before_smtp => FALSE
);
If l_smtp_reply.code != 220
Then
Insert into mail_error_log (err_code, err_msg, transaction_type,
transaction_detail, source_app, code_location)
values (l_smtp_reply.code, l_smtp_reply.text, 'utl_smtp',
l_smtp_reply.code, l_source_app, l_location);
commit;
End If;
--Send the first EHLO
l_location := 'utl_smtp.EHLO - First';
l_smtp_replies := utl_smtp.ehlo(l_smtp_conn, l_smtp_hostname);
--Send the StartTLS command
l_location := 'utl_smtp.STARTTLS';
l_smtp_reply := utl_smtp.starttls(l_smtp_conn);
If l_smtp_reply.code != 220
Then
Insert into mail_error_log (err_code, err_msg, transaction_type,
transaction_detail, source_app, code_location)
values (l_smtp_reply.code, l_smtp_reply.text, 'utl_smtp',
l_smtp_reply.code, l_source_app, l_location);
commit;
End If;
--Send the second EHLO command
l_location := 'utl_smtp.EHLO - Second';
l_smtp_replies := utl_smtp.ehlo(l_smtp_conn, l_domain);
--Send the Authentication statement
l_location := 'utl_smtp.AUTH';
l_smtp_reply := utl_smtp.auth(l_smtp_conn, l_smtp_username, l_smtp_password, utl_smtp.all_schemes);
If l_smtp_reply.code != 235
Then
Insert into mail_error_log (err_code, err_msg, transaction_type,
transaction_detail, source_app, code_location)
values (l_smtp_reply.code, l_smtp_reply.text, 'utl_smtp',
l_smtp_reply.code, l_source_app, l_location);
commit;
End If;
--Call the Quit statement
utl_smtp.quit(l_smtp_conn);
EXCEPTION
When utl_smtp.transient_error
Or utl_smtp.permanent_error
Then
Begin
utl_smtp.quit(l_smtp_conn);
Exception
When utl_smtp.transient_error
Or utl_smtp.permanent_error
Then
Null;
End;
END;
此问题的解决方案是代理 SMTP 服务器,然后使用高级身份验证使用 hotmail 帐户发送邮件。例如,代理可以是 postfix 的本地实例,甚至可以是更简单的东西。