发出从GoDaddy上托管的ASP.NET MVC应用程序发送邮件消息的问题

时间:2010-12-14 21:18:20

标签: asp.net-mvc smtp

我在GoDaddy上托管的MVC Web应用程序上有一个表单,用户可以填写并发送到我们的办公室。我目前正在使用Gmail帐户和GoDaddy电子邮件帐户(链接到我的托管空间)对其进行测试。有了Gmail代码,电子邮件将从我的本地主机发送,但当我将其发布到网络时,我收到以下错误:

  

请求'System.Net.Mail.SmtpPermission类型的权限,   系统,版本= 2.0.0.0,文化=中立,   PublicKeyToken = b77a5c561934e089'失败。

以下是我正在使用的代码(从this post借来的),凭据已更改并删除了密码:

var fromAddress = new MailAddress("iihs.eval@gmail.com", "FEA Drone");
var toAddress = new MailAddress("improveithomeservices@gmail.com", "ImproveIt Home Services");
const string fromPassword = "<removed>";
var subject = string.Format("Energy Evaluation Request for {0} {1}", model.FirstName, model.LastName);
var body = MailBody(results);

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}    

然后我尝试使用我为此特定表单设置的GoDaddy电子邮件,并再次在本地发送。但是,当这个上传时,它只是超时而不是给我任何有用的信息。这是代码:

var fromAddress = new MailAddress("fea@goimproveit.com", "FEA Drone");
var toAddress = new MailAddress("improveithomeservices@gmail.com", "ImproveIt! Home Services");
const string fromPassword = "<removed>";
var client = new SmtpClient
{
    Host = "relay-hosting.secureserver.net",
    Port = 25,
    EnableSsl = false,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Timeout = 20000,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var msg = new MailMessage(fromAddress, toAddress)
{
    Subject = string.Format("Energy Evaluation Request for {0} {1}", model.FirstName, model.LastName),
    IsBodyHtml = false,
    Body = MailBody(results)
})
{
    client.Send(msg);
}

我的GoDaddy主机最初有smtpout.secureserver.net,但我从this article发现我需要将其更改为relay-hosting.secureserver.net。使用更新的主机信息,脚本会运行,但邮件不会进入目标电子邮件收件箱(或垃圾邮件箱)。

修改

使用Maxim的代码,似乎我已经有了一个“正常运行”的版本。电子邮件不会立即显示在目标收件箱中,但会在大约15分钟后显示。太糟糕了,GoDaddy在程序化电子邮件方面似乎是一个巨大的PITA。

这是我得到的:

var emailmessage = new System.Web.Mail.MailMessage()
{
    Subject = subject,
    Body = body,
    From = fromAddress.Address,
    To = toAddress.Address,
    BodyFormat = MailFormat.Text,
    Priority = System.Web.Mail.MailPriority.High
};

SmtpMail.SmtpServer = "relay-hosting.secureserver.net";
SmtpMail.Send(emailmessage);

再次感谢您的帮助,我希望我能弄清楚如何让GoDaddy更好地合作。如果可以的话,我会回复更新。

3 个答案:

答案 0 :(得分:7)

我在GoDaddy上托管了一些ASP.NET MVC应用程序,它们发送电子邮件。不幸的是,GoDaddy电子邮件政策有些不好:

首先,必须使用relay-hosting.secureserver.net - 您无法使用外部SMTP服务器,例如Gmail。

其次, relay-hosting通常非常慢。根据我的经验,一些电子邮件需要 90分钟才能发送出去,而其他电子邮件根本不会发送

我已经多次与GoDaddy支持人员就此问题进行过电子邮件通信,但他们尚未解决巨大的等待时间/问题或允许外部SMTP服务器。


至于您的邮件未送达的原因,您应该多次尝试运行该脚本以确保不会发生任何异常。如果它仍然不起作用,这是我的邮件代码:

var emailmessage = new System.Web.Mail.MailMessage()
                                   {
                                       Subject = "Subject",
                                       Body = "Body",
                                       From = "myFromAddress@domain.com",
                                       To = "myToAddress@someotherdomain.com",
                                       BodyFormat = MailFormat.Text,
                                       Priority = MailPriority.High
                                   };

SmtpMail.SmtpServer = "relay-hosting.secureserver.net";
SmtpMail.Send(emailmessage);

唯一不同的是(据我所知),您正在尝试向SMTP服务器提供凭据。实际上, relay-hosting.secureserver.net不需要任何凭据,但只有在检测到消息是从GoDaddy服务器发送时才会发送电子邮件。这可能会解决您的问题!

答案 1 :(得分:2)

不记得我在哪里找到了这段代码,但它在我的GoDaddy服务器上适用于通过谷歌帐户发送电子邮件:

public class GmailService : IEmailService
{
    private static int _port = 465;
    private readonly string _accountName;
    private readonly string _password;

    public GmailService(string accountName, string password)
    {
        _accountName = accountName;
        _password = password;
    }
    public void Send(string from, string to, string subject, string body, bool isHtml)
    {
        Send(from, to, subject, body, isHtml, null);
    }

    public void Send(string from, string to, string subject, string body, bool isHtml, string[] attachments)
    {
        System.Web.Mail.MailMessage mailMessage = new System.Web.Mail.MailMessage
                                                      {
                                                          From = from,
                                                          To = to,
                                                          Subject = subject,
                                                          Body = body,
                                                          BodyFormat = isHtml ? MailFormat.Html : MailFormat.Text
                                                      };


        // Add attachments
        if (attachments != null)
        {
            for (int i = 0; i < attachments.Length; i++)
            {
                mailMessage.Attachments.Add(new Attachment(attachments[i]));
            }
        }

        //  Authenticate
        mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1);
        // Username for gmail - email@domain.com for email for Google Apps
        mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", _accountName);
        // Password for gmail account
        mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", _password);
        // Google says to use 465 or 587.  I don't get an answer on 587 and 465 works - YMMV
        mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", _port.ToString());
        // STARTTLS 
        mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", true);

        // assign outgoing gmail server
        SmtpMail.SmtpServer = "smtp.gmail.com";
        SmtpMail.Send(mailMessage);
    }
}

更新:以下是我使用此代码的方式:

GmailService gmail = new GmailService("do_not_reply@bobcravens.com", "the_password");
const string from = "Email Service <do_not_reply@bobcravens.com>";
const string to = "my_email_address";
const string subject = "Contact Form";
string body = "your message";
gmail.Send(from, to, subject, body, false);

这可能会有所不同......我有一个Google Apps帐户(免费)。因此,我可以让from地址与我的服务器相同。

答案 2 :(得分:0)

工作正常,按照我的步骤

  1. 首先从Godaddy Webmail检查您的电子邮件计划

    一个。登录您的客户经理。

    湾单击工作区电子邮件。

    ℃。在您要使用的帐户旁边,点击管理。

    d。对于包含您要使用的电子邮件地址的帐户,请单击(显示地址)。

    即单击要使用的电子邮件地址,然后转到“高级”选项卡。它显示电子邮件计划。

    [1]:http://i.stack.imgur.com/AJAoB.png

    根据电子邮件计划,您可以选择主机名。示例:如果电子邮件计划AP(2)表示smtp.Host =“smtpout.asia.secureserver.net”或电子邮件计划EU(2)表示smtp.Host =“smtpout.europe.secureserver.net”或电子邮件计划美国表示smtp.Host =“smtpout.secureserver.net”。

  2. 确认您的网站使用的是SSL或没有SSL。因为您选择基于SSL的portNo 示例:if without SSL表示smtp.EnableSsl = false Out out PortNo为25,80,3535。 如果使用SSL意味着mtp.EnableSsl = true Out out PortNo是465。

    这些都是要记住在Godaddy邮件配置中工作的所有要点。

    下面提到代码,

    using (MailMessage mail = new MailMessage(from, mailmodel.To))
                        {
    
                            mail.Subject = mailmodel.Subject;
                            mail.IsBodyHtml = true;
                            mail.Body = mailmodel.Body;
                            mail.Priority = MailPriority.High;
                            SmtpClient smtp = new SmtpClient();
                            smtp.Host = host;
                            smtp.EnableSsl = false;
                            smtp.UseDefaultCredentials = false;
                            NetworkCredential networkCredential = new NetworkCredential(from, Password);
                            smtp.Credentials = networkCredential;
                            smtp.Port = portNo;
                            smtp.Timeout = 100000;                                smtp.Send(mail);}