Неправильные заголовки электронной почты при отправке почты несколько раз - PullRequest
3 голосов
/ 04 июня 2019

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

Так вот в чем проблема: я использую классы 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» (из приведенного выше примера).Тело сообщения в порядке, только тема неверна.

У меня есть несколько других методов в классе (для других целей, например, для отправки писем с вложениями), где тема не передается в качестве параметрано он устанавливается непосредственно из метода (например, message.Subject = "Example Sub" из метода), в этом случае он работает нормально.

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

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

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

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

1 голос
/ 04 июня 2019

Я использовал ту же функциональность (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 каждый раз, когда вы "создать "E-Mail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...