【问题标题】:ASP.NET Core 3 Passing List of Emails to Send Method MailkitASP.NET Core 3 传递电子邮件列表以发送方法 Mailkit
【发布时间】: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


    【解决方案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 的“收件人”字段时将其转换为多个地址。
    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);
    
    

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2019-02-12
      • 2020-01-17
      • 2019-11-23
      • 2023-03-18
      相关资源
      最近更新 更多