我正在编写一个Rust应用程序,它将通过启用了SMTP功能的Exchange服务器发送电子邮件。根据{{3}},所需的设置为:
这些都得到了网络邮件服务的POP / IMAP设置的证实。
这是我的代码(有一些审查):
extern crate lettre;
use self::lettre::email::EmailBuilder;
use self::lettre::transport::smtp::{SecurityLevel, SmtpTransportBuilder, SUBMISSION_PORT};
use self::lettre::transport::smtp::authentication::Mechanism;
use self::lettre::transport::EmailTransport;
pub fn send_mail() {
let email = EmailBuilder::new()
.from("my email")
.to("destination email")
.body("testing")
.subject("testing")
.build()
.unwrap();
// Connect to SMTP server
let mut transport = SmtpTransportBuilder::new(("smtp.office365.com", SUBMISSION_PORT))
.expect("Failed to create email transport")
.encrypt()
.smtp_utf8(true)
.credentials("my email", "my password")
.authentication_mechanism(Mechanism::Login)
.build();
println!("Mail transport built");
println!("{:?}", transport.send(email.clone()));
}
当我编译并运行代码时,它给了我这个错误:
Err(Permanent(响应{代码:代码{严重程度: PermanentNegativeCompletion,类别:未指定3,细节:0}, 消息:[" 5.7.57 SMTP;客户端未通过身份验证以发送匿名 MAIL FROM [SYXPR01CA0106.ausprd01.prod.outlook.com]"]})中的邮件))
为什么会这样?
我的研究中最接近的是GitHub上与lettre库相关的问题,该库不支持Login
身份验证机制(Office 365使用);但是,代码库已更新为支持Login
,我直接从GitHub使用master分支,因此理论上我的应用程序应该支持Login
机制。
编辑:忘记提到我尝试了EHLO到服务器,但它返回了一个(客户端:(连接已关闭))错误。
答案 0 :(得分:0)
我使用telnet和openssl尝试直接连接到我的SMTP服务器,在那里我发现AUTH LOGIN需要3个命令;一个发送AUTH LOGIN代码,一个发送用户名,另一个发送密码。我发现lettre库将其所有AUTH命令实现为单个命令,因此这不是与服务器一起工作的。我下载了库的源代码,更改了send函数来执行三个单独的命令,重新编译我的代码,一切正常:)
我对lettre代码的补充:
if (accepted_mechanisms[0] == Mechanism::Login) &&
(accepted_mechanisms.capacity() == 1) {
try_smtp!(self.client.command("AUTH LOGIN"), self);
try_smtp!(self.client.command(base64::encode_config(
&username.as_bytes(),
base64::STANDARD).as_str()), self);
try_smtp!(self.client.command(base64::encode_config(
&password.as_bytes(),
base64::STANDARD).as_str()), self);