3

我正在尝试发送非常大的电子邮件,通常在 3 MB 范围内,但可以更大。问题是我们的 adsl 线路在性能方面并不总是很稳定,而且我们的电子邮件托管从本地解决方案更改为远程解决方案。这意味着通过使用正常的 C# 发送方法,我不断达到超时到达异常。而且我不想只是增加超时。要成功上传 3Mb 的电子邮件,我需要 400 秒的超时时间。

现在按照此处的答案, 我可以通过本地 smtp 服务获取要发送的电子邮件,但前提是我不附加附件。如果附件在 3Mb 范围内,则它会彻底失败。如果它很小,当我尝试用 Outlook 拉下电子邮件时它会失败。

我确实从 smtp 服务中删除了最大文件附件大小。任何其他设置或者我可能弄错了吗?

如果它有助于运行的电脑是 smtp 服务,那么它就是在运行 win 7 的电脑上运行 win 2008 的虚拟机。

4

2 回答 2

0

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

于 2012-11-09T09:16:02.657 回答
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();
    }
于 2013-01-28T13:34:26.093 回答