使用C#发送经过身份验证的SMTP

时间:2011-11-04 14:01:25

标签: c# asp.net email smtp smtp-auth

我已经与托管公司购买了经过身份验证的SMTP软件包。

我已成功通过Outlook 2010测试了帐户设置。

Outlook设置:

电子邮件:me@domain.com 外发SMTP :smtp.hostingcompany.net

登录信息:

  • 用户:mydomain.com_account
  • 传递:密码

更多设置>发送服务器:

  • 我的传出服务器(SMTP)需要身份验证
  • 用户:mydomain
  • 传递:密码

我在指定NetworkCredentials时尝试了所有可能的组合,并且我不断收到 SMTP例外:“Faulure发送电子邮件” InnerException :Base-64 char数组的长度无效。

public static void SendEmail(string To, string Subject, string Body)
    {
        try
        {
            using (SmtpClient mySmtpClient = new SmtpClient(GlobalSettings.EmailHost))
            {
                mySmtpClient.UseDefaultCredentials = false;
                //mySmtpClient.EnableSsl = false;
                mySmtpClient.Credentials = new NetworkCredential(mydomain.com_account, GlobalSettings.EmailPassword);

                MailAddress from = new MailAddress("email@mydomain");
                MailAddress to = new MailAddress(To);

                using (
                    MailMessage myMail = new MailMessage(from, to)
                    {
                        Subject = Subject,
                        SubjectEncoding = Encoding.UTF8,
                        Body = Body,
                        BodyEncoding = Encoding.UTF8,
                        IsBodyHtml = true
                    })
                {
                    mySmtpClient.Send(myMail);
                }
            }
        }
        catch (SmtpException ex)
        {
            Log.WriteLog(string.Format("[Send Mail Exception] --> SMTPException has occurred: {0}", ex.Message), LogLevel.Error);
        }
        catch (Exception ex)
        {
            Log.WriteLog(string.Format("[Send Mail Exception] --> Exception has occurred: {0}", ex.Message), LogLevel.Error);
        }
    }

我已经为NetworkCredential()尝试了三种可能的用户名登录参数。

提前致谢。

编辑:NTLM Hack

我在代码中添加了以下几行:

FieldInfo transport = _client.GetType().GetField("transport",
    BindingFlags.NonPublic | BindingFlags.Instance);

FieldInfo authModules = transport.GetValue(_client).GetType()
    .GetField("authenticationModules",
        BindingFlags.NonPublic | BindingFlags.Instance);

Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 0);
modulesArray.SetValue(modulesArray.GetValue(2), 1);
modulesArray.SetValue(modulesArray.GetValue(2), 3);

我现在收到一条新消息:

Mailbox unavailable. The server response was: relay not permitted

2 个答案:

答案 0 :(得分:1)

根据以下文章:"Hacking" System.Net.Mail.SmtpClient,当SmtpClient选择使用NTLM身份验证进行身份验证时,可能会抛出异常。

该文章提供了一个修复程序,尽管正如文章名称所暗示的那样,它是一个黑客。

然而,在评论中,海报还指出,错误的密码可能会导致相同的异常。

答案 1 :(得分:1)

重新解决你的第二个问题:

  

邮箱不可用。服务器响应是:不允许中继

这是因为服务器现在没有可接受的方法来验证您,并且不愿意冒险获得“开放中继”的声誉。

这可能是可以解决的。问题是你使用的hack太过沉重。它覆盖了除“摘要”之外的每个身份验证模块,当我们需要做的就是覆盖NTLM。

试试这个缩减版:

FieldInfo transport = _client.GetType().GetField("transport",
BindingFlags.NonPublic | BindingFlags.Instance);

FieldInfo authModules = transport.GetValue(_client).GetType()
    .GetField("authenticationModules",
        BindingFlags.NonPublic | BindingFlags.Instance);

Array modulesArray = authModules.GetValue(transport.GetValue(_client)) as Array;
modulesArray.SetValue(modulesArray.GetValue(2), 1);