Отправитель электронной почты зависает

Я сделал приложение, которое архивирует некоторые файлы и отправляет их по электронной почте. Файлов около 70 (общий размер около 800кб).

Процесс zip замораживает мое приложение (но это нормально, потому что это занимает около секунды)

Проблема связана с процессом электронной почты. Во время отладки я обнаружил, что весь процесс подготовки письма выполняется довольно быстро, за исключением

smtp.Отправить(сообщение)

который полностью замораживает мое приложение: через 5 секунд приложение все еще работает, но исчезает с панели задач, и даже после отправки электронного письма приложение продолжает не отвечать.

Функция отправки электронной почты:

    public void SendMail(string FromGmailEmail, string GmailPassword, string ToEmail, string Subject, string Body, string[] AttachmentsPaths)
    {
        var fromAddress = new MailAddress(FromGmailEmail, "None");
        var toAddress = new MailAddress(ToEmail, "None");
        string fromPassword = GmailPassword;
        string subject = Subject;
        string body = Body;

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
        };
        var message = new MailMessage(fromAddress, toAddress);
        message.Subject = subject;
        message.Body = body;

        try
        {
            for (int i = 0; i < AttachmentsPaths.Length; i++)
                message.Attachments.Add(new Attachment(AttachmentsPaths[i]));
        }
        catch (FileNotFoundException)
        {
        }
        smtp.Timeout = int.MaxValue;
        smtp.Send(message);
    }

Я открываю новую тему при отправке письма.

public void OpenEmailThread(string FromGmailEmail, string GmailPassword, string ToEmail, string Subject, string Body, string[] AttachmentsPaths)
    {
        Thread thread = new Thread(() => SendMail(FromGmailEmail, GmailPassword, ToEmail, Subject, Body, AttachmentsPaths));
        thread.Name = "EmailThread";
        thread.Start();
    }

Боковое примечание: и для некоторых вывод говорит мне:

Возникло первое случайное исключение типа «System.IO.IOException» в mscorlib.dll.

on

smtp.Отправить(сообщение)

(но это меньшая из моих проблем)

EDIT: оказалось, я редактировал файл, пока он его отправлял. Я знал, что это произойдет, и поэтому я добавил логическую переменную с именем «IsEmailing», чтобы заблокировать файл во время отправки по электронной почте. Оказывается, файлы ВСЕ ЕЩЕ загружаются после "smtp.Send(message);".

Решение. Заархивируйте вложения перед отправкой И ТОЛЬКО ПЕРЕД ОТПРАВКОЙ. таким образом, ZIP-файл будет создан только один раз, поэтому ZIP-файл нельзя будет изменить.


person Or Betzalel    schedule 28.05.2011    source источник
comment
Купите более качественный интернет-сервис или используйте BackgroundWorker.   -  person Hans Passant    schedule 29.05.2011


Ответы (1)


Я использую это, чтобы отправить почту в новую ветку, и она работает нормально...

        public void SendEmail(string from, string to, string subject, string body, string attachPath)
    {
        Thread threadSendMails;
        threadSendMails = new Thread(delegate()
        {

            sendEmail(from, to, subject, body, attachPath);

        });

        threadSendMails.IsBackground = true;
        threadSendMails.Start();

    }

Где sendMail — моя собственная функция рассылки.

person Oliver    schedule 28.05.2011
comment
Я попытался добавить thread.IsBackground = true, и это не помогло, можете ли вы опубликовать свою функцию sendMail? - person Or Betzalel; 29.05.2011
comment
Пытался открыть новый проект и отправить электронное письмо, и он отлично работает. Спасибо. - person Or Betzalel; 29.05.2011
comment
Нет, спасибо. (Оказалось, моя ошибка заключалась в том, что я добавлял файл, пока он отправлял) - person Or Betzalel; 29.05.2011