当前位置: 首页 > 知识库问答 >
问题:

无法使用 c# SmtpClient 从 Office 365 发送电子邮件

能帅
2023-03-14

尝试使用SmtpClient从我的c# winforms应用程序发送电子邮件。根据这篇MS文章来看,这应该是可行的。我已经搜索了许多论坛等,没有找到任何解决方案。错误消息似乎表明客户端未通过身份验证。密码是正确的,我已经用这个密码登录了。2FA是开着的,但是它不应该妨碍我们,不是吗?

我查过的东西都到位了

  1. 启用SSl
  2. 来自电子邮件和用户电子邮件是相同的
  3. 端口587
  4. 我在Outlook中有这个帐户,它发送得很好
  5. 防火墙没有阻止此端口。我有其他代码在非O365主机上使用完全相同的代码,它工作正常

法典

            var userName = "user@domain.onmicrosoft.com";
            var password = "password";
            var msg = new MailMessage();
            msg.To.Add(new MailAddress("user@gmail.com"));
            msg.From = new MailAddress(userName);
            msg.Subject = "Test Office 365 Account";
            msg.Body = "Testing email using Office 365 account.";
            msg.IsBodyHtml = true;

            var client = new SmtpClient{
                Host = "smtp.office365.com",
                Credentials = new System.Net.NetworkCredential(userName, password),
                Port = 587,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                EnableSsl = true
            };

            client.Send(msg);

例外情况

  • SMTP 服务器需要安全连接,或者客户端未经过身份验证。服务器响应为:5.7.57 SMTP;客户端未通过身份验证以在邮件发件人期间发送匿名邮件

邮件工具包实施(vasily.sib建议)

var message = new MimeMessage();
        message.From.Add(new MailboxAddress("Test User", "user@domain.onmicrosoft.com"));
        message.To.Add(new MailboxAddress("Gmail User", "testuser@gmail.com"));
        message.Subject = "test";

        message.Body = new TextPart("plain")
        {
            Text = @"test"
        };

        var client = new SmtpClient(new ProtocolLogger("imap.log"));


        // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;

        client.Connect("smtp.office365.com", 587, SecureSocketOptions.Auto); //this is fine and it connects

        var clientAuthenticationMechanisms = client.AuthenticationMechanisms;
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        // Note: only needed if the SMTP server requires authentication
        client.Authenticate("user@domain.onmicrosoft.com", "password"); // this is where it fails with Authentication Failure

        client.Send(message);
        client.Disconnect(true);

邮件工具包日志输出

Connected to smtp://smtp.office365.com:587/?starttls=when-available
S: 220 SYCP282CA0015.outlook.office365.com Microsoft ESMTP MAIL Service ready at Mon, 25 Nov 2019 04:49:36 +0000
C: EHLO [192.168.2.50]
S: 250-SYCP282CA0015.outlook.office365.com Hello [58.6.92.82]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-STARTTLS
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 SMTP server ready
C: EHLO [192.168.2.50]
S: 250-SYCP282CA0015.outlook.office365.com Hello [58.6.92.82]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-AUTH LOGIN XOAUTH2
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: AUTH LOGIN
REMOVED BASE64 DATA (password, login)
S: 535 5.7.3 Authentication unsuccessful [SYCP282CA0015.AUSP282.PROD.OUTLOOK.COM]

共有2个答案

狄元魁
2023-03-14

我今天也遇到了同样的问题。Office365还需要TLS连接。因此,您应该在代码中添加以下代码

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
鱼宜
2023-03-14

解决。是2FA阻止了它的发生。关闭它,它可以工作

 类似资料:
  • responseerror:禁止在d:\node-projects\ecom\node_modules@sendgrid\client\src\类\client.js:146:29在processTicksAndRejections(internal/process/task_queues.js:93:5){ 代码:403,response:{headers:{server:'nginx',dat

  • 我正在尝试使用CodeIgniter的电子邮件库发送电子邮件。这是我写的代码。 错误:这是我得到的错误。 遇到以下SMTP错误:0php_network_getaddresses:getaddrinfo失败:名称或服务未知无法发送数据:AUTH LOGIN发送AUTH LOGIN命令失败。错误:无法发送数据:邮件从:从:遇到以下SMTP错误:无法发送数据:RCPT TO:到:遇到以下SMTP错误:

  • 我下载了Office 365 Connect ASP。NET MVC示例代码http://dev.office.com/code-samples-detail/5985,将其注册为Azure Active Directory中的应用程序(我具有全局管理员权限),并授予其所需的权限-“登录并读取用户配置文件”和“以用户身份发送邮件”(无其他权限),以及配置了web。配置为“ClientID”和“Cl

  • 我得到下面提到的错误。我将mail.jar、activation.jar、mailapi.jar、common-lang3.jar复制到/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext

  • 我正在尝试使用C#使用我的Office 365凭据发送电子邮件。但是它无法发送并获得异常。 如何解决这个问题?可以从办公室365发送吗? 事务失败。服务器响应为:5.2.0 STOREDRV.Submission。异常:SendAsDeniedException。MapiExceptionSendAsDenied;由于消息为“无法提交消息”的永久异常,无法处理消息。

  • 我的: 但是邮件不会发送到该地址,在控制台中,当我单击时,正在打印,但它不会发送任何电子邮件。 我用的是Django 1.3.7和Python 2.6。 不知道是版本的问题还是什么逻辑问题。