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