C# 在ASP MVC 5中,当注册过期时发送电子邮件

C# 在ASP MVC 5中,当注册过期时发送电子邮件,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,当注册到期时,系统会自动向用户发送电子邮件,我该如何处理 我曾想过在WindowsForms中创建一个应用程序来监控这一点,但我想知道是否还有其他方法 谢谢 假设注册信息存储在数据库中-创建一个控制台应用程序,用于检查数据库并向过期用户发送电子邮件,然后使用Windows任务调度器安排应用程序每天在特定时间运行。这很简单: using System; using System.Collections.Generic; using System.Linq; using System.Text; u

当注册到期时,系统会自动向用户发送电子邮件,我该如何处理

我曾想过在WindowsForms中创建一个应用程序来监控这一点,但我想知道是否还有其他方法


谢谢

假设注册信息存储在数据库中-创建一个控制台应用程序,用于检查数据库并向过期用户发送电子邮件,然后使用Windows任务调度器安排应用程序每天在特定时间运行。这很简单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Net;
namespace SO_Question_2
{
class Program
{
    static void Main(string[] args)
    {
        sendEmails();
    }

    private static void sendEmails()
    {
        List<string> emails = new List<string>();
        using (SqlConnection conn = new SqlConnection(@"Your Connection String"))
        {
            conn.Open();
            using (SqlCommand com = conn.CreateCommand())
            {
                com.CommandText = "select user_Email from users where exireDate > @today";
                com.Parameters.AddWithValue("@today", DateTime.Now.Date);
                SqlDataReader read = com.ExecuteReader();
                while (read.Read())
                {
                    emails.Add(Convert.ToString(read[0]));
                }
            }
            conn.Close();
            string smtpAddress = "smtp.mail.yahoo.com";
            int portNumber = 587;
            bool enableSSL = true;

            string emailFrom = "yourAddress@yahoo.com";
            string password = "xxxxxx!";

            string subject = "Hello";
            string body = "Buy a new license!";

            using (MailMessage mail = new MailMessage())
            {
                mail.From = new MailAddress(emailFrom);
                foreach (string recipient in emails)
                {
                    mail.To.Add(recipient);
                }
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                // Can set to false, if you are sending pure text.


                using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
                {
                    smtp.Credentials = new NetworkCredential(emailFrom, password);
                    smtp.EnableSsl = enableSSL;
                    smtp.Send(mail);
                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Data.SqlClient;
使用System.Net.Mail;
Net系统;
名称空间SO_问题2
{
班级计划
{
静态void Main(字符串[]参数)
{
发送电子邮件();
}
私有静态void sendmails()
{
列表电子邮件=新列表();
使用(SqlConnection conn=newsqlconnection(@“您的连接字符串”))
{
conn.Open();
使用(SqlCommand com=conn.CreateCommand())
{
com.CommandText=“选择用户\从现有用户发送的电子邮件>@today”;
com.Parameters.AddWithValue(“@today”,DateTime.Now.Date);
SqlDataReader read=com.ExecuteReader();
while(read.read())
{
emails.Add(Convert.ToString(读取[0]);
}
}
康涅狄格州关闭();
字符串smtpAddress=“smtp.mail.yahoo.com”;
int端口号=587;
bool enablesl=true;
字符串emailFrom=”yourAddress@yahoo.com";
字符串密码=“xxxxxx!”;
string subject=“Hello”;
string body=“购买新许可证!”;
使用(MailMessage mail=newmailmessage())
{
mail.From=新邮件地址(emailFrom);
foreach(电子邮件中的字符串收件人)
{
mail.To.Add(收件人);
}
mail.Subject=主题;
mail.Body=Body;
mail.IsBodyHtml=true;
//如果发送纯文本,则可以设置为false。
使用(SmtpClient smtp=新SmtpClient(smtpAddress,端口号))
{
smtp.Credentials=新的网络凭据(emailFrom,密码);
smtp.EnableSsl=启用SSL;
smtp.发送(邮件);
}
}
}
}
}

}

参考其他答案可能是不好的,但我认为香农的答案提供了一个合理的解决方案。正如他所提到的,您可以让Windows任务调度器每天运行一次控制台应用程序(或者您想要的任何计划;不过,每天运行一次似乎是合理的),而无需显示控制台窗口

如果您不想使用该解决方案,那么,您可能需要考虑。诚然,我自己并没有仔细研究过这个选项,但显然也可以使用SQL Server代理,这显然是您需求的一部分


我想你也可以使用Windows服务(有时人们会使用计时器让服务定期工作),但我从来没有想过这个解决方案——你有一个额外的进程,即使它不工作(我怀疑你描述的进程每天只需运行一次),另外,Windows服务可能是一个彻头彻尾的调试难题。不过,从好的方面来看,完全按照您希望的方式格式化电子邮件非常容易,Windows服务不需要任何用户交互。

在数据库中记录注册日期,并在业务逻辑中输入一个IF条件,以检查某个时间是否已过。好的,还有其他方法吗?如果没有控制台应用程序,您可以使用SQL中的触发器创建列表,但仍需要一些代码来发送电子邮件。您可以作为服务或控制台应用程序运行,但如果您使用控制台应用程序,您将看不到该窗口,它将从任务调度器在后台执行。你对console应用程序有什么犹豫?在WinForm环境中运行此代码没有任何理由-不需要用户交互,除非你想手动选择哪些人收到发送的电子邮件。你可以手动添加任务,或者看看这篇以编程方式完成的文章:@fabricioolivera我同意Shannon的观点-使用Windows任务调度器似乎是明智的。如果你不同意,你可能想考虑一个SQL Server作业:我想你可以使用一个Windows服务(有时人们会使用一个定时器使服务周期性地工作),但是我从来没有关心过这个解决方案——即使没有工作,你也有一个额外的过程。(我怀疑您描述的流程每天只需运行一次),加上Windows服务可能是一个彻头彻尾的调试难题。您肯定可以让MS SQL server发送电子邮件。设置后,它只需“EXEC msdb.dbo.sp_send_dbmail”就可以了,只需知道几个参数——我还没有亲自尝试过(因此我的回答中有免责声明)但从我读到的信息来看,这似乎是解决此类问题的合理方法。