C# 多种方式发送邮件(附帮助类)

因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用~

QQ邮箱发送邮件

#region 发送邮箱try{MailMessage mail = new MailMessage();MailAddress from = new MailAddress("发件人邮箱", "工程管理平台", System.Text.Encoding.GetEncoding("GB2312"));//邮件的发件人mail.From = from;MailAddress to = new MailAddress("收件人邮箱");//设置邮件的收件人
                mail.To.Add(to);mail.Subject = "收款确认";string url = "http://wwww.baidu.com";mail.Body = "您好,有新的待确认收款" + url;mail.IsBodyHtml = true;//HTML格式,内容可以包含HMTL标签和超链接uuu mail.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置邮件的格式mail.Priority = MailPriority.Normal;//设置邮件的发送级别mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;SmtpClient client = new SmtpClient();//邮件发送服务器//client.Port = 25; QQ发送邮件不用设置client.Host = "smtp.qq.com";    //发件人地址所在的服务器SMTP 如网易126邮箱的为smtp.126.comclient.EnableSsl = true;client.UseDefaultCredentials = false; //设置用于 SMTP 事务的端口,默认的是 25client.Credentials = new System.Net.NetworkCredential("发件人邮箱", "授权码");//发件人邮箱登陆名和密码(生成的授权码)client.DeliveryMethod = SmtpDeliveryMethod.Network;try{client.Send(mail);//发送邮件MessageShow("发送成功");Response.Write("<script language='javascript'>alert('发送成功!');</script>");}catch (System.Net.Mail.SmtpException ex){MessageShow(ex.Message);}}catch (Exception ex){throw ex;}#endregion

 

效果:

注意

重要引用:

using System.Net.Mail;

 

其中,使用QQ发送邮件,需要使用授权码而不是QQ密码,授权码具体生成方式可以查看:http://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28

 

自定义发送邮件

附帮助类的发送邮件方式(推荐此种方式,更灵活)

邮件帮助类

  1 #region 邮件帮助类
  2     /// <summary>
  3     /// 邮件帮助类
  4     /// </summary>
  5     public static class SendMailHelper
  6     {
  7         /// <summary>
  8         /// 发送邮件
  9         /// </summary>
 10         /// <param name="request">邮件内容对象</param>
 11         /// <returns>发送邮件所遇到的异常</returns>
 12         public static string SendMail(MailRequest request)
 13         {
 14             try
 15             {
 16                 MailMessage mail = new MailMessage();
 17 
 18                 if (string.IsNullOrEmpty(request.From))
 19                 {
 20                     request.From = ConfigurationManager.AppSettings["DefaultMailFrom"];
 21                 }
 22                 mail.From = new MailAddress(request.From);
 23 
 24                 PaserMailAddress(request.To, mail.To);
 25                 PaserMailAddress(request.CC, mail.CC);
 26                 PaserMailAddress(request.Bcc, mail.Bcc);
 27 
 28                 mail.Subject = request.Subject;
 29                 mail.SubjectEncoding = System.Text.Encoding.UTF8;
 30                 mail.Body = request.Body;
 31                 mail.ReplyTo = new MailAddress(request.From);
 32                 mail.IsBodyHtml = true;
 33 
 34                 if (request.Attachments != null && request.Attachments.Length > 0)
 35                 {
 36                     for (int i = 0; i < request.Attachments.Length; i++)
 37                     {
 38                         Attachment mailAttach = new Attachment(ByteArrayToStream(request.Attachments[i].FileData), request.Attachments[i].FileName);
 39 
 40                         mail.Attachments.Add(mailAttach);
 41                     }
 42                 }
 43             
 44                 if (string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["SMTPSERVER_Show"]))
 45                 {
 46                     throw new ApplicationException("邮件服务无效");
 47                 }
 48 
 49                 //Smtp Server
 50                 SmtpClient mailClient = new SmtpClient(ConfigurationManager.AppSettings["SMTPSERVER_Show"]);
 51 
 52                 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["SMTPSERVERPORT"]))
 53                 {
 54                     //端口号
 55                     try
 56                     {
 57                         mailClient.Port = Int32.Parse(ConfigurationManager.AppSettings["SMTPSERVERPORT"]);
 58                     }
 59                     catch
 60                     {
 61                         return "SMTP服务器端口设置错误,端口必须设置为数值型";
 62                     }
 63                 }
 64 
 65                 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["MAILUSER_Show"]))
 66                 {
 67                     mailClient.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MAILUSER_Show"], ConfigurationManager.AppSettings["MAILUSERPW_Show"]);
 68                     mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
 69                 }
 70                 else
 71                 {
 72                     mailClient.Credentials = CredentialCache.DefaultNetworkCredentials;
 73                 }
 74 
 75                 mailClient.Send(mail);
 76                 mail.Dispose();
 77 
 78                 return string.Empty;
 79             }
 80             catch (SmtpFailedRecipientsException e)
 81             {
 82                 return e.Message;
 83             }
 84             catch (SmtpFailedRecipientException e)
 85             {
 86                 return e.Message;
 87             }
 88             catch (SmtpException e)
 89             {
 90                 return e.Message;
 91             }
 92             catch (Exception e)
 93             {
 94                 return e.Message;
 95             }
 96         }
 97 
 98         /// <summary>
 99         /// 解析分解邮件地址
100         /// </summary>
101         /// <param name="mailAddress">邮件地址</param>
102         /// <param name="mailCollection">邮件对象</param>
103         private static void PaserMailAddress(string mailAddress, MailAddressCollection mailCollection)
104         {
105             if (string.IsNullOrEmpty(mailAddress))
106             {
107                 return;
108             }
109 
110             char[] separator = new char[2] { ',', ';' };
111             string[] addressArray = mailAddress.Split(separator);
112 
113             foreach (string address in addressArray)
114             {
115                 if (address.Trim() == string.Empty)
116                 {
117                     continue;
118                 }
119 
120                 mailCollection.Add(new MailAddress(address));
121             }
122         }
123 
124         /// <summary>
125         /// 字节数组转换为流
126         /// </summary>
127         /// <param name="byteArray">字节数组</param>
128         /// <returns>Stream</returns>
129         private static Stream ByteArrayToStream(byte[] byteArray)
130         {
131             MemoryStream mstream = new MemoryStream(byteArray);
132 
133             return mstream;
134         }
135     }
136     #endregion
View Code

 

补充上述帮助类中,还需要添加 MailRequest.cs 类(发送请求相关类) 和 MailRequestAttachments.cs 类(附件类)

MailRequest.cs 类

using System;
using System.Collections.Generic;
using System.Text;namespace SyncAdData.DBHelper
{/// <summary>/// 发送邮件请求/// </summary>public class MailRequest{#region PrivateFields/// <summary>/// 文件名/// </summary>private string _fromField;/// <summary>/// 返送到/// </summary>private string _toField;/// <summary>/// 抄送/// </summary>private string _copyField;/// <summary>/// 附件/// </summary>private string _bccField;/// <summary>/// 标题/// </summary>private string _subjectField;/// <summary>/// 发送人名/// </summary>private string _bodyField;/// <summary>/// 类容/// </summary>private MailRequestAttachments[] _attachmentsField;#endregion/// <summary>/// 发送人,多个人以分号;间隔/// </summary>public string From{get{return this._fromField;}set{this._fromField = value;}}/// <summary>/// 收件人,多个人以分号;间隔/// </summary>public string To{get{return this._toField;}set{this._toField = value;}}/// <summary>/// 抄送人,多个人以分号;间隔/// </summary>public string CC{get{return this._copyField;}set{this._copyField = value;}}/// <summary>/// 秘密抄送人,多个人以分号;间隔/// </summary>public string Bcc{get{return this._bccField;}set{this._bccField = value;}}/// <summary>/// 主题/// </summary>public string Subject{get{return this._subjectField;}set{this._subjectField = value;}}/// <summary>/// 内容/// </summary>public string Body{get{return this._bodyField;}set{this._bodyField = value;}}/// <summary>/// 附件列表/// </summary>public MailRequestAttachments[] Attachments{get{return this._attachmentsField;}set{this._attachmentsField = value;}}}
}
View Code

 

MailRequestAttachments.cs 类

using System;
using System.Collections.Generic;
using System.Text;namespace SyncAdData.DBHelper
{/// <summary>/// 发送邮件请求附件/// </summary>public class MailRequestAttachments{#region PrivateFields/// <summary>/// 文件名/// </summary>private string _fileNameField;/// <summary>/// 文件内容/// </summary>private byte[] _fileDataField;#endregion/// <summary>/// 文件名/// </summary>public string FileName{get{return this._fileNameField;}set{this._fileNameField = value;}}/// <summary>/// 文件内容/// </summary>public byte[] FileData{get{return this._fileDataField;}set{this._fileDataField = value;}}}
}
View Code

 

需要的命名空间

using System;
using System.Reflection;
using System.Net.Mail;
using System.Web.Configuration;
using System.Net;
using System.IO;

其中 帮助类中的服务器地址 和 账号  密码需要在配置文件中配置

 <add key="SMTPSERVER" value="邮件服务器"/><add key="MAILUSER" value="账号"/><add key="MAILUSERPW" value="密码"/>

 

前台调用

/// <summary>/// 发送邮件/// </summary>/// <param name="StrUrl">根据业务需要,这里我需要传入几个拼接后的id值</param>/// <param name="bid">根据业务需要,这里我传的批次id</param>/// <param name="showemail">根据业务需要,这里我传入的是查询出来的收件人邮箱(如果是固定的更好,可以直接写死或者写成配置文件)</param>private void Send(string StrUrl,string bid,string showemail){ #region 读取配置发送邮件string url = "http://localhost:9998/FinanceManage/CollectionManage/ConfirmCollection_Receipt.aspx?MenuID=14010600&id=" + StrUrl + "&batchID=" + bid + "";string body = "您好,有新的待确认收款≥ "+url;//string bcc = string.Empty;string to = "v-zhangxy52@vanke.com";//收件人//string cc = "";//抄送人MailRequest mail = new MailRequest();mail.Subject = "收款确认";//主题mail.Body = body;//内容// mail.Bcc = bcc;//秘密抄送人mail.From = "v-tangqq02@vanke.com";//发送人mail.To = to; //收件人// mail.CC = cc; //抄送人string sendMainResult = "-1";if (!string.IsNullOrEmpty(mail.To.Trim()) || !string.IsNullOrEmpty(mail.CC.Trim())){sendMainResult = SendMailHelper.SendMail(mail);if (string.IsNullOrEmpty(sendMainResult)){BaseClass.CommFun.Alert(this.up_innerCheck, "发送成功!", Page);}}#endregion }

 

效果

 点击确定发送之后,查看邮箱,即可看到发送内容(可根据业务需求自行调整)

 

 刚好另一个项目中也需要用到发邮件,也是用的上述的帮助类,附效果图

 

 

 至此,发送邮件功能已经全部完毕,当中不乏可以优化的地方,欢迎大家自行优化,相互交流~

转载于:https://www.cnblogs.com/zhangxiaoyong/p/6117848.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安霸SPI 剖析

最近在搞单片机和A5S的SPI通信 1、A5S是跑的是ITRON的系统、有自己相关的SPI API函数2、单片机这边也是可以熟悉了&#xff0c;发送&#xff0c;接收什么的&#xff0c;我都可以自模拟出来3、但是问题是&#xff0c;A5S上面的API函数的工作是如何的&#xff0c;我一直没怎么弄清…

河南大学计算机科学与技术中外合作,河南大学中外合作办学怎么样

Q1&#xff1a;河南大学中外合作办学宿舍条件如何&#xff1f;你指的是二本的国际教育学院吗&#xff1f;是老校区最好的&#xff0c;住在学校里面&#xff0c;挨着铁塔公园&#xff0c;有暖气&#xff0c;没有空调&#xff0c;有电扇。四个人一间&#xff0c;上床下桌&#xf…

[AssertionError: nput tensor input format are different]

问题描述 writer.add_image(img/fixed_img, denorm(fixed_img.data), 0)报如下错误 assert(len(tensor.shape) len(input_format)), "size of input tensor and input format are different.AssertionError: size of input tensor and input format are different. tenso…

链表的插入、删除、排序的程序

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node {int data;struct node * pNext; }*pNode,Node; //#define bool int; //#define的意思是单纯的替换&#xff0c;与别名没有关系&#xff0c;而且C语言中没有bool数据类型 type…

linux-2.6.32在mini2440开发板上移植(16)之LED 驱动程序移植

LED 驱动程序移植 编者&#xff1b;对于led的驱动程序&#xff0c;很多文章都有详细的介绍&#xff0c;我的博客里面有一篇专门详解这个的。需要看的&#xff0c;可以找下。led灯的驱动其实就代表了I/O口的驱动。在linux系统下&#xff0c;操作一个I/O口&#xff0c;可以说实在…

单变量批量梯度下降算法与单变量随机梯度下降算法

2.3 代价函数的直观理解I 让我们通过一些例子来获取一些直观的感受&#xff0c;看看代价函数到底是在干什么。 2.4 代价函数的直观理解II 代价函数的样子类似于等高线图&#xff0c;则可以看出在三维空间中存在一个J(θ0,θ1)使得最小的点。 通过这些图形&#xff0c;我希望你…

一台计算机连入计算机网络后通过该计算机,一台计算机连入计算机网络后,该计算机( )。...

摘要&#xff1a;计算机连当碰撞已不可避免时,船舶应根据良好船艺的要求采取最有效的行动以减小碰撞的损失,下列说法正确的是()。①应避免两船首相撞;②应避免一船船首撞入他船机舱附近或船中;③应尽量使两船相撞前相对速度达到最大;④应尽量使两船相撞前相对速度达到最小。算机…

LCD驱动移植(一)

一、种类 LCD的种类比较多,有以下四种,不过现在我们用的大多是TFT液晶显示屏 1、TN型显示器 2、STN型彩色显示器 3、DSTN型显示器 4、TFT显示器 二、LCD参数 (1)尺寸

python调用其他程序或脚本方法(转)

python运行&#xff08;调用&#xff09;其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序&#xff0c;这样就可以在脚本中直接使用其他脚本&#xff0c;或者程序提供的功能&#xff0c;而不必再次编写实现该功能的代码。为了更好地控制运行的进程&#x…

反向传播+代码实现

ywx的反向传播代码实现 import torch x_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]#w是Tensor(张量类型)&#xff0c;Tensor中包含data和grad&#xff0c;data和grad也是Tensor。 # grad初始为None&#xff0c;调用l.backward()方法后w.grad为Tensor&#xff0c; # 故更…

考研专业课计算机网络调剂,计算机网络信息中心2019年硕士研究生接收调剂信息公告...

一、外单位考生调剂1.接收调剂要求报考学科门类 政治理论 外国语 业务课一 业务课二 总分工学(08) 同国家复试分数线基本要求 325工程(0852) 同国家复试分数线基本要求 325中心调剂指标预计在4人左右&#xff0c;均为计算机技术专业。2.调剂流程1、3月26日14&#xff1a;00至3月…

linux目录树(书本上看到)

LINUX的目录树 /bin bin 是binary 的缩写。这个目录是对UNIX 系统习惯的沿袭,存放着使用者最经常使用的命令。例如:cp,ls,cat。 /boot 这里存放的是启动LINUX 时使用的一些核心文件。 /dev dev 是device(设备)的缩写。这个目录下是所有LINUX 的外部设备,其功能类似DOS 下的.…

Collection中Set集合在应用中常见的方法和注意点

Set集合 &#xff1a; 元素无序的&#xff0c;元素不允许重复。 ---->HashSet : 存值方式使用哈希表来存值的。 原理 &#xff1a; 如果HashSet中存放对象 ,首先会调用对象的hashCode方法获取到哈希值&#xff0c;通过哈希值做移为等运算&#xff…

【Pytorch神经网络实战案例】04 使用Pytorch实现线性回归

import torchx_data torch.tensor([[1.0],[2.0],[3.0]]) y_datatorch.tensor([[2.0],[4.0],[6.0]])#重点在于构造计算图 pytorch会自动计算梯度 #Zwxb 就是一个线性单元class LinearModel(torch.nn.Module):#Module的对象会自动实现backword()的过程#构造函数def __init__(self…

html 网页制作标签,html网页制作标签最全版.doc

html网页制作标签最全版MetaName(页面描述信息)keywords。关键字&#xff0c;格式&#xff1a;description。描述&#xff0c;格式&#xff1a;author。 作者&#xff0c;格式&#xff1a;generator。编写工具&#xff0c;格式&#xff1a;robots。 机器人&#xff0c;格式&…

menu菜单

[1]添加菜单方式 通过一个布局 在res下 meun目录下创建一个布局 <menu xmlns:android"http://schemas.android.com/apk/res/android" ><itemandroid:id"id/action_settings1"android:orderInCategory"10"android:title"hahah"…

计算机网络阅读报告,计算机网络实验二报告

计算机网络实验二报告 (5页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分&#xfeff;计算机网络实验报告课程_ 计算机网络 _ 实验名称 TCP/IP协议分析与验证 姓 名 实 验 日 期&#xff…

LCD驱动移植(二)

LCD驱动的话会在MINI2440里是向Plaform注册的一个驱动 Plaform的话可以在网上查查这方面的资料&#xff0c;主要要注意这两个函数&#xff0c;如下&#xff1a; (1)platform_device_register()注册平台XX设备。 (2)platform_driver_register()注册平台XX驱动。 下面贴出LCD驱…

使用Pytorch处理多维特征的输入

下图这个预测一个人在一年之后得糖尿病的概率的例子&#xff0c;这个时候我们的输入将会有很多的指标。你可以把它看成是我们体检的各种值。最后一排的外代表了他是否会得糖尿病。 那么多维的特征输入应该怎么办呢&#xff1f;我们就需要把每一个特征x付以相应的权重。在进行逻…

dubbo学习 三 dubbox概述

当当网根据自身的需求&#xff0c;对dubbo进行了扩展就叫成了dubbox。具体的使用方法可以参照官网各种例子&#xff1a;http://dangdangdotcom.github.io/dubbox/ 支持rest风格远程调用 之前了解过restful服务具体是什么&#xff0c;resteasy也了解过&#xff0c;所以看到就可以…