2013-08-26 2 views
1

следующий код получает получателей электронной почты, тему электронной почты и тело электронной почты из таблицы и создает электронные письма и отправляет их в каталог пикапа. есть класс связи db, который я здесь не включил, но я вызываю его в приведенном ниже коде. Код ниже работает отлично, но мне интересно, можно ли его улучшить, чтобы работать быстрее, учитывая, что он будет использоваться для отправки 10000 писем плюс.Отправьте электронное письмо с помощью smtp-клиента в C#

Заранее благодарим за любую помощь.

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, "[email protected]", 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(); 
     } 
    } 
} 

}

+0

Я думаю, он принадлежит http://codereview.stackexchange.com/ – Shaharyar

+0

Какую версию C# вы используете? –

ответ

0

Если вы можете использовать .NET 2.0 или более поздней версии, то вы можете использовать SmtpClient.SendAsync метод, который будет создавать новый поток для отправки электронной почты на и освободить от основного потока для дополнительной обработки ,

Прочитано SmtpClient.SendAsync method для документации.

Вы также должны изучить использование Generics, если используете .NET 2.0 или новее, это обеспечит безопасность типа для вашего объекта Emaillist, но не так уж сильно улучшит производительность, потому что вы не получили общий доступ к распаковке с ArrayList, потому что вы не использовали типы значений.

Вот что ваш EmailList код может выглядеть следующим образом, используя Generics 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 списка.

+0

Привет, Карл, Спасибо за ответ. Однако я не думаю, что могу использовать SendAsync, потому что этот метод принимает два аргумента mailMeassage и Object userToken, и я не знаю, что userToken использовать или что это такое. – ama

+0

Я использую C# 2.0 – ama

+0

@ama Вы прочитали документацию? 'userToken' просто передается завершенному событию, чтобы вы могли определить, какое сообщение было завершено. Вы можете передать значение «null» в качестве значения, если вам не нужен обратный вызов, когда метод завершен. –