【发布时间】:2020-02-10 04:37:18
【问题描述】:
我正在使用 MailKit 发送电子邮件以进行帐户确认和密码重置。这些操作按预期工作,但现在我正在尝试修改相同的代码以向所有注册用户发送电子邮件通知,但这是我遇到问题的地方。
我使用以下代码构建了一个 List 集合:
public List<string> UserList {
get {
var allUsers = userManager.Users;
return allUsers.Select(x => x.Email).ToList();
}
}
此集合成功返回我的 AspNetUsers 表中的所有电子邮件。
接下来我创建 3 个变量:
var toAddress = UserList;
var subject = "New Asset Added" + " " + model.Name;
var body = model.Name + model.AssetType + model.AssetURL;
在调试和单步执行代码时,我确实看到了Count = 2,然后是变量中的电子邮件列表。到目前为止,这看起来不错
在 3 个变量之后,我有这行代码将收集到的信息传递给 Send 方法:
_emailSender.Send(toAddress[0], subject, body);
同样,toAddress[0] 在单步执行代码时会显示 Count = 2,所以我假设我编写它的方式是有效的。
一旦我到达发送方法代码并再次检查 toAddress 变量,它现在被剥离 Count = 2 并成为列表中的第一个电子邮件地址,这很有意义,因为我通过索引传递了变量0。我真正需要的是传递所有电子邮件,而不仅仅是 1。
如果我删除括号或将括号留空,我会收到错误:
cannot convert from 'System.Collections.Generic.List<string>' to 'string'
所以现在我不得不添加一个索引。
我的 send 方法看起来相当简单,但我相信我的 foreach 循环也可能没有很好地制定。这是我的完整发送方法。
public async void Send(string toAddress, string subject, string body, bool sendAsync = true) {
var mimeMessage = new MimeMessage(); // MIME : Multipurpose Internet Mail Extension
mimeMessage.From.Add(new MailboxAddress(_fromAddressTitle, _fromAddress));
foreach (char toAddresses in toAddress) {
mimeMessage.To.Add(new MailboxAddress(toAddresses)); //I get error saying cannot convert char to string.
}
mimeMessage.Subject = subject;
var bodyBuilder = new MimeKit.BodyBuilder {
HtmlBody = body
};
mimeMessage.Body = bodyBuilder.ToMessageBody();
using (var client = new MailKit.Net.Smtp.SmtpClient()) {
client.Connect(_smtpServer, _smtpPort, _enableSsl);
client.Authenticate(_username, _password); // If using GMail this requires turning on LessSecureApps : https://myaccount.google.com/lesssecureapps
if (sendAsync) {
await client.SendAsync(mimeMessage);
}
else {
client.Send(mimeMessage);
}
client.Disconnect(true);
}
}
我的最终目标是在 mimeMessage.To.Add(new MailboxAddress(toAddresses)); 上使用 foreach 循环,这样如果有多个电子邮件地址,每个人都可以收到一封电子邮件,如果没有,它可以循环一次。
提前致谢!
【问题讨论】:
标签: c# asp.net asp.net-core