【问题标题】:Getting "Client was not authenticated to send anonymous mail during MAIL FROM" error from Exchange SMTP using Rust lettre library使用 Rust 字母库从 Exchange SMTP 获取“客户端未通过身份验证以在 MAIL FROM 期间发送匿名邮件”错误
【发布时间】:2017-10-17 20:32:15
【问题描述】:

我正在编写一个 Rust 应用程序,它将通过启用了 SMTP 功能的 Exchange 服务器发送电子邮件。根据Microsoft's webpage,需要的设置是:

  • 服务器地址 smtp.office365.com
  • 587 端口
  • StartTLS 已启用
  • 邮件帐户登录凭据

这些都得到了网络邮件服务的 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()));
}

当我编译并运行代码时,它给了我这个错误:

错误(永久(响应{代码:代码{严重性: PermanentNegativeCompletion,类别:Unspecified3,详细信息:0 }, 消息:[“5.7.57 SMTP;客户端未通过身份验证发送匿名 MAIL FROM [SYXPR01CA0106.ausprd​​01.prod.outlook.com]"] }))

为什么会这样?

我的研究中最接近的一个问题是 GitHub 上与不支持 Login 身份验证机制(Office 365 使用)的lettre 库有关的问题;但是,代码库已更新为支持Login,我直接从GitHub 使用master 分支,所以理论上我的应用程序应该支持Login 机制。

编辑:忘了提到我尝试向服务器发送 EHLO,但它返回了一个 (Client:(Connection closed)) 错误。

【问题讨论】:

  • @FrancoisMockers 是的,我的电子邮件凭据在代码中,我将尝试使用一些替代凭据来查看它是否有效。如果这不起作用,我将尝试更改密码的方法,然后我将返回尝试使用传输的不同设置。感谢您的链接。
  • 我解决了!我使用 telnet 和 openssl 尝试直接连接到我的 SMTP 服务器,我发现 AUTH LOGIN 需要 3 个命令;一个发送AUTH LOGIN代码,一个发送用户名,另一个发送密码。原来 lettre 库将其所有 AUTH 命令实现为单个命令,因此这不适用于服务器。我下载了库的源代码,更改了发送函数以执行三个单独的命令,重新编译了我的代码,一切正常:)

标签: email smtp rust exchange-server


【解决方案1】:

我使用 telnet 和 openssl 尝试直接连接到我的 SMTP 服务器,我发现 AUTH LOGIN 需要 3 个命令;一个发送AUTH LOGIN代码,一个发送用户名,另一个发送密码。我发现 lettre 库将其所有 AUTH 命令实现为单个命令,因此这不适用于服务器。我下载了库的源代码,更改了发送函数以执行三个单独的命令,重新编译了我的代码,一切正常:)

我对字母代码的补充:

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);

【讨论】:

  • 您是否向库提交了问题或将您的代码提交给他们?
  • @Shepmaster 还没有,不过我会为它提交一个 github 问题并将它们链接到这里
猜你喜欢
  • 2015-08-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2019-10-21
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多