【问题标题】:.Net System.Mail.Message adding multiple "To" addresses.Net System.Mail.Message 添加多个“收件人”地址
【发布时间】:2010-03-08 20:42:17
【问题描述】:

编辑:这个问题是毫无意义的,除非作为一个红鲱鱼练习。这个问题原来是我的白痴(没有人收到电子邮件,因为没有指定主机并且在 web.config 中不正确)和用户告诉我他们有时收到电子邮件,有时没有,当实际上,他们从未收到过电子邮件。

因此,我没有采取适当的步骤在受控环境中重现问题,而是依靠用户信息和“它适用于我的机器”的心态。 很好地提醒我自己和其他任何有时是白痴的人。


我只是打了一些我认为不一致的东西,想看看我是不是做错了什么,如果我是个白痴,还是......

MailMessage msg = new MailMessage();
msg.To.Add("person1@domain.com");
msg.To.Add("person2@domain.com");
msg.To.Add("person3@domain.com");
msg.To.Add("person4@domain.com");

这封邮件真的只发给 1 个人,最后一个。

要添加倍数,我必须这样做:

msg.To.Add("person1@domain.com,person2@domain.com,person3@domain.com,person4@domain.com");

我不明白。我以为我正在将多个人添加到To 地址集合中,但我正在做的是替换它。

我想我刚刚意识到我的错误——要向集合中添加一项,请使用 .To.Add(new MailAddress("person@domain.com"))

如果您只使用string,它将替换其列表中的所有内容。 编辑:其他人已经测试并且没有看到这种行为。这要么是我特定版本的框架中的错误,要么更可能是我的白痴策略。

呃。我认为这是一个相当大的陷阱!既然我回答了我自己的问题,但我认为这在 stackoverflow 档案中很有价值,我仍然会问它。也许有人甚至知道您可能会陷入其他陷阱。

【问题讨论】:

  • 很高兴您决定留下您的自我回答问题。这是一个奇怪的现象。
  • 您的问题是它只发送到最后还是您的集合覆盖了值? FWIW,在 .Net 2.0 控制台应用程序中,其行为符合预期(To 集合中有 4 个地址)。
  • 如果您发布更多代码,我们可以帮助您...

标签: asp.net system.net.mail


【解决方案1】:

我无法复制您的错误:

var message = new MailMessage();

message.To.Add("user@example.com");
message.To.Add("user2@example.com");

message.From = new MailAddress("test@example.com");
message.Subject = "Test";
message.Body = "Test";

var client = new SmtpClient("localhost", 25);
client.Send(message);

转储收件人的内容:MailAddressCollection:

MailAddressCollection(2 项)
DisplayName 用户主机地址

用户 example.com user@example.com
user2 example.com user2@example.com

smtp4dev 捕获的结果电子邮件:

Received: from mycomputername (mycomputername [127.0.0.1])
     by localhost (Eric Daugherty's C# Email Server)
     3/8/2010 12:50:28 PM
MIME-Version: 1.0
From: test@example.com
To: user@example.com, user2@example.com
Date: 8 Mar 2010 12:50:28 -0800
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Test

您确定您的代码或 SMTP 服务器没有其他问题吗?

【讨论】:

  • 我和你在一起。我无法重现这个。
  • 嗯。现在邮件服务器因维护而停机,所以我不知道有哪一个可以测试。但是,我非常小心,我使用的代码非常简单。但是,你们花时间运行自己的测试和多人。我仍在查看我的代码,看看是否还有其他事情发生。否则,我将不得不告诉工程师检查服务器。
  • @Matt Dawdy:您可以下载链接的 smtp4dev 以验证 是否正确。
【解决方案2】:
private string FormatMultipleEmailAddresses(string emailAddresses)
    {
      var delimiters = new[] { ',', ';' };

      var addresses = emailAddresses.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

      return string.Join(",", addresses);
    }

现在你可以像这样使用它了

var mailMessage = new MailMessage();
mailMessage.To.Add(FormatMultipleEmailAddresses("test@gmail.com;john@rediff.com,prashant@mail.com"));

【讨论】:

  • 如果想让空格分隔电子邮件,请使用:var delimiters = new[] { ',', ';', ' ' };
  • To.Add 的分隔符是 , ?
【解决方案3】:

您可以使用多个 System.Net.Mail.MailAddress 对象来执行此操作,也可以提供一个包含所有用逗号分隔的地址的字符串

【讨论】:

    【解决方案4】:

    您可以尝试将电子邮件放入逗号分隔的字符串 ("person1@domain.com, person2@domain.com"):

    C#:

    ArrayList arEmails = new ArrayList();
    arEmails.Add("person1@domain.com");
    arEmails.Add("person2@domain.com");
               
    string strEmails = string.Join(", ", arEmails);
    

    如果您有兴趣,请使用 VB.NET:

    Dim arEmails As New ArrayList
    arEmails.Add("person1@domain.com")
    arEmails.Add("person2@domain.com")
    
    Dim strEmails As String = String.Join(", ", arEmails)
    

    【讨论】:

    • 我认为如果我走这条路线,它希望电子邮件用逗号分隔。但这限制了我,因为我不能输入“用户友好”的电子邮件名称。就像我们多年前使用“ bob@ibm.com”类型构造所做的那样。可能是我记错了,我现在忘记了……
    【解决方案5】:

    添加多个 System.MailAdress 对象以获得您想要的。

    【讨论】:

      【解决方案6】:

      输入地址此代码:

      objMessage.To.Add(***addresses:=***"email1@yahoo.com , email2@aol.com , email3@gmail.com")

      【讨论】:

        【解决方案7】:

        感谢您发现这一点,我正要添加字符串,与您的想法相同,它们将被添加到集合末尾。看来参数是:

        msg.to.Add() 将 MailAddress 添加到集合的末尾
        msg.to.Add() 将电子邮件列表添加到集合中

        根据参数类型略有不同的操作,我认为这是非常糟糕的形式,我更喜欢拆分方法 AddStringList 的东西。

        【讨论】:

          【解决方案8】:

          我喜欢 Praveen 的回答,但是,我必须对其进行一些调整才能使其正常工作。

             public class SendmailHelper
             {
                 ...
                 myMail.From = from;
                  string[] emails = FormatMultipleEmailAddresses(GlobalVariables.To_EMail);
                  int email_counter = 0;
                  while (email_counter < emails.Length)
                  {
                      myMail.To.Add(emails[email_counter]);
                      email_counter++;
                  }
                  ...
              {
          
              public static string[] FormatMultipleEmailAddresses(string emailAddresses)
              {
                  var delimiters = new[] { ',', ';' };
          
                  var addresses = emailAddresses.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
          
                  return addresses;
              }
          

          【讨论】:

            【解决方案9】:
            using System;
            using System.Collections.Generic;
            using System.IO;
            using System.Linq;
            using System.Net.Mail;
            using System.Web;
            
            namespace HMS.HtmlHelper
            {
                public class SendmailHelper
                {
                    //Created SendEMail method for sendiing mails to users 
                    public bool SendEMail(string FromName, string ToAddress, string Subject, string Message)
                    {
                        bool valid =false;
                        try
                        {
                            string smtpUserName = System.Configuration.ConfigurationManager.AppSettings["smtpusername"].ToString();
                            string smtpPassword = System.Configuration.ConfigurationManager.AppSettings["smtppassword"].ToString();
                            MailMessage mail = new MailMessage();``
                            mail.From = new MailAddress(smtpUserName, FromName);
                            mail.Subject = Subject;
                            mail.To.Add(FormatMultipleEmailAddresses(ToAddress));
                            //mail.To.Add(ToAddress);
                            mail.Body = Message.ToString();
                            mail.IsBodyHtml = true;
                            SmtpClient smtp = new SmtpClient();
                            smtp.Port = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["smtpserverport"]);
                            smtp.Host = System.Configuration.ConfigurationManager.AppSettings["SmtpServer"]; /
                            smtp.Credentials = new System.Net.NetworkCredential(smtpUserName, smtpPassword);
                            smtp.EnableSsl = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["ssl"]); ;
                            smtp.Send(mail);
                            valid = true;
            
                        }
                        catch (Exception ex)
                        {
                            valid =false ;
                        }
            
                        return valid;
                    }
            
            
            
                    public string FormatMultipleEmailAddresses(string emailAddresses)
                    {
                        var delimiters = new[] { ',', ';' };
            
                        var addresses = emailAddresses.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
            
                        return string.Join(",", addresses);
                    }
            
                }
            }``
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-12-13
              • 1970-01-01
              • 2012-04-23
              • 1970-01-01
              • 1970-01-01
              • 2018-05-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多