从ASP.NET MVC Web应用发送每日通知邮件

时间:2019-12-16 13:52:15

标签: c# asp.net model-view-controller quartz.net

我已经开发了一个C#网络应用MVC,该API通过API调用从另一个站点(Trello)获取一些信息,并允许用户执行一些操作,例如打印带有所有卡详细信息的.xls文件。现在,我想实现一项功能,该功能每天在后台的特定时间每天发送一封邮件到带有该Excel附件的我的Gmail帐户。我想在一个外部项目中实现该功能,但是要在相同的解决方案中实现,但是我不知道该怎么做,我听说了quartz.net,但是我不知道它是如何工作的,我也不知道那是不是正确的解决方案。谁能帮助我,并给我一些提示?

p.s。我无法托管该应用

编辑-新问题


当我尝试使用Quartz.Net实现我的后台作业时,出现了我的类SendMailJob没有实现接口成员IJob.Execute的错误。

我该怎么办?

这是我的工作班级:

public class SendMailJob : IJob
{
    public void SendEmail(IJobExecutionContext context)
    {
        MailMessage Msg = new MailMessage();

        Msg.From = new MailAddress("mymail@mail.com", "Me");

        Msg.To.Add(new MailAddress("receivermail@mail.com", "ABC"));

        Msg.Subject = "Inviare Mail con C#";

        Msg.Body = "Mail Sended successfuly";
        Msg.IsBodyHtml = true;

        SmtpClient Smtp = new SmtpClient("smtp.live.com", 25);

        Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

        Smtp.UseDefaultCredentials = false;
        NetworkCredential Credential = new
        NetworkCredential("mymail@mail.com", "password");
        Smtp.Credentials = Credential;

        Smtp.EnableSsl = true;

        Smtp.Send(Msg);
    }
}

3 个答案:

答案 0 :(得分:1)

您可以创建Windows服务或创建控制台应用程序,然后在Windows Scheduler中对其进行计划。我已经使用Windows服务实现了Send-mail服务。

答案 1 :(得分:1)

如果您确实希望将它作为Asp.Net WebApp上的后台作业,则应进行以下研究:


Quartz.Net

创建作业以发送电子邮件

public class SendMailJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        ...Do your stuff;
    }
}

然后将您的作业配置为每天执行

// define the job and tie it to our SendMailJob class
IJobDetail job = JobBuilder.Create<SendMailJob>()
    .WithIdentity("job1", "group1")
    .Build();

// Trigger the job to run now, and then repeat every 24 hours
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInHours(24)
        .RepeatForever())
    .Build();

HangFire

RecurringJob.AddOrUpdate(
    () => YourSendMailMethod("email@email.com"),
    Cron.Daily);

IHostedService

public class SendMailHostedService : IHostedService, IDisposable
{
    private readonly ILogger<SendMailHostedService> _logger;
    private Timer _timer;

    public SendMailHostedService(ILogger<SendMailHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Hosted Service running.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        //...Your stuff here

        _logger.LogInformation(
            "Timed Hosted Service is working. Count: {Count}", executionCount);
    }

    public Task StopAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

在您的startup.cs类中。在configure方法中添加它。

services.AddHostedService<SendMailHostedService>();

如果不需要将其作为后台作业托管在WebApp上,则可以创建Windows服务,该服务每天在需要的时间运行。

看到这个问题:Windows service scheduling to run daily once a day at 6:00 AM


要使用C#发送电子邮件,您可以查看SmptClienthttps://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.send?view=netframework-4.8

或使用可以为您完成的服务,例如SendGrid。

编辑:


关于第二个问题:

实现接口时,您的类应在该接口上定义所有方法。

此方法必须是公共的,返回相同的类型,具有相同的名称,并接收在您实现的接口上声明的相同参数。

在您的特定情况下,您只是错过了方法名称。只需对其进行更改即可,如下所示。

编辑:使用Quartz.net 3时,IJbo接口返回一个Task而不是void。因此,我更改了类SendMailJob以返回您现有方法的任务。

public class SendMailJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Factory.StartNew(() => SendEmail());
    }

    public void SendMail()
    {
        MailMessage Msg = new MailMessage();

        Msg.From = new MailAddress("mymail@mail.com", "Me");

        Msg.To.Add(new MailAddress("receivermail@mail.com", "ABC"));

        Msg.Subject = "Inviare Mail con C#";

        Msg.Body = "Mail Sended successfuly";
        Msg.IsBodyHtml = true;

        SmtpClient Smtp = new SmtpClient("smtp.live.com", 25);

        Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

        Smtp.UseDefaultCredentials = false;
        NetworkCredential Credential = new
        NetworkCredential("mymail@mail.com", "password");
        Smtp.Credentials = Credential;

        Smtp.EnableSsl = true;

        Smtp.Send(Msg);
    }
}

答案 2 :(得分:0)

使用Hangfire之类的库,该库可让您安排后台作业并使用持久性存储对其进行备份。

然后,您可以轻松地安排周期性工作,例如:

RecurringJob.AddOrUpdate(
    () => SendEmail("user@domain"),
    Cron.Daily);

https://docs.hangfire.io/en/latest/tutorials/index.html-第一个教程是关于发送电子邮件的