C# - 无法发送通过多个dll调用的电子邮件

时间:2014-09-03 14:13:56

标签: c# asp.net email dll smtpclient

我有3个dll:

  • 我的asp.net应用程序[aspnet]
  • steam api manager [Steam.dll]
  • 通知管理员[Notifications.dll]

我需要计算Steam api请求(它们每天限制为100K),并且在一天结束时,我想发送有关每天总请求的电子邮件。

    //My aspnet app global.asax
    protected void Application_Start(Object sender, EventArgs e)
    {
        Steam.RequestCounter.Run();        
    }

    //Steam.dll
    public static void Run()
    {
       // .. request count logic

        Notifications.SendEmail();
    }

    //Notifications.dll
    public static void SendEmail()
    {
       //..email sending logic
    }

如果调用堆栈如上所示,则不会发送电子邮件。为什么? 如果我直接从我的asp .net应用程序(global.asax)调用Notifications.SendEmail()方法,它就可以了。 你能告诉我发生了什么吗?

编辑

通话期间没有错误。 SmtpClient.Send()方法正常传递。即使我把它放进去试试,也不会发生异常。

这是我的Notifications.SendEmail方法:

    public static void SendEmail(string subject, string body, params string[] recipients)
    {
        const string sender = "xxxx@outlook.com";
        var client = new SmtpClient("smtp-mail.outlook.com")
        {
            Port = 587,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false
        };

        var credentials = new System.Net.NetworkCredential(sender, "xxxx");
        client.EnableSsl = true;
        client.Credentials = credentials;

        var mail = new MailMessage {From = new MailAddress(sender)};
        foreach (var recipient in recipients)
        {
            mail.To.Add(recipient);
        }
        mail.Subject = subject;
        mail.Body = body;
        client.Send(mail);
    }

这是发送电子邮件的情况(在global.asax中):

    protected void Application_Start(Object sender, EventArgs e)
    {
        //call directly to Notifications.dll
        Email.SendEmail(
            "subject",
            "body",
            "xxx@outlook.com"
        );        
    }

这是未发送电子邮件的情况:

    protected void Application_Start(Object sender, EventArgs e)
    {
        //call to Steam.dll
        Steam.RequestCounter.Run();        
    }

    //Inside Steam.dll
    public static void Run()
    {
        SendEmail();
    }

    private static void SendEmail()
    {
        //call to Notifications.dll
        Email.SendEmail(
            "subject",
            "body",
            "xxx@outlook.com"
        ); 
    }

所以问题不在于请求计数逻辑。我认为问题在于引用。也许主机环境(asp.net app)没有发送电子邮件所需的一切。如果没有发生错误,我不知道如何检查它。

1 个答案:

答案 0 :(得分:1)

当您启动应用程序时,global.asax中的函数将被调用一次。因此,如果没有发生回收或部署,它将在星期一运行,而不会再运行。您需要一些时间触发器,调度程序,服务或类似的东西