2011-11-04 30 views
2

我已与我的托管公司购买了经过身份验证的SMTP程序包。使用C发送经过身份验证的SMTP#

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

Outlook设置:

电子邮件[email protected] 传出SMTP:smtp.hostingcompany.net

登录信息:

  • 用户: mydomain.com_account
  • :密码

更多设置>发送服务器:

  • 我的发送服务器(SMTP)要求认证
  • 用户:MYDOMAIN
  • 通行证:密码

指定NetworkCredentials当我已经尝试了所有可能的组合和一直收到SMTP异常:“Faulure发送电子邮件” 的InnerException:用于基本-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 protected]"); 
       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哈克

添加以下行到我的代码:

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 
+0

能否请您发表您的异常的堆栈跟踪?有几个地方可能会弹出。堆栈跟踪将有助于缩小此范围。 – Ragesh

+0

@Ragesh - 刚刚添加到那里。当我传递HTML时,是否需要编码MailMessage对象的body属性? – Seany84

+0

我敢肯定,你不必手动编码身体。我也使用HTML主体,并自动对它进行编码。 – Ragesh

回答

1

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

该文章提供了一个修复,虽然文章名称暗示它是一个黑客。

但是在评论中,一张海报还指出,不正确的密码可能导致相同的异常。

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); 
+0

这真的很好知道。我将着眼于在未来的发布周期中实施您的精简版。 – Seany84

相关问题