C#使用SMTP发送邮件

需要用到的命名空间:

using System.Net.Mail;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.ComponentModel;

发送邮件的方法如下:

其中处理附件的代码实现的效果是自动根据文件扩展名获得ContentType值,且发送的附件名与上传的文件名一致。

/// <summary>
/// 发送邮件给相关人
/// </summary>
/// <param name="sendToList">收件人列表(以分号分隔)</param>
/// <param name="attachment">附件路劲(服务器端路劲)</param>
/// <param name="subject">邮件主题</param>
/// <param name="mailBody">邮件内容</param>
/// <param name="sysEmail">使用的系统邮箱</param>
/// <param name="sysEmailPwd">系统邮箱密码</param>
/// <param name="smtpUrl">系统邮箱SMTP的URL</param>
/// <returns>返回空字符串代表成功,否则为错误信息字符串</returns>
public string SendEmail(string sendToList, Hashtable attachment, string subject, string mailBody, 
                        string sysEmail, string sysEmailPwd, string smtpUrl)
{
    try
    {
        string strReturn = "";
        //return strReturn;

        MailMessage mail = new MailMessage();

        sendToList = sendToList.Trim().TrimEnd(';');
        if (sendToList.Length == 0)
        {
            return "收件人地址为空";
        }

        mail.From = new MailAddress(sysEmail);
        foreach (string to in sendToList.Split(';'))
        {
            if (Regex.IsMatch(to, @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"))
            {
                mail.To.Add(to);
            }
            else
            {
                strReturn += string.Format("{0}邮箱格式错误,未发送\\n", to);
            }
        }

        if (strReturn == "")
        {
            //mail.IsBodyHtml = true;
            //mail.Body = mailBody.Replace("\n\r", "<br />");
            mail.IsBodyHtml = false;
            mail.Subject = subject;
            mail.Body = mailBody;
            mail.SubjectEncoding = Encoding.GetEncoding("UTF-8");
            mail.BodyEncoding = Encoding.GetEncoding("UTF-8");

            if (attachment.Count > 0)
            {
                //mail.Body = mailBody +"\n\r随邮件带附件:";
                string filePath;
                string fileOldName;
                //FileInfo fileInfo;

                foreach (System.Collections.DictionaryEntry objDE in attachment)
                {
                    filePath = objDE.Key.ToString();
                    fileOldName = objDE.Value.ToString();
                    if (File.Exists(filePath))
                    {
                        //fileInfo = new FileInfo(filePath);
                        //if (fileInfo.Length / 1024 >= 10240)//大于10MB
                        //{
                        //    mail.Body += "大附件:<a href='" + System.Web.HttpContext.Current.Request.Url.Host + "/UploadedFiles/" +
                        //                  filePath.Split(new string[] { "\\UploadedFiles\\" }, StringSplitOptions.None)[1] + "'>" + fileOldName + "</a>";
                        //    continue;
                        //}

                        System.Net.Mime.ContentType contentType = new System.Net.Mime.ContentType();
                        contentType.Name = fileOldName;
                        contentType.MediaType = GetContentTypeForFileName(filePath);
                        Attachment mailAttach = new Attachment(new FileStream(objDE.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.Read), contentType);
                        //Attachment mailAttach = new Attachment(objDE.Key.ToString());
                        mail.Attachments.Add(mailAttach);
                    }
                }
            }

            SmtpClient smtp = new SmtpClient(smtpUrl);
            smtp.Credentials = new System.Net.NetworkCredential(sysEmail, sysEmailPwd);

            //smtp.Port = 25;
            //smtp.Timeout = 180000;//3分钟,默认为100秒
            //smtp.EnableSsl = false;

            smtp.Send(mail);

            //smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
            //smtp.SendAsync(mail, "异步发送邮件");

            mail.Dispose();
        }

        return strReturn;
    }
    catch (Exception ex)
    {
        logger.Error("【邮件发送】异常描述:\t" + ex.Message);
        logger.Error("【邮件发送】异常方法:\t" + ex.TargetSite);
        logger.Error("【邮件发送】异常堆栈:\t" + ex.StackTrace);
    }
}

获取文件ContentType值的方法:

/// <summary>
/// 获取文件ContentType值
/// </summary>
/// <param name="fileName">文件完整路劲</param>
/// <returns>文件ContentType值</returns>
private string GetContentTypeForFileName(string fileName)
{
    string ext = System.IO.Path.GetExtension(fileName);
    using (Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext))
    {
        if (registryKey == null)
            return null;
        string value = registryKey.GetValue("Content Type").ToString();
        return (value == null) ? string.Empty : value;
    }
}