簡體   English   中英

ASP.NET Core 3 傳遞電子郵件列表以發送方法 Mailkit

[英]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 輸入一個字符串,然后拆分其字符......這是行不通的。 如果您想使用一個或多個電子郵件地址,您需要以分隔符或完整列表的形式發送電子郵件地址。

有兩種方法可以解決。

將參數從字符串更改為列表

  1. 更改您的方法以獲取列表
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.

發送分隔列表

  1. 始終以逗號分隔的電子郵件地址發送,並將它們添加到 mimeMessage 的 To 字段時將它們轉換為多個地址。
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM