1

次のコードは、受信者の電子メール、電子メールの件名、および電子メールの本文をテーブルから取得し、電子メールを作成してピックアップ ディレクトリに送信します。ここには含めなかった db 接続クラスがありますが、以下のコードで呼び出します。以下のコードは問題なく動作しますが、10000 件以上の電子メールを送信するために使用されることを考慮して、より高速に実行できるように改善できるかどうか疑問に思っています。

助けてくれてありがとう。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace SendEmails
{
class SendEmail
{
    private class EmailsList
    {
        private class listData
        {
            public string email;
            public string email_header;
            public string email_body;
            public string email_guid;
        }
        public void data()
        {
            SqlDataReader sqlData;
            ArrayList Emaillist = new ArrayList();
            sqlData = new SqlCommand("SELECT email, email_header, email_body, email_guid FROM dbo.vw_emails ", con.openconnection()).ExecuteReader();
            // loop through the emails table and load arraylist
            while (sqlData.Read())
            {
                listData itemData = new listData();
                itemData.email = sqlData[0].ToString();
                itemData.email_header = sqlData[1].ToString();
                itemData.email_body = sqlData[2].ToString();
                itemData.email_guid = sqlData[3].ToString();
                Emaillist.Add(itemData);                
            }               
            sqlData.Close();
            con.closeconnection

            foreach (listData itemData in Eamillist)
            {
                //SEND EMAIL *****************************/
                spSendMail(itemData.email, itemData.email_header, "me@yahoo.com", itemData.email_body, itemData.email_guid);
                //DO THE UPDATE *********************/
                SqlCommand cmd = new SqlCommand("up_emailLog", con.openconncetion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@email_GUID", itemData.email_guid);
                cmd.CommandTimeout = 0;
                cmd.ExecuteNonQuery();
                con.CloseConnection();

            }
        }
    }

    static void Main(string[] args)
    {
        try
        {
           EmailsList sEmails = new EmailsList();
            sEmails.data();                    
        }
        catch (Exception ex)
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO [dbo.Err_Log](exception, insdt) VALUES('" + ex.Message.ToString() + "','" +  "','"+ DateTime.Now + "')", Con.OpenConnection());
            cmd.ExecuteNonQuery();
            con.CloseConnection();                 
        }
    }
    // Send Email Method
    public static void spSendMail(string recipients, string subject, string from, string body, string email_guid)
    {
        try
        {
            using (MailMessage mailMessage = new MailMessage(from, recipients))
            {
                    mailMessage.Subject = subject;
                    mailMessage.Body = body;
                    mailMessage.IsBodyHtml = true;
                    SmtpClient smtpClient = new SmtpClient("xxxxxx.xxxx.zo");
                    smtpClient.UseDefaultCredentials = true;
                    smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                    smtpClient.PickupDirectoryLocation = "\\\\exchange_server\\pickup";
                    //Create eml file and send it to pickup directory
                    smtpClient.Send(mailMessage);                               
            }
        }
        catch (Exception ex)
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO [dbo.Err_Log](exception, communication, insdt) VALUES('" + ex.Message.ToString() +"','" + recipients.ToString() + "','" + DateTime.Now + "')", con.OpenConnection());
            cmd.CommandTimeout = 0;
            cmd.ExecuteNonQuery();
            Con.CloseConnection();
        }
    }
} 

}

4

1 に答える 1

0

.NET 2.0 以降を使用できる場合は、SmtpClient.SendAsyncメソッドを使用できます。これにより、電子メールを送信するための新しいスレッドが作成され、メイン スレッドが解放されてより多くの処理が可能になります。

ドキュメントについては、 SmtpClient.SendAsyncメソッドを参照してください。

.NET 2.0 以降を使用している場合は、Generics の使用も検討する必要があります。これにより、オブジェクトのタイプ セーフが提供されますが、値型を使用していなかったため、 とEmaillist共通のボックス化解除ヒットが得られなかったため、パフォーマンスはあまり向上しませんでした。 ArrayList.

EmailListGenerics を使用したコードは次のようになりますList<T>

List<listData> Emaillist = new List<listData>();

while (sqlData.Read())
{
    listData itemData = new listData();
    itemData.email = sqlData[0].ToString();
    itemData.email_header = sqlData[1].ToString();
    itemData.email_body = sqlData[2].ToString();
    itemData.email_guid = sqlData[3].ToString();
    Emaillist.Add(itemData);                
}

リスト以外の型を追加しようとすると、上記のコードはコンパイル エラーを生成しlistDataますEmaillist

于 2013-08-26T01:50:10.273 に答える