C# 从asp.net mvc web app发送每日通知邮件

C# 从asp.net mvc web app发送每日通知邮件,c#,asp.net,model-view-controller,quartz.net,C#,Asp.net,Model View Controller,Quartz.net,我开发了一个C#web应用程序MVC,它通过API调用从另一个站点(Trello)获取一些信息,并允许用户执行一些操作,比如打印一个包含所有卡片详细信息的.xls文件。现在,我想实现一个功能,每天在后台的特定时间向我的Gmail帐户发送一封邮件,并将Excel作为附件。我想在一个外部项目中实现该功能,但在同一个解决方案中,但我不知道如何实现,我听说了quartz.net,但我不了解它是如何工作的,我不知道这是否是正确的解决方案。谁能帮帮我,给我一些建议吗 p、 我无法托管该应用程序 编辑-新问题

我开发了一个C#web应用程序MVC,它通过API调用从另一个站点(Trello)获取一些信息,并允许用户执行一些操作,比如打印一个包含所有卡片详细信息的.xls文件。现在,我想实现一个功能,每天在后台的特定时间向我的Gmail帐户发送一封邮件,并将Excel作为附件。我想在一个外部项目中实现该功能,但在同一个解决方案中,但我不知道如何实现,我听说了quartz.net,但我不了解它是如何工作的,我不知道这是否是正确的解决方案。谁能帮帮我,给我一些建议吗

p、 我无法托管该应用程序

编辑-新问题


当我尝试用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);
    }
}
使用类似这样的库,可以安排后台作业并使用持久存储对其进行备份

然后,您可以轻松安排重复作业,如:

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

-第一个教程是关于发送电子邮件的

您可以创建windows服务或创建控制台应用程序,并在windows计划程序中进行计划。我已使用windows服务实现了发送邮件服务。

如果您真的想将其作为Asp.Net Web App上的后台作业,您应该查看:


创建要发送电子邮件的作业

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();


我认为windows服务可以很好地处理类似的问题:如果您想在同一个应用程序的单独线程中运行服务,那么Hangfire也是正确的选择@你是说忍者代码。但最好将其托管在Windows服务或类似服务中,而不是web应用程序中。如果您已经编写了执行所需操作的代码,请将其放入控制台应用程序中,确保其在该平台上仍能正常工作,然后将其作为计划任务运行。Web应用程序不适合这种类型的需求。他们只是为了回应请求。看看计划任务或windows服务。你说的“我不能托管应用程序”是什么意思。你想让它成为你网络应用程序的后台工作还是在本地机器上使用windows服务?我从来没有在编程中处理过电子邮件,也从来没有使用过hangfire,你能帮我了解一下它是如何工作的吗?没有在线教程?@LimiDerjaj我从未使用过,我对编程没有太多经验,有一些教程或文档可以帮助我完成这项工作?要创建windows服务,您可以查看本文。您可以在数据库表中插入要发送的数据,然后创建windows服务循环发送要发送的数据。您好,我编写了发送电子邮件的代码,它可以正常工作(当我在“索引”视图中单击一个按钮时,我试图发送电子邮件,只是为了验证代码是否正确)现在我想用Quartz.net做一个日常后台工作,就像你推荐我的那样。我创建了一个新类SendEmailJob:IJob,但它告诉我它没有实现接口成员IJob。执行,我必须做什么?嗨,我刚刚尝试过它,它很有效,谢谢你。因为它帮助你将它标记为正确,或者向上投票?它也将帮助其他用户在将来遇到同样的问题。我在哪里可以将其标记为已更正?在答案的左侧。在“向下投票”按钮下方吼叫。它看起来像一个V
RecurringJob.AddOrUpdate(
    () => YourSendMailMethod("email@email.com"),
    Cron.Daily);
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();
    }
}
services.AddHostedService<SendMailHostedService>();
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);
    }
}