Неправильные заголовки писем при отправке писем несколько раз

Прежде всего, мои извинения, если это дублирующий вопрос. Я много искал его, но не смог найти связанных вопросов.

Итак, вот проблема: я использую класс SmtpClient и MailMessage для отправки писем. Я передаю тему письма в качестве параметра метода отправки почты. В первый раз письмо отправляется с правильной темой (тот, который я отправил в качестве параметра). Однако во всех следующих письмах, какую бы тему я ни указал, тема остается прежней (той, что использовалась в первый раз). Субъект задается изнутри метода.

(Примечание: это приложение WindowsForm)

Что я пробовал, так это создание другого метода с именем «Обновить ()», который удаляет почтовый объект и создает его снова (только с информацией от и до). И вызывайте этот метод каждый раз после отправки почты. Но с этой проблемой не помогает.

Коды приведены ниже:

Поля:

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" из метода), в этом случае это работает отлично.

Но в случае выше, когда субъект передается методу, субъект остается прежним.


person wannaknow    schedule 04.06.2019    source источник
comment
Какова идея метода обновления, вы повторно используете одно и то же MailMessage или что-то в этом роде, почему вы его кешируете? также вы перешагнули через это вообще.   -  person TheGeneral    schedule 04.06.2019
comment
Есть ли какая-то особая причина, по которой вы не создаете новый MailMessage() каждый раз, когда вам нужно отправить электронное письмо? Кроме того, как заявил @TheGeneral, отладка может дать вам дополнительную информацию об этом поведении.   -  person n0idea    schedule 04.06.2019
comment
Спасибо за ответы. Да, я повторно использую одно и то же MailMessage, я не создаю каждый раз новое MailMessage для экономии памяти, так как программа будет очень часто отправлять почту, а потребление и использование памяти в моем случае должно быть низким. Я делаю это неправильно? Является ли более эффективным каждый раз создавать новое MailMessage? PS: я новичок в C# и WinFormApp.   -  person wannaknow    schedule 04.06.2019


Ответы (2)


Как уже говорилось в разделе комментариев, нет причин кэшировать само сообщение. В настоящее время вы удаляете сообщение (что фактически переводит его в непригодное для использования состояние), а затем воссоздаете его. Узнайте больше ЗДЕСЬ. . С тем же успехом вы можете просто создавать новые объекты и удалять их после того, как закончите, чтобы сборщик мусора мог освободить ресурсы как можно скорее.

Просто используйте простой метод для создания 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, когда закончите его использовать.

person zhulien    schedule 04.06.2019

Я использовал ту же функциональность (SntpClient, MailMessage и т. д.) в одной из моих программ, и она работала просто отлично:

SmtpClient client = new SmtpClient("host", port);
MailMessage mail;
MailAddress absender = new MailAddress("[email protected]");

foreach (string sub in Subjects)
{
    mail = new MailMessage();
    mail.IsBodyHtml = true;
    mail.Subject = sub;
    mail.From = absender;

    mail.To.Add("[email protected]");

    client.Send(mail);
}

Возможно, вам просто нужно создавать новый объект MailMessage-Object каждый раз, когда вы «создаете» электронное письмо.

person Kiwimanshare    schedule 04.06.2019