使用MVC5 ASP.NET和rackspace发送电子邮件

3

我使用教程在我的MVC5应用程序联系表单中设置电子邮件并通过电子邮件发送。但是,我不知道怎么做,尝试了几种不同的选项,但仍然缺少某些东西。非常感谢您的帮助!

我的邮件主机是rackspace,他们的设置可以在这里找到:http://www.rackspace.com/apps/support/portal/1088

它一切正常,只是在SendFinalMail函数中的smpt.Send(MailInfo)中不断出现错误。

SmtpException occurred
A first chance exception of type 'System.Net.Mail.SmtpException' occurred in System.dll

Additional information: The operation has timed out.

根据评论,我加上了堆栈跟踪(如果您需要更多,请告诉我):

System.Net.Mail.SmtpException occurred
  _HResult=-2146233088
  _message=The operation has timed out.
  HResult=-2146233088
  IsTransient=false
  Message=The operation has timed out.
  Source=System
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
  InnerException: 

这是我的代码:

Web.config

  <appSettings>

    <!--EMAIL SERVICES-->
    <add key="FromAddress" value="myfrom@address" />
    <add key="UserID" value="myfrom@address" />
    <add key="Password" value="myPassword" />
    <add key="SMTPPort" value="465" />
    <add key="SmtpClient" value="secure.emailsrvr.com" />
    <add key="EnableSSL" value="Yes" />
    <add key="UnobtrusiveJavaScriptEnabled" value ="true"/>
  </appSettings>

模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;

namespace SandBox.MailManager
{
    class MailManager
    {
        #region Private for email
        private string FromAddress { get; set; }
        private string EmailHost { get; set; }
        private string Pwd { get; set; }
        private string UserID { get; set; }
        private string SMTPPort { get; set; }
        private Boolean bEnableSSL { get; set; }


        #endregion


#region Default Functions for Mailing
            public MailManager()
            {
                FromAddress = System.Configuration.ConfigurationManager.AppSettings["FromAddress"];
                UserID = System.Configuration.ConfigurationManager.AppSettings.Get("UserID");
                SMTPPort = System.Configuration.ConfigurationManager.AppSettings.Get("SMTPPort");
                Pwd = System.Configuration.ConfigurationManager.AppSettings.Get("Password");
                EmailHost = System.Configuration.ConfigurationManager.AppSettings.Get("SmtpClient");

                if (System.Configuration.ConfigurationManager.AppSettings.Get("EnableSSL").ToUpper() == "YES")
                {
                    bEnableSSL = true;
                }
                else
                {
                    bEnableSSL = false;
                }
            }


private bool SendFinalMail(MailMessage MailInfo)
        {
            try
            {
                SmtpClient smtp = new SmtpClient();
                smtp.Host = EmailHost;
                smtp.Port = Convert.ToInt16(SMTPPort);
                smtp.Credentials = new System.Net.NetworkCredential(UserID, Pwd);
                smtp.EnableSsl = bEnableSSL;
                //smtp.Send(MailInfo);

                System.Threading.Thread emailThread;
                emailThread = new System.Threading.Thread(delegate()
                {
                    smtp.Send(MailInfo);
                });

                emailThread.IsBackground = true;
                emailThread.Start();

                return true;
            }
            catch (Exception e)
    {
        Console.WriteLine(e);
        return false;
        }
        }
        #endregion


 public bool SendEnquiryEmail(string ToUserEmail, string htmlBody)
        {
            try
            {
                MailMessage mail = new MailMessage();
                mail.From = new MailAddress(FromAddress);
                mail.To.Add(ToUserEmail);
                mail.CC.Add("another@email");
                mail.Subject = "Thank you. Our team will be in touch shortly";
                mail.Body = htmlBody;
                mail.IsBodyHtml = true;

                return this.SendFinalMail(mail);
            }
            catch
            {
                return false;
            }
        }
    }
}

控制器

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Contact(ContactModel Contact)
        {
            if (ModelState.IsValid) { 
                try
                {
                    MailManager.MailManager oMail = new MailManager.MailManager();

                    string htmlBody = "<html><body>Hi, ";
                    htmlBody += "<p>We've receive your message and we will in touch shortly to responded to your message,</p>";
                    htmlBody += "<br /><br /><p>You can email us directly at <a href='#'>.</p>";
                    htmlBody += "<br /><br /><p>The message we have received from you is:</p>";
                    htmlBody += "<br /><br /><p>" + Contact.Message + "</p>";
                    htmlBody += "<p><br /> Regards,</p> </body></html>";

                    bool SendEmail = oMail.SendEnquiryEmail(Contact.Email, htmlBody);

                    if (SendEmail == true)
                    {
                        return View();
                    }
                    else { 
                        return View();
                    }
                }
                catch (Exception)
                {
                    return View();
                }
            }
            return View("Model not Valid");
        }

你应该发布一个完整的错误堆栈跟踪。 - Rosdi Kasim
谢谢Rosdi,我有堆栈跟踪信息,请告诉我是否缺少其他重要细节。 - durbo
那看起来不像是完整的堆栈跟踪。你应该在SendEnquiryEmailSendFinalMail的catch块中打印堆栈跟踪。现在你正在返回false并吞噬异常。 - Rosdi Kasim
我对C#和MVC还比较新,所以不太清楚如何进行完整的堆栈跟踪。我已经添加了catch异常。但是,我找不到Console.WriteLine数据。我已经拍摄了异常对象的屏幕截图,可以发送给您。非常感谢您的帮助。 - durbo
超时提示表明你的 Rackspace 服务器无法访问 SMTP 主机,可能是由于防火墙问题或连接问题引起的。 - Jack Hughes
显示剩余3条评论
1个回答

8
我已经找到了答案。答案是: 因为System.Net.Mail不支持“隐式”SSL,只支持“显式”SSL。
我通过465端口使用SSL导致了这些问题。我更改了主机、端口并启用了SSL以进行不安全连接,它运行得很好。
我后来发现,如果我使用TLS端口587并启用了SSL,而不是从ssl端口465发送邮件,则可以正常工作。 这篇文章对我有帮助。 在.NET中通过Gmail发送电子邮件

哇,谢谢。这些信息在任何地方都没有记录。我已经处理这个问题多年了,从来没有调查过“为什么”。非常有帮助,谢谢! - Barry
你是使用 secure.emailsrvr.com 地址还是 smtp.emailsrvr.com? - Zach Green
谢谢,使用端口587、启用SSL并使用主机secure.emailsrvr.com进行工作。 - Armando Ramirez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接