月の初めに実行されるタイマージョブを実行するコードを作成しました。このジョブは、ユーザーにサイトにアクセスするように電子メールで通知します。
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回だけではなく、スケジュールされた間隔内で複数回実行されます。そのための提案はありますか?これを台無しにしてすみません!