我们在Windows Server 2008R2上的IIS 7.5中运行了两个版本的Web应用程序,运行条件几乎相同。两个版本都使用相同的电子邮件代码集将smtp消息中继到内部Exchange2010服务器。第一个应用程序完成请求,并毫不费力地发送电子邮件。但是,第二个使用自定义安全模型(应用程序之间唯一的主要区别)甚至根本不会发起smtp请求。有一些代码可以处理来自SMTPClient.send的异常,但都没有。两个版本都从使用visual studio应用服务器运行的开发机器发送邮件。
Wireshark显示应用程序1的凭据的完整请求和验证,但是从应用程序2中根本检测不到任何流量。运行IIS实例的虚拟机具有Exchange服务器接受的IP地址,并且位于同一域等。域的防火墙已关闭。
正在实施UseDefaultCredentials以验证smtp消息。每个应用程序都在一个单独的应用程序池中运行,但是使用相同的用户(NetworkService)并且在wwwroot等上具有相同的安全权限。
对于在IIS 7.5服务器上使用.Net Mail.SMTPClient时,为什么一个应用程序看起来什么都不做的任何见解都很受欢迎。
代码简而言之如下(忽略可能的方法签名不匹配,代码在不同的类中,默认的SMTP主机由Email.Host定义)
protected void taskHeaderGrid_OnItemCommand(object sender, GridCommandEventArgs e)
{
try {
Int32 recordsAcivated = workFlowController.activateWorkFlow((IDbConnection)myConn, null, System.Convert.ToInt32(taskHdrIdTxt));
}
catch (Exception) {
AddMessage(Message.eMessageType.Error, "Warning: email message to alert users that next task has been activated was not sent.");
}
}
public Int32 activateWorkFlow(IDbConnection currConnection, IDbTransaction currTran, Int32 workFlowId)
{
//Send out the mails......
if (!string.IsNullOrWhiteSpace(primaryPersonEmail))
{
emailController.sendMessage(primaryPersonEmail, "Task has been activated.", string.Format("Hdr:({0}) Detail:({1})", taskHeaderDTO.Description, jobFunctionDTO.JobDescription));
}
if (!string.IsNullOrWhiteSpace(secondaryPersonEmail))
{
emailController.sendMessage(secondaryPersonEmail, "Task has been activated.", string.Format("Hdr:({0}) Detail:({1})", taskHeaderDTO.Description, jobFunctionDTO.JobDescription));
}
}
public void sendMessage(string toEmailAddr, string txtmessage, string subject)
{
Email.Host = hostName;
Email.Send(subject, txtmessage, senderEmailAddr, toEmailAddr);
}
public static void Send(string subject, string body, string from, IEnumerable<string> to, string smtphost)
{
Send(CreateMessage(subject, body, from, to), smtphost);
}
public static void Send(System.Net.Mail.MailMessage msg, string smtphost)
{
using (System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(smtphost))
{
if (InterceptEmails == true)
{
ApplyFailSafe(msg);
}
client.UseDefaultCredentials = true;
client.Send(msg);
}
}
public static System.Net.Mail.MailMessage CreateMessage(string subject, string body, string from, IEnumerable<string> to, IEnumerable<string> cc, IEnumerable<string> bcc)
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.Subject = subject;
msg.Body = body;
msg.From = new System.Net.Mail.MailAddress(from);
msg.IsBodyHtml = true;
if (to != null)
{
foreach (string email in to)
msg.To.Add(email);
}
if (cc != null)
{
foreach (string email in cc)
msg.CC.Add(email);
}
if (bcc != null)
{
foreach (string email in bcc)
msg.Bcc.Add(email);
}
return msg;
}
答案 0 :(得分:0)
我为您创建了一个示例方法,它会尝试发送电子邮件。以下是有关实施的几个注意事项:
Settings
类 - 它包含我们所有的客户端/服务器数据。这有助于保持代码解耦以实现可重用性。
public static void SendNotificationEmail(设置设置) { //循环遍历我们的通用列表。 foreach(设置中的字符串电子邮件。) { //将我们的电子邮件参数分配给邮件。 MailMessage message = new MailMessage(setting.From,email,setting.Subject,setting.Body);
//Build Our Smtp Client
SmtpClient client = new SmtpClient();
client.Host = setting.SmtpServer;
client.Port = setting.Port;
client.Timeout = setting.Timeout;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(setting.Username, setting.Password);
}
}
为了真正帮助您,我们需要安全模型以及给您带来麻烦的精确代码。希望我的实现可能包含一个缺失的部分。这适用于运行最新版本的 Internet信息系统(IIS)的服务器。
此外, SMTP可能会在没有有效凭据的情况下以静默方式失败。
答案 1 :(得分:0)
问题已解决,生成SMTP电子邮件之前的更高级别配置和错误导致了此问题。