How to send mails using SmtpClient and DefaultNetworkCredentials to a distribution list that only allows authenticated senders?

三世轮回 提交于 2019-12-10 16:09:33

问题


I'm trying to send automated emails from a C# console application from machines to clients all on the same domain via our internal Exchange 2007 server (using SMTP), but I'm hitting a snag with distribution lists that only allow authenticated senders. Basically the mails I'm sending are getting rejected by Exchange with:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

I'm using System.Net.Mail.SmtpClient and setting the Credentials property to System.Net.CredentialCache.DefaultNetworkCredentials, but somewhere along the line, the credentials of the account running this program (me, a valid domain user with a valid mailbox) are not getting passed down to Exchange correctly.

I'm using System.Net.CredentialCache.DefaultNetworkCredentials because I do not want to hard code a username or password (either in the code itself or in any sort of configuration file); I want the process to authenticate with our SMTP server using Windows authentication.

Here is a test program I've been using to reproduce the problem (domain names have been anonomized):

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var smtpClient = new SmtpClient
                                 {
                                     Host = "MAIL",
                                     Port = 25,
                                     DeliveryMethod = SmtpDeliveryMethod.Network,
                                     Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
                                 };

            var mailMessage = new MailMessage
                                  {
                                      Body = "Testing",
                                      From = new MailAddress(Environment.UserName + "@example.com"),
                                      Subject = "Testing",
                                      Priority = MailPriority.Normal
                                  };

            mailMessage.To.Add("AuthTESTGroup@example.com");

            smtpClient.Send(mailMessage);
        }
    }
}

Whenever I run this as myself (again, I'm a valid user on the domain, with an existing mailbox on the Exchange server) I get an undeliverable bounce message from Exchange with the response:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

I talked to our Exchange server admin and he saw the following error from the Exchange server's event log:

Account For Which Logon Failed:
  Security ID: NULL SID
  Account Name: 
  Account Domain: 

Failure Information:
  Failure Reason: Unknown user name or bad password.
  Status:         0xc000006d
  Sub Status:     0xC0000064

Apparently that status code and sub status code translate to:

0xc000006d This is either due to a bad username or authentication information. Usually logged as status code with 0xc0000064 as substatus

0xC0000064 user name does not exist

So again, it's as if somewhere along the line, my Windows credentials are not getting passed down to the Exchange server even though I'm setting the SmtpClient.Credentials to System.Net.CredentialCache.DefaultNetworkCredentials

Any ideas?

Thanks in advance!


回答1:


you need to pass username, password

here is a code snippet of how I would do it... keep in mind this is a code snippet you need to make the necessary changes to fit your Use Case

MailClient = new SmtpClient();
MailClient.Credentials = new System.Net.NetworkCredential(username, password);

below is another example but uses the server variable.. this maybe what you need to do try and let me know the server for example you can pass as your domain.com example : //SmtpClient client = new SmtpClient("smtp.contoso.com");//this would be server //client.Credentials = CredentialCache.DefaultNetworkCredentials;

    public static void CreateBccTestMessage(string server)
    {
        MailAddress from = new MailAddress("ben@contoso.com", "Ben Miller");
        MailAddress to = new MailAddress("jane@contoso.com", "Jane Clayton");
        MailMessage message = new MailMessage(from, to);
        message.Subject = "Using the SmtpClient class.";
        message.Body = @"Using this feature, you can send an e-mail message from an application very easily.";
        MailAddress bcc = new MailAddress("manager1@contoso.com");
        message.Bcc.Add(bcc);
        SmtpClient client = new SmtpClient(server);
        client.Credentials = CredentialCache.DefaultNetworkCredentials;
        Console.WriteLine("Sending an e-mail message to {0} and {1}.",
            to.DisplayName, message.Bcc.ToString());
        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in CreateBccTestMessage(): {0}",
                        ex.ToString());
        }
    }


来源:https://stackoverflow.com/questions/9537339/how-to-send-mails-using-smtpclient-and-defaultnetworkcredentials-to-a-distributi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!