3

非常に大きなメールを送信しようとしています。通常は 3 MB の範囲ですが、それより大きくなる可能性があります。問題は、adsl 回線のパフォーマンスが常に安定しているとは限らず、メール ホスティングがローカル ソリューションからリモート ソリューションに変更されたことです。これは、通常の C# send メソッドを使用することで、タイムアウトに達した例外に到達し続けることを意味します。そして、タイムアウトを増やしたくありません。3Mb のメールを正常にアップロードするには、400 秒のタイムアウトが必要です。

ここでの回答に続い て、ローカルSMTPサービスを介して送信するメールを取得できますが、添付ファイルを添付しない場合のみです。添付ファイルが 3Mb の領域にある場合、完全に失敗します。小さい場合、Outlook でメールをプルダウンしようとすると失敗します。

smtp サービスから添付ファイルの最大サイズを削除しました。他の設定など、間違っている可能性がありますか?

そして、それが実行されるPCがsmtpサービスであるのに役立つ場合は、win 7を実行しているPCでwin 2008を実行している仮想マシンです.

4

2 に答える 2

0

データを転送するだけで、電子メールが媒体にすぎない場合は、電子メール ソリューション全体を削除し、リモート接続で Web サービスをホストしてみませんか? または、さらに簡単に、フィルが提案するように、FTP などを使用して、再開アップロード機能を既に備えていますか? - 問題はあなたのシステムではなく、これを解決する電子メールの設定を見つけることはできないと思います. あなたの接続は、90 年代のインターネットと同じくらい高速 (そして安定) しているようです。その時点から大量のデータを転送するソリューションが、問題を解決する最も簡単な方法である可能性があります。

于 2012-11-09T09:16:02.657 に答える
0

SendAsyncを使用して修正し、次のように使用しました

すべてのメールを Fifo リストに入れました。新しいメールを追加した後、1 つ削除して送信しようとしました。これは私の送信機能です

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 に答える