Отправитель электронной почты зависает - PullRequest
1 голос
/ 29 мая 2011

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

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

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

smtp.Send (message)

, который полностью замораживает мое приложение: через 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

в

smtp.Send (сообщение)

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

РЕДАКТИРОВАТЬ: Оказывается, я редактировал файл, когда он отправлял его.Я знал, что это произойдет, и поэтому я добавил переменную bool под названием «IsEmailing», чтобы заблокировать файл, когда я писал по электронной почте.Оказывается, файлы по-прежнему загружаются после "smtp.Send (message);".

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

1 Ответ

1 голос
/ 29 мая 2011

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

        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 - моя собственная функция рассылки.

...