我编写了一个代码来运行一个计时器作业,该作业在一个月初运行,通过电子邮件通知用户访问该站点。
这是执行方法的代码:
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在“收件人”地址?
编辑:我在代码中进行了更改后忘了重新启动计时器服务。它现在有效,但计时器作业在预定的时间间隔内运行多次而不是一次。有什么建议吗?对不起搞砸了!
答案 0 :(得分:0)
这是因为您使用mailMessage.To.Add(to);
错误。 MailAddress
(MailMessage.To
)的每个实例只能包含一个邮件地址。您需要做的是分别添加每个邮件地址(因此.Add
方法)。
您需要做的是取消注释以前使用的代码://mailMessage.To.Add(user.Email);
请参阅following post withe exactly your problem,有人试图使用逗号分隔邮件。
答案 1 :(得分:0)