2011-11-04 31 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

相關問題