1

月の初めに実行されるタイマージョブを実行するコードを作成しました。このジョブは、ユーザーにサイトにアクセスするように電子メールで通知します。
executeメソッドのコードは次のとおりです。

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;
        }
    }


テストの目的で、このタイマージョブを1時間に5分ごとに実行しました。ここで、電子メールアドレスがa@abcとb@abcのグループに2人のユーザーがいるとします。「宛先」アドレスを指定してメールを送信したいのですが、メッセージの配信にa@abc; b@abc;使用しています。smtp4dev私が見たのは、タイマージョブが5分間に2回実行され、3つのメッセージが送信されたということです。1つ目はa、2つ目はaとb、3つ目はa、b、そしてaです。期間に関係なく1つのメッセージのみが送信され、「宛先」アドレスにa; bのみが送信されるようにするには、どうすれば実行できますか?

編集:コードを変更した後、タイマーサービスを再起動するのを忘れました。現在は機能していますが、タイマージョブは、1回だけではなく、スケジュールされた間隔内で複数回実行されます。そのための提案はありますか?これを台無しにしてすみません!

4

2 に答える 2

0

次のことを確認したときにコードが実行されました
。1)コードに変更を加えた後、タイマーサービスを再起動するのを忘れました。
2)link1とlink2を使用複数のグループに存在する重複ユーザーを除外しました。
3)複数のWebアプリケーションを持っていたため、1つのアプリケーションのコードが他のWebアプリケーションにも使用されていたため、電子メールが繰り返されていました。
この質問をして申し訳ありませんが、これがいつか誰かに役立つことを願っています。

于 2013-01-04T04:28:12.553 に答える
0

これは、mailMessage.To.Add(to);間違って使用しているためです。MailAddress( )の各インスタンスはMailMessage.To、単一のメールアドレスのみを保持できます。あなたがする必要があるのは、各メールアドレスを別々に追加することです(したがって、.Addメソッド)。

以前に使用したコードのコメントを解除する必要があります。//mailMessage.To.Add(user.Email);

メールを区切るためにコンマを使用しようとしている誰かが、あなたの問題を正確に把握していない次の投稿を参照してください。

于 2013-01-03T12:40:20.013 に答える