使用SmtpClient发送经过身份验证的邮件

时间:2015-01-20 12:13:03

标签: c# wireshark credentials smtpclient

我想通过需要身份验证的smtp主机使用c#SmtpClient发送电子邮件,否则会因拒绝中继而失败。我已阅读了很多帖子,但没有一个能完全解决我的问题,即当我指定NetworkCredentials时,在与mailhost的通信中,没有传递凭据。这让我很困惑。

这是设置凭据并发送邮件的代码:

            using (SmtpClient smtp = new SmtpClient
            {
                Host = smtpserver,
                Port = port,
                EnableSsl = ssl
            })
            {
                if (username.Length > 0)
                {
                    Console.WriteLine("Setting credentials to\nusername: {0}\npassword: {1}", username, password);
                    smtp.UseDefaultCredentials = false;
                    smtp.Credentials = new NetworkCredential(username, password);
                }
                smtp.Send(message);
            }

正确的凭据将打印到控制台。

这是Wireshark捕获的TCP流:

220 mail.myhost.com Microsoft ESMTP MAIL Service ready at Tue, 20 Jan 2015 12:44:19 +0100
EHLO DK-XYZ-800SFF1
250-mail.myhost.com Hello [172.16.123.132]
250-SIZE 52428800
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH
250-8BITMIME
250-BINARYMIME
250 CHUNKING
MAIL FROM:<myemail@myhost.dk>
250 2.1.0 Sender OK
RCPT TO:<someemail@gmail.com>
550 5.7.1 Unable to relay

尽管已在SmtpClient上设置了凭据,但显然没有进行身份验证尝试。

2 个答案:

答案 0 :(得分:0)

我解决了这个问题并在此过程中学到了一点。虽然我的代码是正确的,但我没有提供的参数之一是端口信息。从上面的SMTP日志中,我们可以看到AUTH行是空的,即没有可用于身份验证的协议。这就是为什么SmtpClient没有发送任何凭据的原因。

AUTH专线没有任何认证方法的原因是因为我使用端口25进行通信。当我切换到端口587时,smtp报告认证是可能的,并且发送了凭据并且邮件按预期发送。

答案 1 :(得分:-1)

    public static void CreateTestMessage2(string server)
    {
                string to = "jane@contoso.com";
                string from = "ben@contoso.com";
                MailMessage message = new MailMessage(from, to);
                message.Subject = "Using the new SMTP client.";
            message.Body = @"Using this new feature, you can send an e-mail message from an application very easily.";
            SmtpClient client = new SmtpClient(server);
            // Credentials are necessary if the server requires the client  
            // to authenticate before it will send e-mail on the client's behalf.
            client.UseDefaultCredentials = true;

      try {
              client.Send(message);
            }  
            catch (Exception ex) {
              Console.WriteLine("Exception caught in CreateTestMessage2(): {0}", 
                    ex.ToString() );              
      }              
        }`