c# - 多次发送邮件时错误的电子邮件标题
问题描述
首先,如果这是一个重复的问题,我深表歉意。我已经搜索了很多,但找不到相关的问题。
所以这里的问题是:我使用 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
s 并直接发送它们。
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
。
推荐阅读
- java - JPA @ManyToOne 仅在 JSON 招摇正文中具有 ID?
- ios - 滑动动作图像颜色 SwiftUI
- regex - 如何编写捕获字符串之间的字符串的正则表达式(即特定单词之间的单词)
- python - pandas resampler agg 不能应用于函数列表
- javascript - 如何使用 javascript 在 DDB 中插入嵌套地图
- javascript - 如何在 json JS 中抓取最深的嵌套对象
- javascript - 谷歌 appscript onChange 触发器,设置时间戳
- discord - DIScord斜线命令交互在discord py上失败
- node.js - 节点 HTTPS - 在 API 端点上做了一个 get 并且它工作了,现在它是一个 404
- python - 用于读取 Sentinel XML 元数据文件的 Python 脚本