我已经开发了一个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);
}
}
答案 0 :(得分:1)
您可以创建Windows服务或创建控制台应用程序,然后在Windows Scheduler中对其进行计划。我已经使用Windows服务实现了Send-mail服务。
答案 1 :(得分:1)
如果您确实希望将它作为Asp.Net WebApp上的后台作业,则应进行以下研究:
创建作业以发送电子邮件
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();
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();
}
}
在您的startup.cs类中。在configure方法中添加它。
services.AddHostedService<SendMailHostedService>();
如果不需要将其作为后台作业托管在WebApp上,则可以创建Windows服务,该服务每天在需要的时间运行。
看到这个问题:Windows service scheduling to run daily once a day at 6:00 AM
要使用C#发送电子邮件,您可以查看SmptClient
类https://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-第一个教程是关于发送电子邮件的