[英]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.