首先,我很抱歉,如果这是一个重复的问题。我已经搜索了很多,但是找不到相关问题。
所以这是问题所在:我正在使用SmtpClient和MailMessage类发送邮件。我在邮件发送方法中将邮件的主题作为参数传递。第一次发送带有适当主题的邮件(作为参数发送的主题)。但是,在接下来的所有电子邮件中,无论我输入什么主题,主题都保持不变(第一次使用该主题)。主题是从方法内部设置的。
(注意:这是WindowsForm应用程序)
我尝试的是创建另一个名为“ Refresh()”的方法,该方法处理邮件对象并再次创建它(仅使用from和to info)。并在每次发送邮件后调用此方法。但这对解决这个问题没有帮助。
代码如下:
字段:
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”一起发送(来自上面的示例)。邮件的正文很好,只有主题不正确。
我在该类中没有其他方法(例如,用于发送带有附件的邮件之类的其他目的),其中subject不是作为参数传递,而是直接在方法内部设置(例如message.Subject = "Example Sub"
方法),在这种情况下就可以正常工作。
但是在上述情况下,如果将主题传递给方法,则主题保持不变。
答案 0 :(得分:2)
就像已经提到的注释部分一样,没有理由缓存消息本身。当前,您正在处理该消息(实际上将其置于不可用状态),然后重新创建它。查看更多HERE。您也可以简单地创建新对象并在完成后对其进行处理,以便垃圾收集器可以尽快释放资源。
只需利用一种简单的方法来构造MailMessage
并直接发送即可。
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
。另外,使用完毕后,请在Dispose
上调用SmtpClient
。
答案 1 :(得分:1)
我在其中一个程序中使用了相同的功能(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。