其他分享
首页 > 其他分享> > 多次发送邮件时,电子邮件标题错误

多次发送邮件时,电子邮件标题错误

作者:互联网

首先,我很抱歉,如果这是一个重复的问题.我已经搜索了很多,但是找不到相关的问题.

所以这是问题所在:我正在使用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());

现在,无论在参数中发送任何主题,它都将始终以主题“ Subject 1”发送(来自上面的示例).邮件的正文很好,只有主题不正确.

我在该类中还有其他几种方法(例如用于其他目的,例如发送带有附件的邮件),其中subject不是作为参数传递的,而是直接在方法内部设置的(例如message.Subject =“ Example Sub”从方法),在这种情况下可以正常工作.

但是在上述情况下,如果将主题传递给方法,则主题保持不变.

解决方法:

就像已经提到的注释部分一样,没有理由缓存消息本身.当前,您正在处理该消息(实际上将其置于不可用状态),然后重新创建它.查看更多HERE.完成操作后,您也可以简单地创建新对象并对其进行处理,以便Garbage Collector可以尽快释放资源.

只需利用一种简单的方法来构造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.

标签:smtpclient,c
来源: https://codeday.me/bug/20191108/2005156.html