空的MailMessage构造函数何时起作用?

时间:2013-04-19 15:25:50

标签: c# asp.net web-config system.net.mail

我们有一个Asp.Net解决方案,使用System.Net.Mail.MailMessage和空构造函数已经生产了2年以上:

using (MailMessage _mailMessage = new MailMessage()) // Exception thrown here
{
  _mailMessage.From = new MailAddress(sFrom); // Setting additional properties - never gets here
  _mailMessage.Body = sBody;
  _mailMessage.Subject = sSubject;
  _mailMessage.IsBodyHtml = true;

昨天我们有一个实时网站报告异常:指定的字符串不在电子邮件地址的必填表单中。我们通过将所需节点添加到web.config文件来修复它。

问题是:为什么这个有用?或者它曾经有效吗?

错误: 指定的字符串不是电子邮件地址所需的格式。    at System.Net.Mail.MailAddressParser.ReadCfwsAndThrowIfIncomplete(String data,Int32 index)    在System.Net.Mail.MailAddressParser.ParseDomain(字符串数据,Int32&索引)    at System.Net.Mail.MailAddressParser.ParseAddress(String data,Boolean expectMultipleAddresses,Int32& index)    at System.Net.Mail.MailAddressParser.ParseAddress(String data)    at System.Net.Mail.MailAddress..ctor(String address,String displayName,Encoding displayNameEncoding)    在System.Net.Mail.MailMessage..ctor()

由于

编辑

  • 我们上个月从.net 3.5更新到4.0!
  • 添加了堆栈跟踪
  • 7个月后,错误仅发生在某些服务器上。为什么?

2 个答案:

答案 0 :(得分:3)

答案有点晚了。但我遇到了同样的问题。如果您使用Web.Config中的smtp设置,则需要在Web.Config中设置from。查看此MSDN Link了解详情

<mailSettings>
      <smtp from="xxxxx@gmail.com">// This is important when constructing new mail message. Make sure from is an email address.
        <network host="smtp.gmail.com" password="yourpassword" userName="xxxxx@gmail.com" port="587" />
      </smtp>
</mailSettings>

如果你没有使用来自Web.Config的SMTPCLIENT,那么从Web.Config中完全删除from属性,并用这样的代码构建你自己的smtpclient

var fromAddress = new MailAddress("xxxxxx@gmail.com", "Mr XXXXX");
            string fromPassword = "yourpassword";
            message.From = fromAddress;
            SmtpClient client = new SmtpClient()
            {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = false,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
                Timeout = 20000
            };

答案 1 :(得分:1)

您的代码是否在此using语句后设置了一些属性?

默认构造函数已经并且仍然可以工作,只要您在实际触发发送之前在代码中稍后设置了必需的属性。 web.config节点通常只为这些属性提供默认值。

我会调查它,看看是否有些属性没有正确设置,为什么。