【问题标题】:Wrong email titles when sending mails multiple times多次发送邮件时错误的电子邮件标题
【发布时间】:2019-10-19 18:10:53
【问题描述】:

首先,如果这是一个重复的问题,我深表歉意。找了好久,没找到相关问题。

所以问题来了:我正在使用 SmtpClient 和 MailMessage 类来发送邮件。我将邮件的主题作为邮件发送方法中的参数传递。第一次使用正确的主题(我作为参数发送的主题)发送邮件。但是,在接下来的所有电子邮件中,无论我输入什么主题,主题都保持不变(第一次使用的那个)。主题是从方法内部设置的。

(注意:这是一个 WindowsForm 应用程序)

我尝试的是,创建另一个名为“Refresh()”的方法,该方法处理邮件对象并再次创建它(仅使用 from 和 to 信息)。并在每次发送邮件后调用此方法。但这对解决这个问题没有帮助。

代码如下:

字段:

MailMessage message;
SmtpClient mailer;
string from = "sender email";
string pass = "sender pass";
string to = "rec email";

构造函数:

try
{
    message = new MailMessage(from, to);

    mailer = new SmtpClient("smtp.gmail.com", 587);
    mailer.Credentials = new NetworkCredential(from, pass);
    mailer.EnableSsl = true;
}
catch(Exception ex) { /*code to write log*/ } 

刷新方法:

void RefreshMessage()
        {
            try
            {
                message.Subject = "";
                message.Dispose();
                message = new MailMessage(from, to);
            }
            catch(Exception ex) { /*write log*/ }
        }

发送邮件的方法:

internal void TextOnly(string sub, string bodyMessage)
        {
            try
            {
                message.Subject = sub;
                message.Body = bodyMessage;

                mailer.Send(message);

                this.RefreshMessage();
            }
            catch (Exception ex) { /*write log*/ }
        }

如何调用的示例:

m.TextOnly("Subject 1" , SomeStringMethod());
m.TextOnly("Another Title " + anyString, "Some string mail");
m.TextOnly("[TAG] Email subject goes here" , AnotherStringMethod());

现在无论在参数中发送什么主题,它都将始终与主题“主题 1”一起发送(来自上面的示例)。正文没问题,只是主题不对。

我在类中几乎没有其他方法(例如用于其他目的,例如发送带有附件的邮件),其中主题不作为参数传递,而是直接从方法内设置(如方法内的message.Subject = "Example Sub") ,在这种情况下它工作正常。

但是在上面的例子中,主题被传递给方法,主题保持不变。

【问题讨论】:

  • 刷新方法的想法是什么,你是在重复使用相同的MailMessage还是什么,你为什么要缓存这个?你也经历过这个。
  • 每次需要发送电子邮件时,您没有创建新的 MailMessage() 是否有任何特殊原因?此外,正如@TheGeneral 所述,调试可以为您提供有关该行为的更多信息。
  • 感谢您的回复。是的,我正在重用相同的 MailMessage,我不会每次都创建新的 MailMessage 来节省内存,因为程序会非常频繁地发送邮件,并且在我的情况下,内存消耗和使用率必须保持在较低水平。我做错了吗?每次创建新的 MailMessage 是否更有效? PS:我对 C# 和 WinFormApp 还很陌生。

标签: c# smtpclient


【解决方案1】:

就像评论部分已经说明的那样,没有理由缓存消息本身。目前,您正在处理消息(实际上将其置于不可用状态),然后重新创建它。查看更多HERE。您也可以简单地创建新对象并在完成后处理它们,以便垃圾收集器可以尽快释放资源。

只要用简单的方法构造MailMessages,直接发送即可。

internal MailMessage ConstructTextMailMessage(MailAddress from, MailAddress to, string subject, string body)
{
    return ConstructTextMailMessage(from.Address, to.Address, subject, body);
}

internal MailMessage ConstructTextMailMessage(string from, string to, string subject, string body)
{
    return new MailMessage(from, to, subject, body);
}

然后:

var mailClient = new SmtpClient("smtp.gmail.com", 587);

mailClient.Credentials = new NetworkCredential(from, pass);
mailClient.EnableSsl = true;

mailClient.Send(ConstructTextMailMessage(from, to, "Subject 1", SomeStringMethod()));
mailClient.Send(ConstructTextMailMessage(from, to, "Another Title " + anyString, "Some string mail");
mailClient.Send(ConstructTextMailMessage(from, to, "[TAG] Email subject goes here", AnotherStringMethod());

如果您在MailMessage 中有附件,您应该在使用它们清理流后调用Dispose。另外,使用完毕后,请在SmtpClient 上致电Dispose

【讨论】:

    【解决方案2】:

    我在我的一个程序中使用了相同的功能(SntpClient、MailMessage 等)并且效果很好:

    SmtpClient client = new SmtpClient("host", port);
    MailMessage mail;
    MailAddress absender = new MailAddress("mail@adress.from");
    
    foreach (string sub in Subjects)
    {
        mail = new MailMessage();
        mail.IsBodyHtml = true;
        mail.Subject = sub;
        mail.From = absender;
    
        mail.To.Add("mail@adress.to");
    
        client.Send(mail);
    }
    

    您只需要在每次“创建”电子邮件时创建一个新的 MailMessage-Object。

    【讨论】:

      猜你喜欢
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多