我在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更好地合作。如果可以的话,我会回复更新。
答案 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)
工作正常,按照我的步骤
首先从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”。
确认您的网站使用的是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);}