smtpclient没有启动smtp流量

时间:2014-05-01 22:22:25

标签: c# asp.net email iis smtpclient

我们在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;
}

2 个答案:

答案 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电子邮件之前的更高级别配置和错误导致了此问题。