通过本地SMTP服务发送电子邮件

3
我试图发送非常大的电子邮件,通常在3MB左右,但可能更大。问题是我们的adsl线路在性能方面不总是很稳定,我们的电子邮件托管从本地解决方案更改为远程解决方案。这意味着使用正常的C#发送方法时,我一直遇到超时异常。而我不想只增加超时时间。要成功上传一个3MB电子邮件,我需要400秒的超时时间。
按照这里的答案,现在我可以通过本地smtp服务发送电子邮件,但仅当我不附加附件时才可以。如果附件大小约为3Mb,则完全失败。如果很小,尝试使用Outlook下载电子邮件时会失败。
我从smtp服务中删除了最大文件附件大小。是否还有其他设置或问题我可能弄错了?
如果有帮助的话,运行smtp服务的计算机是在运行win 7的win 2008上运行的虚拟机。

为什么不将您的大信息分成几个小信息呢? - Dennis
1
你可以将数据分块成更小的消息,或重新考虑你的方法,并将文件托管在存储区域中,通过邮件发送链接。长期来看,通过电子邮件传输兆字节的数据只会带来麻烦(某个时刻,SMTP服务器 必定 会爆炸。那么邮件备份呢?) - Alex
你可以将文件放入Dropbox中,然后在电子邮件中插入链接。 - d4v3y0rk
以今天的标准来看,3 MB 并不算很大。你是在非常隐蔽的地方(南极洲?Rural Savo?)还是应该认真调查一下为什么需要超过400秒才能完成? - tripleee
我认为通过本地SMTP服务发送和直接发送之间没有基本区别。唯一的区别是SMTP服务可能会帮助您重试几次。 如果您的ADSL不稳定,您应该发送小邮件,仅通过发送共享文件URL来提高成功率。否则,我认为您无法在ADSL差的情况下完成发送。 - Tony Zhu
显示剩余4条评论
2个回答

0

我使用SendAsync修复了它,并按如下方式使用:

我将所有电子邮件放在Fifo列表中。 添加新电子邮件后,我会删除一个并尝试发送它。 这是我的发送函数。

public void Sender()
    {
        if (Globalcls.Message_list.Count == 0)
            return;
        SmtpClient client = new SmtpClient();
        client.Credentials = new System.Net.NetworkCredential(Globalcls.settings.username, Globalcls.settings.password);
        client.Port = Convert.ToInt32(Globalcls.settings.portS);


        client.Host = "smtp.xdsl.co.za";

        client.SendCompleted += new SendCompletedEventHandler(MailSendCallback);

        if (Globalcls.Message_list.Count > 0)
        {
            try
            {
                client.SendAsync(Globalcls.Message_list[0].msg, "1");


            }
            catch (Exception ex)
            {
                //do exception stuff here, only cut here to make post shorter
            }
        }

 static void MailSendCallback(object sender, AsyncCompletedEventArgs arg)
    {
        // oncomllete event for async send.
        if (arg.Error != null)
        {
            //mail did not send, here I do not remove it and increment an counter so  to delete a mail that keeps failing
        }
        else
        {

            Form1 frm1 = new Form1(); 
            frm1.que("email sent to " + Globalcls.projects[Globalcls.Message_list[0].project].name);
            frm1.Dispose();
            Globalcls.Message_list[0].msg.Dispose();
            foreach (string meh in Globalcls.Message_list[0].files)
                File.Delete(meh);
            Globalcls.Message_list.RemoveAt(0);
        }
        if (Globalcls.Message_list.Count > 0)
        {
            Form1 frm2 = new Form1();
            frm2.Sender();
            frm2.Dispose();
    }

0

如果只是关于传输数据,而电子邮件只是媒介,为什么不放弃整个电子邮件解决方案,在远程连接处托管一个 Web 服务,可以接受块并在接收所有块后组装文件?或者更简单一些,如 Phill 建议的那样,使用已经具备恢复上传功能的 FTP 或其他类似工具?问题不在于您的系统,我认为您不会找到任何解决此问题的电子邮件配置。您的连接速度似乎与 90 年代的互联网一样快(也一样稳定)。从那个时代传输大量数据的解决方案可能是解决您问题的最简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接