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

时间:2012-09-11 13:29:48

标签: c# email smtp

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

回答here 现在我可以通过本地smtp服务获取电子邮件,但前提是我没有附加附件。如果附件位于3Mb区域,则其完全失败。如果它很小,当我尝试用outlook拉下电子邮件时它会失败。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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();
    }