[英]ASP.NET Core 3 Passing List of Emails to Send Method Mailkit
我正在使用 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
所以我假设我编写它的方式是有效的。
一旦我到达 Send Method 代码并再次检查toAddress
变量,它现在被剥离了Count = 2
并成为列表中的第一个电子邮件地址,这很有意义,因为我传递了索引为 0 的变量。我是什么真正需要的是传递所有电子邮件,而不仅仅是 1。
如果我删除括号或将括号留空,则会出现错误:
cannot convert from 'System.Collections.Generic.List<string>' to 'string'
所以现在我被迫添加一个索引。
我的发送方法看起来相当简单,但我相信我的 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 循环mimeMessage.To.Add(new MailboxAddress(toAddresses));
这样每个人都可以在电子邮件地址超过 1 个的情况下收到一封电子邮件,否则可以循环一次。
提前致谢!
在您的方法Send()
,您正在为 toAddress 输入一个字符串,然后拆分其字符......这是行不通的。 如果您想使用一个或多个电子邮件地址,您需要以分隔符或完整列表的形式发送电子邮件地址。
有两种方法可以解决。
将参数从字符串更改为列表
public async void Send(List<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));
toAddress.ForEach(address => mimeMessage.To.Add(new MailboxAddress(address)));
...
如果您使用此方法,您还需要发送列表......而不是单个电子邮件地址字符串。
List<string> toAddress = new List<string>() { "firstEmail", "Second" ...};
_emailSender.Send(toAddress, subject, body);
// You will not be able to do send in single string
_emailSender.Send("firstemail@only.com", subject, body); //Exception no method found.
发送分隔列表
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));
// HERE -> FOREACH string, not char.
foreach (string toAddresses in toAddress.Split(',')) // Split on ,
{
mimeMessage.To.Add(new MailboxAddress(toAddresses));
}
并且您需要按以下方式使用此方法...
List<string> toAddress = new List<string>() {"first", "..."};
_emailSender.Send(string.Join(',',toAddress), subject, body);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.