zoukankan      html  css  js  c++  java
  • C#利用System.Net发送邮件(带 抄送、密送、附件、html格式的邮件)

    net2.0后,C#可以利用System.Net发送邮件了。

    代码整理如下:

     3. 增加IProcessMessage类,定义了一个消息方法,用于消息传递

      1 /************************************** 
      2 * <copyright file="SendEail.cs"> 
      3 * Copyright(c)2014 LeeStudio All rights reserved. 
      4 * CLR版本:4.0.30319.17929 
      5 * 开发团队:欺心伴月个人工作室 
      6 * 技术博客:http://www.cnblogs.com/lichunyang/ 
      7 * 所属工程:LeeStudio.Basic 
      8 * 创 建 者:Frank Lee 
      9 * 修改时间:2014-02-20 11:20 
     10 * </copyright> 
     11 **************************************/
     12 
     13 using System;
     14 using System.Text;
     15 using System.Net;
     16 using System.Net.Mail;
     17 using System.Net.Mime;
     18 
     19 namespace LeeStudio.Basic
     20 {
     21 /// <summary> 
     22 /// 邮件发送类 
     23 /// </summary> 
     24 public class SendEmail
     25 {
     26 private MailMessage mailMessage = new MailMessage(); //实例化一个邮件类
     27 
     28 #region 构造函数 
     29 /// <summary> 
     30 /// 构造函数 
     31 /// </summary> 
     32 /// <param name="toAddresses">收件人地址(多个以,号分开)</param> 
     33 /// <param name="fromAddress">发件人地址</param> 
     34 /// <param name="title">主题</param> 
     35 /// <param name="body">正文</param> 
     36 public SendEmail(string toAddresses, string fromAddress, string title, string body)
     37 : this(toAddresses, fromAddress, "", "", title, body, false)
     38 {
     39 }
     40 
     41 /// <summary> 
     42 /// 构造函数 
     43 /// </summary> 
     44 /// <param name="toAddress">收件人地址</param> 
     45 /// <param name="fromAddress">发件人地址</param> 
     46 /// <param name="toName">收件人名字</param> 
     47 /// <param name="fromName">发件人姓名</param> 
     48 /// <param name="title">主题</param> 
     49 /// <param name="body">正文</param> 
     50 /// <param name="isBodyHtml">正文是否为html格式</param> 
     51 public SendEmail(string toAddress, string fromAddress, string toName, string fromName, string title, string body, bool isBodyHtml)
     52 {
     53 mailMessage.From = new MailAddress(fromAddress, fromName, Encoding.GetEncoding(936));
     54 if (toName.Equals(""))
     55 mailMessage.To.Add(toAddress);
     56 else
     57 mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936)));
     58 
     59 mailMessage.Subject = title;
     60 mailMessage.SubjectEncoding = Encoding.GetEncoding(936);
     61 
     62 mailMessage.Body = body;
     63 mailMessage.IsBodyHtml = isBodyHtml;
     64 mailMessage.BodyEncoding = Encoding.GetEncoding(936);
     65 }
     66 #endregion
     67 
     68 /// <summary> 
     69 /// 设置SMTP,并且将邮件发送出去 
     70 /// 所有参数都设置完成后再调用该方法 
     71 /// </summary> 
     72 /// <param name="password">发件人密码</param> 
     73 /// <param name="smtpHost">SMTP服务器地址</param> 
     74 public void SetSmtp(string password, string smtpHost)
     75 {
     76 SetSmtp(mailMessage.From.Address, password, smtpHost, 25, false, MailPriority.Normal);
     77 }
     78 
     79 /// <summary> 
     80 /// 设置SMTP,并且将邮件发送出去 
     81 /// 所有参数都设置完成后再调用该方法 
     82 /// </summary> 
     83 /// <param name="address">发件人地址(必须为真实有效的email地址)</param> 
     84 /// <param name="password">发件人密码</param> 
     85 /// <param name="smtpHost">SMTP服务器地址</param> 
     86 /// <param name="smtpPort">SMTP服务器的端口</param> 
     87 /// <param name="isEnableSsl">SMTP服务器是否启用SSL加密</param> 
     88 /// <param name="priority">邮件的优先级</param> 
     89 public void SetSmtp(string address, string password, string smtpHost, int smtpPort, bool isEnableSsl, MailPriority priority)
     90 {
     91 SmtpClient smtp = new SmtpClient();
     92 smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
     93 smtp.Credentials = new NetworkCredential(address, password);
     94 smtp.Host = smtpHost;
     95 smtp.Port = smtpPort;
     96 smtp.EnableSsl = isEnableSsl;
     97 
     98 mailMessage.Priority = priority;
     99 smtp.Send(mailMessage); //发送邮件 
    100 }
    101 
    102 #region //设置邮件地址 
    103 /// <summary> 
    104 /// 设置更多收件人 
    105 /// </summary> 
    106 /// <param name="toAddresses">收件人地址</param> 
    107 public void SetMoreToAddress(string toAddresses)
    108 {
    109 mailMessage.To.Add(toAddresses);
    110 }
    111 
    112 /// <summary> 
    113 /// 设置更多收件人 
    114 /// </summary> 
    115 /// <param name="toAddresses">收件人地址</param> 
    116 /// <param name="toName">收件人名字</param> 
    117 public void SetMoreToAddress(string toAddress, string toName)
    118 {
    119 mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936)));
    120 }
    121 
    122 /// <summary> 
    123 /// 设置抄送者(多个以,号分开) 
    124 /// </summary> 
    125 /// <param name="ccAddresses">抄送者地址</param> 
    126 public void SetCarbonCopyFor(string ccAddresses)
    127 {
    128 mailMessage.CC.Add(ccAddresses);
    129 }
    130 
    131 /// <summary> 
    132 /// 设置抄送者 
    133 /// </summary> 
    134 /// <param name="ccAddress">抄送者地址</param> 
    135 /// <param name="ccName">抄送者名字</param> 
    136 public void SetCarbonCopyFor(string ccAddress, string ccName)
    137 {
    138 mailMessage.Bcc.Add(new MailAddress(ccAddress, ccName, Encoding.GetEncoding(936)));
    139 }
    140 
    141 /// <summary> 
    142 /// 设置密送者(多个以,号分开) 
    143 /// </summary> 
    144 /// <param name="bccAddresses">密送者</param> 
    145 public void SetBlindCarbonCopyFor(string bccAddresses)
    146 {
    147 mailMessage.Bcc.Add(bccAddresses);
    148 }
    149 
    150 /// <summary> 
    151 /// 设置密送者 
    152 /// </summary> 
    153 /// <param name="bccAddress">密送者</param> 
    154 /// <param name="bccName">密送者名字</param> 
    155 public void SetBlindCarbonCopyFor(string bccAddress, string bccName)
    156 {
    157 mailMessage.Bcc.Add(new MailAddress(bccAddress, bccName, Encoding.GetEncoding(936)));
    158 }
    159 #endregion
    160 
    161 #region 添加附件 
    162 /// <summary> 
    163 /// 添加附件(自动识别文件类型) 
    164 /// </summary> 
    165 /// <param name="fileName">单个文件的路径</param> 
    166 public void Attachments(string fileName)
    167 {
    168 mailMessage.Attachments.Add(new Attachment(fileName));
    169 }
    170 
    171 /// <summary> 
    172 /// 添加附件(默认为富文本RTF格式) 
    173 /// </summary> 
    174 /// <param name="fileName">单个文件的路径</param> 
    175 public void AttachmentsForRTF(string fileName)
    176 {
    177 mailMessage.Attachments.Add(new Attachment(fileName, MediaTypeNames.Application.Rtf));
    178 }
    179 #endregion
    180 }
    181 }

    调用是按照需求,自由设置参数。

     1 using LeeStudio.Basic;
     2 
     3 private void SendEmail()
     4 {
     5 #region 最简设置 
     6 //SendEmail se = new SendEmail("*****@****.com", "****@163.com", "title", "body"); 
     7 //se.SetSmtp("password", "smtp.163.com"); //必须在所有参数设置完后调用此方法 
     8 #endregion
     9 
    10 #region 完全设置 
    11 //string toAddresses = "***@**.**,***@**.**"; 
    12 //string toNames = "frank,lee";
    13 
    14 //SendEmail se = new SendEmail("to@**.**", "from@**.**", "toname", "fromname","title", "body", false); 
    15 //se.SetMoreToAddress("to@**.**", "toName"); 
    16 //se.SetCarbonCopyFor("cc@**.**"); 
    17 //se.SetBlindCarbonCopyFor("bcc@**.**");
    18 
    19 //string filePath = Request.PhysicalApplicationPath + "/file/SendEmail.txt"; 
    20 //se.Attachments(filePath); 
    21 //filePath = Request.PhysicalApplicationPath + "/file/RTF文件.docx"; 
    22 //se.AttachmentsForRTF(filePath); 
    23 //se.SetSmtp("email", "password", "smtp", 25, true, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法 
    24 #endregion
    25 }

    遗留问题:

    当有多个收件人/抄送者/密送者时,如何快速处理?之前的做法是让用户输入字符串,再将字符串一一对应匹配,代码如下:

     1 /// <summary>  
     2 /// 将邮件地址和名称加入到锯齿数组中  
     3 /// </summary>  
     4 /// <param name="addrs">邮件地址(多个以,号分开)</param>  
     5 /// <param name="names">名称(多个以,号分开)</param>  
     6 /// <returns>地址和名称数组</returns>  
     7 private string[][] SetNameList(string addrs, string names)
     8 {
     9     string[][] result = new string[2][];
    10 
    11     string[] addr = addrs.Split(',');
    12     string[] name = names.Split(',');
    13     result[0] = new string[addr.Length];
    14     result[1] = new string[name.Length];
    15 
    16     for (int i = 0; i < addr.Length; i++)
    17         result[0][i] = addr[i];
    18     for (int i = 0; i < name.Length; i++)
    19         result[1][i] = name[i];
    20 
    21     return result;
    22 }

    首先这个方法就很奇葩,其次,只要用户输入的个数不对应,又要做一堆的异常处理。

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/jjg0519/p/6079885.html
Copyright © 2011-2022 走看看