【问题标题】:Send email using smtp client in c#在 C# 中使用 smtp 客户端发送电子邮件
【发布时间】:2013-08-28 10:20:28
【问题描述】:

以下代码从表格中获取收件人电子邮件、电子邮件主题和电子邮件正文,然后创建电子邮件并将它们发送到拾取目录。有一个数据库连接类,我没有在这里包含,但我在下面的代码中调用它。 下面的代码运行良好,但是考虑到它将用于发送 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();
        }
    }
} 

}

【问题讨论】:

标签: c# email smtpclient


【解决方案1】:

如果您可以使用 .NET 2.0 或更高版本,那么您可以使用 SmtpClient.SendAsync 方法,该方法将创建一个新线程来发送电子邮件并释放主线程以进行更多处理。

阅读SmtpClient.SendAsync method 获取文档。

如果您使用的是 .NET 2.0 或更高版本,您还应该考虑使用泛型,它会为您的 Emaillist 对象提供类型安全,但不会有太大的性能提升,因为您没有得到 @987654324 常见的拆箱命中@,因为你没有使用值类型。

这是使用泛型List<T> 时您的EmailList 代码的样子:

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 列表中,上述代码将产生编译错误。

【讨论】:

  • 您好,卡尔,感谢您的回答。但是我不认为我可以使用 SendAsync,因为此方法需要两个参数 mailMeassage 和 Object userToken,我不知道要使用什么 userToken 或它是什么。
  • @ama 你读过文档吗? userToken 只是传递给完成的事件,因此您可以识别完成的消息。如果方法完成时不需要回调,则可以将null 作为值传递。
  • 大家好,感谢您的回复,但我没有发送电子邮件,我只是将 .eml 文件写入拾取目录。根据我的阅读,将电子邮件直接发送给收件人时会使用 SendAsyc。即使我只是写 .email 文件,我真的需要在这里使用线程吗?感谢您在这方面的帮助
  • 您正在寻找使您的代码更快或更高效的方法。这将使它更有效率,因为它会触发消息,然后有可能立即做更多的工作。我不确定你在寻找什么样的答案。
猜你喜欢
  • 2020-12-22
  • 2014-11-13
  • 1970-01-01
  • 2016-04-17
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多