C# 如何通过mailto标签和SMTP协议两种方式发送邮件
本文主要讲解如何通过如现mailto标签和SMTP协议两种方式发送邮件,下面就直入主题
方法一、通过mailto标签发送邮件
通过mailto不是正真意义上的发送邮件,它只是会自动调用我们本地默认的邮件服务软件(这取决于我们本地安装了什么邮件软件,outlook,firemail等等),发送还是需要我们自己点击发送才能完成。
mailto标签有很多实用的方法,比如:加入邮件的默认主题、抄送地址、暗送(密件抄送)地址,邮件内容等待.....
1、为邮件加入发件人
格式:mailto:发件人地址
代码示例
/// <summary>
/// sendFrom:发件人
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}", sendFrom);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
2、为邮件加入默认标题
格式:mailto:发件人地址?subject=邮件主题
代码示例
/// <summary>
/// sendFrom:发件人
/// subjetc:主题
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}?subject={1}", sendFrom, subjetc);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
3、为邮件加入默认的抄送地址
格式:mailto:发件人地址?cc=抄送地址
代码示例
/// <summary>
/// sendFrom:发件人
/// sendCC:抄送地址
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}?cc={1}", sendFrom, sendCC);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
4、为邮件加入默认暗送(密件抄送)地址
格式:mailto:发件人地址?bcc=密送地址
代码示例
/// <summary>
/// sendFrom:发件人
/// sendBCC:密送地址
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}?bcc={1}", sendFrom, sendBCC);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
5、为邮件加入默认的内容
格式:mailto:发件人地址?body=邮件内容
代码示例
/// <summary>
/// sendFrom:发件人
/// content:邮件内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}?body={1}", sendFrom, content);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
6、多个邮件地址
格式:mailto:发件人地址1,发件地址2,发件地址3(以逗号分隔)
7、综合型的:加入默认抄送地址,标题,内容
格式:mailto:发件人地址1,发件人地址2?cc=抄送地址&bcc=密送地址&subject=主题&body=邮件内容
代码示例
/// <summary>
/// sendFrom:发件人
/// sendCC:抄送
/// subjetc:密送
/// subjetc:主题
/// content:邮件内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendEmail_ItemClick(object sender, ItemClickEventArgs e)
{
string message = string.Format("mailto:{0}?cc={1}&bcc={2}&subject={3}&body={4}", sendFrom, sendCC,
sendBCC, subjetc, content);
System.Diagnostics.Process.Start(message);//调用进程启动邮件
}
如图所示:

方法二、通过SMTP协议发送邮件
核心代码:
/// <summary>
/// 发送邮件
/// </summary>
/// <param name="userEmailAddress">发件人地址</param>
/// <param name="userName">发件人姓名(可为空)</param>
/// <param name="password">密码</param>
/// <param name="host">邮件服务器地址</param>
/// <param name="port"></param>
/// <param name="sendToList">收件人(多个电子邮件地址之间必须用逗号字符(“,”)分隔)</param>
/// <param name="sendCCList">抄送人(多个电子邮件地址之间必须用逗号字符(“,”)分隔)</param>
/// <param name="subject">主题</param>
/// <param name="body">内容</param>
/// <param name="attachmentsPath">附件路径</param>
/// <param name="errorMessage">错误信息</param>
public static bool SendMessage(string userEmailAddress, string userName, string password, string host, int port,
string[] sendToList, string[] sendCCList, string subject, string body, string[] attachmentsPath, out string errorMessage)
{
errorMessage = string.Empty;
SmtpClient client = new SmtpClient();
client.Credentials = new System.Net.NetworkCredential(userEmailAddress, password);//用户名、密码
client.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
client.Host = host;//邮件服务器
client.Port = port;//端口号 非SSL方式,默认端口号为:25
client.UseDefaultCredentials = true; MailMessage msg = new MailMessage();
//加发件人
foreach (string send in sendToList)
{
msg.To.Add(send);
}
//加抄送
foreach (string cc in sendCCList)
{
msg.To.Add(cc);
} //在有附件的情况下添加附件
if (attachmentsPath != null && attachmentsPath.Length > )
{
foreach (string path in attachmentsPath)
{
var attachFile = new Attachment(path);
msg.Attachments.Add(attachFile);
}
}
msg.From = new MailAddress(userEmailAddress, userName);//发件人地址
msg.Subject = subject;//邮件标题
msg.Body = body;//邮件内容
msg.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码
msg.IsBodyHtml = true;//是否是HTML邮件
msg.Priority = MailPriority.High;//邮件优先级 try
{
client.Send(msg);
return true;
}
catch (System.Net.Mail.SmtpException ex)
{
errorMessage = ex.Message;
return false;
}
}
如图所示:

PS:如有疑问,请留言,未经允许,不得私自转载,转载请注明出处:http://www.cnblogs.com/xuliangxing/p/7987282.html


C# 如何通过mailto标签和SMTP协议两种方式发送邮件的更多相关文章
- 为input标签绑定事件的几种方式
为input标签绑定事件的几种方式 1.JavaScript原生态的方式,直接复制下面的代码就会有相应的效果 <!DOCTYPE html><html><head> ...
- FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...
- select 标签的两种方式(以动态插入为例)
标准形式: html <select id="sorte_piceid_copy" name="tea" style="display:none ...
- android 向serverGet和Post请求的两种方式,android向server发送文件,自己组装协议和借助第三方开源
一个适用于Android平台的第三方和apache的非常多东西类似,仅仅是用于Android上 我在项目里用的是这个 https://github.com/loopj/android-async-ht ...
- 【转】HTTP协议两种提交参数的方式Form-data和raw
原文:http://www.cnblogs.com/zhangfei/p/5099036.html HTTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提 ...
- jsp中一个标签两种方式绑定两个click事件导致未执行的问题
近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...
- cycle标签和random两种方式美化表格
一:cycle标签实现给表格变色 1. <style>标签里写好需要的颜色 2. 在要变色的地方(行/列)加固定的语句,按照顺序依次执行 代码: <!DOCTYPE html> ...
- jquery 改变标签可见状态的几种方式
第一种: $(selector).show(); //立即显示指定标签 $(selector).hide();//立即隐藏指定标签 第二种: $(selector).fadeIn(ms);//在指定毫 ...
- 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别
1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...
随机推荐
- 下载Android kernel
方法一: https://source.android.com/setup/building-kernels 方法二: 在按照https://source.android.com/setup/down ...
- Springboot中Aspect实现切面(以记录日志为例)
前言今天我们来说说spring中的切面Aspect,这是Spring的一大优势.面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提 ...
- 我的第一个 react redux demo
最近学习react redux,先前看过了几本书和一些博客之类的,感觉还不错,比如<深入浅出react和redux>,<React全栈++Redux+Flux+webpack+Bab ...
- 每位 Ubuntu 18.04 用户都应该知道的快捷键 | Linux 中国
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/82879369 wx_fmt=jpeg& ...
- Grafana数据可视化
1.1 Grafana简介 1.1.1 Grafana是什么? 一个类似Kibana的东西,也是对后端的数据进行实时展示,那么Grafana和Kibana有什么区别?在我看来区别不大,不过在大家的日常 ...
- 为什么虚拟 dom 会提高性能?
虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom 操作,从而提高性能.用 JavaScript 对象结构表示 DOM 树的结构:然后 ...
- DES算法原理完整版
1.所需参数 key:8个字节共64位的工作密钥 data:8个字节共64位的需要被加密或被解密的数据 mode:DES工作方式,加密或者解密 2.初始置换 DES算法使用64位的密钥key将64位的 ...
- 【转】Java并发的AQS原理详解
申明:此篇文章转载自:https://juejin.im/post/5c11d6376fb9a049e82b6253写的真的很棒,感谢老钱的分享. 打通 Java 任督二脉 —— 并发数据结构的基石 ...
- ld: library not found for -lstdc++.6
ld: library not found for -lstdc++.6 Xcode10 删除 libstdc++.6.tbd libstdc++.6.0.9.tbd 用 libc++.tbd lib ...
- 解决Protobuf生成的C#代码命名不规范问题
起因 通常使用Protobuf的步骤为 定义 .proto 文件 使用 protoc 生成对应语言的代码 以生成C#代码为例,使用如下命令: protoc -I ../protos --csharp_ ...