0

backgroundworkerdowork イベントの Form1 で、次のことを行いました。

se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir1 + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir2 + "\\" + "photofiles.zip");
se.SendPhotos(photofilesDir3 + "\\" + "photofiles.zip");

se クラス SendEmail で私がした:

public void SendPhotos(string fileNameToSend)
        {
            try
            {
                MailAddress from = new MailAddress("test@gmail.com", "User " + (char)0xD8 + " Name",
                System.Text.Encoding.UTF8);
                MailAddress to = new MailAddress("test@test");
                photosmessage = new MailMessage(from, to);
                photosmessage.Body = "Please check the log file attachment I have some bugs.";
                string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
                photosmessage.Body += Environment.NewLine + someArrows;
                photosmessage.BodyEncoding = System.Text.Encoding.UTF8;
                photosmessage.Subject = "Log File For Checking Bugs" + someArrows;
                photosmessage.SubjectEncoding = System.Text.Encoding.UTF8;
                Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet);
                photosmessage.Attachments.Add(myAttachment);
                SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587);
                photossend.SendCompleted += new SendCompletedEventHandler(photossend_SendCompleted);
                photossend.EnableSsl = true;
                photossend.Timeout = 10000;
                photossend.DeliveryMethod = SmtpDeliveryMethod.Network;
                photossend.UseDefaultCredentials = false;
                photossend.Credentials = new NetworkCredential("usern", "userpass");
                string userState = "test message1";
                photossend.SendAsync(photosmessage, userState);
                SendLogFile.Enabled = false;
                fname = fileNameToSend;
            }

            catch (Exception errors)
            {
                Logger.Write("Error sending message :" + errors);
            }
        }

        private void photossend_SendCompleted(object sender, AsyncCompletedEventArgs e)
        {
            photosmessage.Dispose();
            if (fname == @"C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles3" + "\\" + "photofiles.zip")
            {
                photossendended = true;
            }
        }

backgroundworker の問題は、最後の photofilesDir3 を送信しないことです。私はブレークポイントを使用し、次のようになりました: photossendended = true; しかし、私の電子メールでは、4 ではなく 3 つのファイルしか送信されていません。

バックグラウンドワーカーでブレークポイントを使用して F11 を実行すると、待機せずに 4 つの送信が 1 つずつ行われていることがわかりました。

photofiles.zip には毎回異なるファイルが含まれています。ここで、行にブレークポイントを作成したことを確認します。

if (fname == @"C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles3" + "\\" + "photofiles.zip")

そして、それがそこに到達すると、常に真になります == fname never C:\Users\Simbalip\AppData\Local\outputphotos\photosfiles2 または 1 または photosfiles

しかし、最終的には3つの異なるphotofiles.zipファイルを取得し、それぞれに異なるファイルが含まれていますが、ファイルの1つは送信されませんでした。

Myabe 私は、電子メールを送信するときに、最初の電子メールが送信されるまで何らかの形で次の電子メールを送信するようにする必要があります。

4

1 に答える 1

2

のドキュメントはSmtpClient、並列操作をサポートしていないという事実をほのめかしています。

電子メールの送信中に SendAsync または Send を再度呼び出すと、InvalidOperationException が返されます。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

SendCompletedイベントが発生するまで、次のメールを送信しないことをお勧めします。これは、コードの大幅な変更を意味します (SendPhotos への各呼び出しは、実際には、バックグラウンドで処理する保留中のメール送信操作のコレクションに何かを追加するだけです)。

于 2013-08-12T17:51:43.977 に答える