c# - 为什么发送电子邮件需要这么长时间?

标签 c# email console-application

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Threading;

namespace MGR_Backuper
{
    class Program
    {
        static void Main(string[] args)
        {
            string file = "D:\\Programy\\WinRAR\\rar.exe";
            string command = "C:\\Users\\Pawel\\Desktop\\Praca magisterska back\\mgrback-%YEAR%-%MONTH%-%DAY%-%HOUR%-%MINUTES%-%SECONDS%.rar";
            string arg = "a \"%FILENAME%\" \"C:\\Users\\Pawel\\Desktop\\Praca magisterska\\*\" -m5 -ep1 -hppasspass -rr5 -inul -r0";
            var t1 = DateTime.Now;
            command = command.Replace("%YEAR%", "" + t1.Year);
            if (t1.Month < 10) command = command.Replace("%MONTH%", "0" + t1.Month);
            else command = command.Replace("%MONTH%", "" + t1.Month);

            if (t1.Day < 10) command = command.Replace("%DAY%", "0" + t1.Day);
            else command = command.Replace("%DAY%", "" + t1.Day);

            if (t1.Hour < 10) command = command.Replace("%HOUR%", "0" + t1.Hour);
            else command = command.Replace("%HOUR%", "" + t1.Hour);

            if (t1.Minute < 10) command = command.Replace("%MINUTES%", "0" + t1.Minute);
            else command = command.Replace("%MINUTES%", "" + t1.Minute);

            if (t1.Second < 10) command = command.Replace("%SECONDS%", "0" + t1.Second);
            else command = command.Replace("%SECONDS%", "" + t1.Second);

            arg = arg.Replace("%FILENAME%", command);
            var t2 = DateTime.Now;
            Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = file;
            proc.StartInfo.Arguments = arg;

                proc.Start();

                while (!proc.HasExited)
                    Thread.Sleep(50);


            var t3 = DateTime.Now;
            try
            {
                MailMessage mailMsg = new MailMessage();
                mailMsg.To.Add("email@email.com");

                // From
                MailAddress mailAddress = new MailAddress("email@email.com", "Sender");
                mailMsg.From = mailAddress;

                // Subject and Body
                mailMsg.Subject = "MGR";
                mailMsg.Body = "Backup magisterki";
             mailMsg.Attachments.Add(new Attachment(command));

                SmtpClient smtpClient = new SmtpClient("server.serv.com", 587);
                NetworkCredential credentials = new NetworkCredential("login", "password");
                smtpClient.Credentials = credentials;
                smtpClient.Timeout = Int32.MaxValue;
                smtpClient.Send(mailMsg);
            }
            catch (Exception ex)
            { Console.WriteLine(ex.ToString()+"\n"); }
            var t4 = DateTime.Now;
            Console.WriteLine("Czas kompresji: \t{0:0.00}s", (t3 - t2).TotalSeconds);
            Console.WriteLine("Czas wysyłania: \t{0:0.00}s", (t4 - t3).TotalSeconds);
            Console.WriteLine("Czas całkowity: \t{0:0.00}s", (t4 - t1).TotalSeconds);
            Console.ReadKey(true);
        }
    }
}

这是一个简单的程序,用于备份一些对我很重要的数据,方法是将数据发送到我的电子邮件地址。创建的存档大约为 1.5 MB。发送电子邮件大约需要 7-8 分钟。这不是因为连接不良,因为当我尝试通过电子邮件程序或网络邮件发送相同的文件时,需要 5-6 秒。为什么用这种方式发送电子邮件这么慢?

编辑:

我又做了一个测试

            var ts1 = DateTime.Now;
            smtpClient.Send(mailMsg);
            var ts2 = DateTime.Now;

并确认 smtpClient.Send(mailMsg); 是导致速度变慢的原因。知道为什么吗?

最佳答案

我遇到了同样的问题,似乎 SMTP 服务器在发送邮件之前正在做某种检查。

我通过使用新线程以异步方式发送邮件解决了我的问题,如下所示。

private void SendMail(string from, string to)
{
    //your logic to send the mail
}

以异步方式发送邮件。

ThreadStart threadStart = delegate() { SendMail(from, to); };
Thread thread = new Thread(threadStart);
thread.Start();

关于c# - 为什么发送电子邮件需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740567/

相关文章:

c# - 修改字典值而不分配

matlab - 使用 MATLAB Compiler 构建应用程序时抑制控制台窗口

使用 jLine 的 Java 控制台应用程序

python - 当我在窗口中打开 CSV 文件时,添加了一行。只有当我将 CSV 文件作为电子邮件附件发送时才会出现这种情况

c# - Visual Studio (MAC) 控制台应用程序

c# - 如何在Key Container中存储私钥?

c# - 卸载 AppDomain 后删除 dll 文件

c# - 转换到一个奇怪的重复派生类

c# - 生成一封电子邮件,供客户下载并从他们的 outlook 帐户发送

java - 从 *.msg 文件接收电子邮件地址而不是带有 POI 的姓名 [Java]