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

C# 使用C发送经过身份验证的SMTP#,c#,asp.net,email,smtp,smtp-auth,C#,Asp.net,Email,Smtp,Smtp Auth,我已向我的托管公司购买了一个经过身份验证的SMTP包 我已通过Outlook 2010成功测试了帐户设置 Outlook设置: 电子邮件:me@domain.com 传出SMTP:SMTP.hostingcompany.net 登录信息: 用户:mydomain.com\u帐户 通过:密码 更多设置>传出服务器: 我的传出服务器(SMTP)需要身份验证 用户:mydomain 通过:密码 在指定NetworkCredentials时,我尝试了所有可能的组合,并不断收到一个SMTP异常:“

我已向我的托管公司购买了一个经过身份验证的SMTP包

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

Outlook设置:

电子邮件:me@domain.com 传出SMTP:SMTP.hostingcompany.net

登录信息:

  • 用户:mydomain.com\u帐户
  • 通过:密码
更多设置>传出服务器:

  • 我的传出服务器(SMTP)需要身份验证
  • 用户:mydomain
  • 通过:密码
在指定NetworkCredentials时,我尝试了所有可能的组合,并不断收到一个SMTP异常:“Faulure正在发送电子邮件” InnerException:Base-64字符数组的长度无效

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

根据以下文章:,当SmtpClient选择使用身份验证进行身份验证时,可能会引发异常

这篇文章提供了一个补丁,尽管正如文章名称所示,这是一个黑客攻击


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

关于第二个问题:

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

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

这可能是可以解决的。问题是你使用的工具太重了。它覆盖除“摘要”之外的所有身份验证模块,而我们需要做的就是覆盖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);

你能发布你的异常的堆栈跟踪吗?有几个地方可能会出现这种情况。堆栈跟踪将有助于缩小范围。@Ragesh-刚刚添加到那里。我是否需要在传递HTML时对MailMessage对象的body属性进行编码?我很确定您不必手动对body进行编码。我也使用HTML正文,它会自动编码。如果你的服务器不喜欢你的“发件人”或“收件人”地址(它认为你是垃圾邮件发送者),通常会发生不允许的中继。或者,可能是您的用户帐户未正确验证。在这种情况下,我发现使用Wireshark查看网络流量是找到解决方案的最快方法。使用Outlook发送邮件,然后发送代码,并确定SMTP请求和Outlook正在执行的操作之间的区别。了解这一点非常好。我将在未来的发布周期中考虑实现您的精简版本。