如何让计时器作业只运行一次?

时间:2013-01-03 11:26:27

标签: c# visual-studio-2010 sharepoint timer-jobs

我编写了一个代码来运行一个计时器作业,该作业在一个月初运行,通过电子邮件通知用户访问该站点。
这是执行方法的代码:

public override void Execute(Guid targetInstanceId)
    {
        SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://server"));
        string smtpServerName = string.Empty;
        string from = string.Empty;
        //setting the website from where the timer job will run
        SPWeb web = webApp.Sites[0].RootWeb;
        //retrieving from address from the central admin site
        from = web.Site.WebApplication.OutboundMailSenderAddress;
        //retreiving smtpservername from the central admin site
        smtpServerName = web.Site.WebApplication.OutboundMailServiceInstance.Server.Address;
        //retreiving the groups in the website
        SPGroupCollection collGroups = web.SiteGroups;
        //logic to send mail to all users in all groups
        MailMessage mailMessage = new MailMessage();
        mailMessage.From = new MailAddress(from);
        string to = string.Empty;
        foreach (SPGroup group in collGroups)
        {
            foreach (SPUser user in group.Users)
            {
                //bool flg1 = user.Email == null;
                if (user.Email != null)
                {
                    //mailMessage.To.Add(user.Email);                        
                    to = user.Email + ",";
                }
            }
        }
        mailMessage.Subject = "Acknowledgement Mail";
        mailMessage.To.Add(to);
        mailMessage.Body = "Sup yo";
        mailMessage.IsBodyHtml = false;
        SmtpClient client = new SmtpClient(smtpServerName);
        client.UseDefaultCredentials = true;
        client.Port = 25;
        client.EnableSsl = false;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        try
        {
            client.Send(mailMessage);
        }
        catch (SmtpException)
        {
            return;
        }
        catch (ArgumentNullException)
        {
            return;
        }
    }


现在只是为了测试目的,我每小时每5分钟运行一次这个计时器工作。现在,假设组中有2个用户的电子邮件地址是@ abc和b @ abc。我希望通过“收件人”地址a@abc; b@abc;发送电子邮件,我正在使用smtp4dev来传递邮件。我看到的是计时器作业在5分钟内运行了两次并且发送了3条消息,第一条发送到a,然后第二条发送到a和b,第三条发送到a,b再次发送a。如何只运行一次邮件只运行一次,无论持续时间如何,只有a; b在“收件人”地址?

编辑:我在代码中进行了更改后忘了重新启动计时器服务。它现在有效,但计时器作业在预定的时间间隔内运行多次而不是一次。有什么建议吗?对不起搞砸了!

2 个答案:

答案 0 :(得分:0)

这是因为您使用mailMessage.To.Add(to);错误。 MailAddressMailMessage.To)的每个实例只能包含一个邮件地址。您需要做的是分别添加每个邮件地址(因此.Add方法)。

您需要做的是取消注释以前使用的代码://mailMessage.To.Add(user.Email);

请参阅following post withe exactly your problem,有人试图使用逗号分隔邮件。

答案 1 :(得分:0)

当我确保我有以下内容时,我的代码就开始了:
1)我在更改代码后忘记重新启动计时器服务。
2)我使用link1link2来过滤掉多个组中存在的重复用户 3)由于我有一个以上的Web应用程序,1个应用程序的代码也用于其他Web应用程序,因此也是重复的电子邮件。
很抱歉提出这个问题,希望有一天能帮到某人。