Email 从列表创建函数

Email 从列表创建函数,email,Email,这是一个虚构的消息发送程序,我是为了练习而做的。MessageSender`是一个向客户发送电子邮件的程序。目前它发送两种类型的电子邮件:欢迎和请回来电子邮件。它应该每天运行并每天编写一个调试日志,不管它是否工作 我如何在SendWelcomeMail中创建一个代码函数并调用它,我尝试自己创建一个函数,但我不确定如何调用该函数并将收件人函数与数据层中的客户电子邮件连接起来 namespace EmailSender { internal class Program {

这是一个虚构的消息发送程序,我是为了练习而做的。MessageSender`是一个向客户发送电子邮件的程序。目前它发送两种类型的电子邮件:欢迎和请回来电子邮件。它应该每天运行并每天编写一个调试日志,不管它是否工作

我如何在SendWelcomeMail中创建一个代码函数并调用它,我尝试自己创建一个函数,但我不确定如何调用该函数并将收件人函数与数据层中的客户电子邮件连接起来

namespace EmailSender
{
    internal class Program
    {

        private static void Main(string[] args)
        {
            //Call the method that do the work for me, I.E. sending the mails
            Console.WriteLine("Send Welcomemail");
            bool welcomeEmailSucess = SendWelcomeMail();
#if DEBUG
            //Debug mode, always send Comeback mail
            Console.WriteLine("Send Comebackmail");
            bool comeBackEmailSuccess = SendComeBackEmail("ComebackToUs");
#else
            //Every Sunday run Comeback mail
            if (DateTime.Now.DayOfWeek.Equals(DayOfWeek.Monday))
            {
                Console.WriteLine("Send Comebackmail");
                comeBackEmailSuccess = SendComeBackEmail("ComebackToUs");
            }
#endif

            //Check if the sending went OK
            if (comeBackEmailSuccess == true)
            {
                Console.WriteLine("All mails are sent, I hope...");
            }
            //Check if the sending was not going well...
            if (comeBackEmailSuccess == false)
            {
                Console.WriteLine("Oops, something went wrong when sending mail (I think...)");
            }
            Console.ReadKey();
        }

        public static bool SendWelcomeMail()
        {
            try
            {
                //List all customers
                List<Customer> customers = DataLayer.ListCustomers();

                //loop through list of new customers
                foreach (Customer c in customers)
                {
                    //If the customer is newly registered, one day back in time
                    if (c.CreatedDateTime >= DateTime.Now.AddDays(-1))
                    {
                        System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
                        //Add subject
                        m.Subject = "Welcome as a new customer at Company!";
                        //Send mail from info@company.com
                        m.From = new System.Net.Mail.MailAddress("info@company.com");
                        //Add body to mail
                        m.Body = "Hi " + c.Email +
                                 "<br>We would like to welcome you as customer on our site!<br><br>Best Regards,<br>Company Team";
#if DEBUG
                        //Don't send mails in debug mode, just write the emails in console
                        Console.WriteLine("Send mail to:" + c.Email);
#else
    //Create a SmtpClient to our smtphost: yoursmtphost
                    System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("yoursmtphost");
                    //Send mail
                    smtp.Send(m);
#endif
                    }
                }
                //All mails are sent! Success!
                return true;
            }
            catch (Exception)
            {
                //Something went wrong :(
                return false;
            }
        }
数据层

public class Customer
{
    public string Email { get; set; }
    public DateTime CreatedDateTime { get; set; }
}

public class Order
{
    public string CustomerEmail { get; set; }
    public DateTime OrderDatetime { get; set; }
}

class DataLayer
{
    public static List<Customer> ListCustomers()
    {
        return new List<Customer>()
                       {
                           new Customer(){Email = "mail1@mail.com", CreatedDateTime = DateTime.Now.AddHours(-7)}, 
                           new Customer(){Email = "mail2@mail.com", CreatedDateTime = DateTime.Now.AddDays(-1)}, 
                           new Customer(){Email = "mail3@mail.com", CreatedDateTime = DateTime.Now.AddMonths(-6)}, 
                           new Customer(){Email = "mail4@mail.com", CreatedDateTime = DateTime.Now.AddMonths(-1)}, 
                           new Customer(){Email = "mail5@mail.com", CreatedDateTime = DateTime.Now.AddMonths(-2)},
                           new Customer(){Email = "mail6@mail.com", CreatedDateTime = DateTime.Now.AddDays(-5)}
                       };
        }
        public static List<Order> ListOrders()
        {
            return new List<Order>()
                       {
                           new Order(){CustomerEmail = "mail3@mail.com", OrderDatetime = DateTime.Now.AddMonths(-6)}, 
                           new Order(){CustomerEmail = "mail5@mail.com", OrderDatetime = DateTime.Now.AddMonths(-2)},  
                           new Order(){CustomerEmail = "mail6@mail.com", OrderDatetime = DateTime.Now.AddDays(-2)}
                       };
        }
    }
}

现在,您没有在SendEmail函数中使用收件人列表-您忽略了它,并在数据层返回的所有客户之间循环,所以请更改它

如果您想继续做您正在做的事情,即,在每个客户中循环,如果该客户应该收到电子邮件,则直接发送电子邮件,然后将方法更改为以下方式:

public static void SendEmail(string toAddress, string from, string subject, 
string body)
    {
        //Create a new MailMessage
        System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();

        //Add customer to reciever list
        mail.To.Add(toAddress);

        //Add subject
        mail.Subject = subject;

        //Send mail from company@info.com
        mail.From = new System.Net.Mail.MailAddress(from);

        //Add body to mail
        mail.Body = body;

       // Send it or write to console depending on debug
    }
并调用该函数,而不是在SendWelcomeMail和SendComeBackEmail两个函数中创建电子邮件。 所以不是

//loop through list of new customers
foreach (Customer c in customers)
{
   if (c.CreatedDateTime >= DateTime.Now.AddDays(-1))
   {
        System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
        //Add subject
        m.Subject = "Welcome as a new customer at Company!";
        //Send mail from info@company.com
        m.From = new System.Net.Mail.MailAddress("info@company.com");
        //Add body to mail
        m.Body = "Hi " + c.Email +
        "<br>We would like to welcome you as customer on our site!<br><br>Best Regards,<br>Company Team";
   #if DEBUG
         //Don't send mails in debug mode, just write the emails in console
         Console.WriteLine("Send mail to:" + c.Email);
      ...
使用类似

string welcomeSubject = "Welcome as a new customer at Company!";
string ourEmailAddress = "info@company.com";
string bodyTemplate = "Hi {0}<br>We would like to welcome you as customer on our site!<br><br>Best Regards,<br>Company Team";

   //loop through list of new customers
   foreach (Customer c in customers)
   {
       if (c.CreatedDateTime >= DateTime.Now.AddDays(-1))
       {
           SendEmail(c.Email, ourEmailAddress, welcomeSubject, string.Format(bodyTemplate, c.Email));
和SendComebackEmail中的类似内容

这是使用函数的最简单的方法,我现在可以想到,在不改变代码结构的情况下。 如果你想有一个像你发布的版本那样的收件人列表,你必须做很多改变,因为你的邮件正文中有客户电子邮件,所以你不能只有多个收件人和一个正文


希望这有帮助。

您的问题是什么?如何让它工作并不是一个真正具体的问题。执行代码时会得到什么结果?例外?有没有意外的结果?主要问题是以后调用此函数,我不确定调用此函数时如何将收件人连接到datalayer类中的客户电子邮件。这就是错误所在。那么基本上,我应该如何插入这个函数呢@HimBromBeereSo您的问题是如何结合这两种方法并减少代码重复,然后如何调用该方法?我想这太宽了。从那开始,只在问题中张贴相关代码。您的代码目前很难理解。此外,你还应该对它进行适当的格式化,使其更易于阅读。好的,我已经编辑掉了不太相关的部分。但是从一开始,我怎么调用这个函数呢@HimBromBeereHi@kkirk,我喜欢你的解决方案。是否可以发送该电子邮件并将其存储在其他地方,如果稍后在同一天再次运行该电子邮件以检查是否尚未发送电子邮件。您好@J.Dhaik,很高兴它对您有用!这将是一个明显的改进:将电子邮件存储在某个地方,并单独考虑发送电子邮件。如果你只是为了学习,你可以把它存储在内存的列表中,然后在定时器上处理。在生产环境中,您当然应该将其存储在数据库或类似数据库中。太好了,我将尝试这样做。但是,这是一个明显的改进:将电子邮件存储在某个地方,并单独考虑发送电子邮件,这意味着什么呢。?还有,我如何创建这个列表,我的想法是创建一个电子邮件存储类,创建一个单独的电子邮件存储列表,在其中我以对象的形式发送电子邮件的所有信息?然后,我将它们连接到电子邮件类,并添加bool/if语句以检查电子邮件是否尚未发送?这将是对关注点分离的改进,例如,创建电子邮件与发送电子邮件是一个独立的关注点。你所写的基本上是正确的:通常你会将电子邮件对象存储在数据库中,并有一个日期时间来记录电子邮件的发送时间,也可能有一个日期时间记录电子邮件的创建时间。然后,您可以检查所有尚未发送的电子邮件,并确保所有电子邮件最终都会发送。您知道如何发送吗?我已经实现了所有的更改,对它感到非常满意,现在开始创建电子邮件存储类。但我不知道如何开始。