2014-01-19 57 views
17

我在這裏稍微困惑 - 我收到以下錯誤:「未指定SMTP主機。」 - 但它是指定?

The SMTP host was not specified.

即使我的代碼似乎是正確的(從我所看到的)。

我能夠通過包含控制器內的所有細節來手動完成,例如,

SmtpClient smtpClient = new SmtpClient("smtp.gmail.com"); 
smtpClient.Port = 587; 
... etc 

但我不應該這樣做,因爲我想用內部mailSettings細節(使其可重複使用的各種不同的控制器)。

mailSettings在我Web.Config文件:

<system.net> 
    <mailSettings> 
    <smtp from="[email protected]" deliveryMethod="Network" > 
     <network host="smtp.gmail.com" defaultCredentials="true" 
       port="587" enableSsl="true" userName="[email protected]" 
       password="example"/> 
    </smtp> 
    </mailSettings> 
</system.net> 

我的控制器動作:

[HttpPost] 
public ActionResult SubmitFeature(FormData formData) 
{ 
    SmtpClient smtpClient = new SmtpClient(); 

    MailMessage mail = new MailMessage(); 
    mail.To.Add(new MailAddress("[email protected]")); 
    mail.Body = "Test"; 

    smtpClient.Send(mail); 

    return View("Example"); 
} 

有什麼我失蹤這可能會導致此?我還沒有搞亂Web.Config中的其他設置,它們就像設置新的MVC5項目時一樣。

+0

你添加到了「Release.Web.Config」,而不是實際的Web.Config任何機會呢? – turtlepick

+0

@flaviotsf不,它在Web.Config中。我應該在其他地方使用控制器內的Web配置嗎? – user2381114

+0

我相信你應該把'defaultCredentials'改成'false'來使用提供的憑證進行驗證。 –

回答

21

在乾淨的MVC項目中,我無法複製您的問題。在ScottGu blog post here之後,我能夠毫無問題地發送gmail發送的電子郵件(VS 2013,.NET 4.5.1,MVC 5)。請注意,<system.net>元素是頂級元素,不嵌套在AppSettings<system.web>的內部。

重要

有解決方案中的幾個web.config文件中,確保mailSettings插入根級別的web.config(而不是一個設在查看文件夾)

的Web.Config

<configuration> 
    <system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network host="smtp.gmail.com" 
       port="587" 
       enableSsl="true" 
       userName="[email protected]" 
       password="SuperSecretPwd" 
       defaultCredentials="false" /> <!--This must be false on Gmail--> 
     </smtp> 
    </mailSettings> 
    </system.net> 
</configuration> 

控制器

var smtpClient = new SmtpClient(); 
var msg = new MailMessage(); 
msg.To.Add("[email protected]"); 
msg.Subject = "Test"; 
msg.Body = "This is just a test email"; 
smtpClient.Send(msg); 

目前還不清楚您包含的某些額外屬性是否導致問題(認爲它們不應該),例如傳遞方法。另外,有沒有允許SMTP訪問的設置,還是僅用於IMAP/POP傳送?

如果您可以在乾淨的項目中進行測試並取得成功,那麼這將指向項目中的web.config轉換問題或其他一些設置,以覆蓋您已有的web.config設置。

+1

您好,我實際上能夠發送電子郵件,但是我必須在控制器內指定屬性(例如port,enableSsl)。 'Web.Config'文件似乎沒有任何效果。當我將新的SmtpClient();'更改爲'新的SmtpClient(「smtp.gmail.com」);'時,我實際上收到了一個不同的錯誤 - 「必須指定地址A」,這讓我想到了Web。 Config'文件甚至沒有被識別? – user2381114

+0

@ user2945993 - 這就是我說的。我可以在web.config中設置它,它的工作原理沒有問題。你可以嘗試我在上面發佈的新代碼/乾淨項目中的代碼嗎?你還有問題嗎? – Tommy

+0

@ user2945993你是否100%認爲這些值沒有被web.config轉換覆蓋?你是在本地調試還是發佈到服務器? – Tommy

0

我小子你沒有,但我得到這個錯誤,因爲主題有[square brackets]在裏面。 和代碼是如此簡單:

string subject = "[Mail for Admin]: Hello Admins"; 
using (var mailMessage = new MailMessage(sender, recipient) { Subject = subject, Body = body, IsBodyHtml = isHtml }) 
    { 
    EmailClient.Send(mailMessage); 
    }