使用C#编写简单的图形化的可发送附件的邮件客户端程序
更新时间:2020年6月25日 11:25 点击:1258
今天谈一下C#(WinForm)如何发送带附件的电子邮件!废话少说,先截图伺候:
首先C#发送邮件需要smtp服务的支持,我也不知道是不是C#只支持smtp协议,不过好像在MSDN里,Mail这个命名空间下只有介绍smtp的方法的,好像没看到POP的,算了,先不要说这个
我们暂时用smtp协议来做就好了!因此首先你要确保你的发件邮箱支持smtp服务,据我说知,雅虎邮箱,HotMail邮箱和GMail邮箱都不支持smtp的,不过没事,还好我们常用的QQ邮箱,163邮箱,新浪邮箱等邮箱都支持smtp的,这样我们就可以用这些邮箱来发邮件了,哈哈,不过QQ邮箱的smtp服务默认是关闭的,需要我们手动去开通,开通很简单,进入你的QQ邮箱后,选择【设置】,在账户选项卡里就有个smtp的复选框,打个勾保存一下就OK了。163邮箱和新浪邮箱开通smtp服务也差不多这样的,很简单。好了 开通好了接下来就开始来讲代码了 OK!
为了方便菜鸟理解,我把整个程序分成一下几部分:
- smtp服务信息设置
- 验证发件人信息
- 添加附件
- 正式发送邮件
- 发送邮件后处理
OK 以下代码伺候:
一些全局变量,都有注释的
SmtpClient SmtpClient = null; //设置SMTP协议 MailAddress MailAddress_from = null; //设置发信人地址 当然还需要密码 MailAddress MailAddress_to = null; //设置收信人地址 不需要密码 MailMessage MailMessage_Mai = null; FileStream FileStream_my = null; //附件文件流
1.smtp服务信息设置
#region 设置Smtp服务器信息 /// <summary> /// 设置Smtp服务器信息 /// </summary> /// <param name="ServerName">SMTP服务名</param> /// <param name="Port">端口号</param> private void setSmtpClient(string ServerHost, int Port) { SmtpClient = new SmtpClient(); SmtpClient.Host = ServerHost;//指定SMTP服务名 例如QQ邮箱为 smtp.qq.com 新浪cn邮箱为 smtp.sina.cn等 SmtpClient.Port = Port; //指定端口号 SmtpClient.Timeout = 0; //超时时间 } #endregion
2.验证发件人信息
#region 验证发件人信息 /// <summary> /// 验证发件人信息 /// </summary> /// <param name="MailAddress">发件邮箱地址</param> /// <param name="MailPwd">邮箱密码</param> private void setAddressform(string MailAddress, string MailPwd) { //创建服务器认证 NetworkCredential NetworkCredential_my = new NetworkCredential(MailAddress, MailPwd); //实例化发件人地址 MailAddress_from = new System.Net.Mail.MailAddress(MailAddress, textBoxX4.Text); //指定发件人信息 包括邮箱地址和邮箱密码 SmtpClient.Credentials = new System.Net.NetworkCredential(MailAddress_from.Address, MailPwd); ; } #endregion
3.添加附件
#region 检测附件大小 private bool Attachment_MaiInit(string path) { try { FileStream_my = new FileStream(path, FileMode.Open); string name = FileStream_my.Name; int size = (int)(FileStream_my.Length / 1024/1024); FileStream_my.Close(); //控制文件大小不大于10M if (size > 10) { MessageBox.Show("文件长度不能大于10M!你选择的文件大小为"+ size.ToString()+"M","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning); return false; } return true; } catch (IOException E) { MessageBox.Show(E.Message); return false; } } #endregion
4.正式发送邮件
private void btnSend_Click(object sender, EventArgs e) { //检测附件大小 发件必需小于10M 否则返回 不会执行以下代码 if (txt_Path.Text != "") { if (!Attachment_MaiInit(txt_Path.Text.Trim())) { return; } } if (txt_SmtpServer.Text == "") { MessageBox.Show("请输入SMTP服务器名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (textBoxX2.Text == "") { MessageBox.Show("请输入发件人邮箱地址!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (txtformPwd.Text == "") { MessageBox.Show("请输入发件人邮箱密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (dataGridViewX1.Rows.Count == 0) { MessageBox.Show("请添加收件人!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (MessageBox.Show("您确定要发送当前邮件吗?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { try { //初始化Smtp服务器信息 setSmtpClient("smtp." + txt_SmtpServer.Text.Trim() + comboBoxEx3.Text, Convert.ToInt32(numericUpDown1.Value)); } catch (Exception Ex) { MessageBox.Show("邮件发送失败,请确定SMTP服务名是否正确!" + "\n" + "技术信息:\n" + Ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } try { //验证发件邮箱地址和密码 setAddressform(textBoxX2.Text.Trim() + comboBoxEx2.Text, txtformPwd.Text.Trim()); } catch (Exception Ex) { MessageBox.Show("邮件发送失败,请确定发件邮箱地址和密码的正确性!" + "\n" + "技术信息:\n" + Ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //清空历史发送信息 以防发送时收件人收到的错误信息(收件人列表会不断重复) MailMessage_Mai.To.Clear(); //添加收件人邮箱地址 foreach (DataGridViewRow row in dataGridViewX1.Rows) { MailAddress_to = new MailAddress(row.Cells["Column1"].Value.ToString()); MailMessage_Mai.To.Add(MailAddress_to); } MessageBox.Show("收件人:" + dataGridViewX1.Rows.Count.ToString() + " 个"); //发件人邮箱 MailMessage_Mai.From = MailAddress_from; //邮件主题 MailMessage_Mai.Subject = txttitle.Text; MailMessage_Mai.SubjectEncoding = System.Text.Encoding.UTF8; //邮件正文 MailMessage_Mai.Body = Rtb_Message.Text; MailMessage_Mai.BodyEncoding = System.Text.Encoding.UTF8; //清空历史附件 以防附件重复发送 MailMessage_Mai.Attachments.Clear(); //添加附件 MailMessage_Mai.Attachments.Add(new Attachment(txt_Path.Text.Trim(), MediaTypeNames.Application.Octet)); //注册邮件发送完毕后的处理事件 SmtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); //开始发送邮件 SmtpClient.SendAsync(MailMessage_Mai, "000000000"); } }
5.发送邮件后处理
#region 发送邮件后所处理的函数 private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) { try { if (e.Cancelled) { MessageBox.Show("发送已取消!"); } if (e.Error != null) { MessageBox.Show("邮件发送失败!" + "\n" + "技术信息:\n" + e.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show("邮件成功发出!", "恭喜!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception Ex) { MessageBox.Show("邮件发送失败!" + "\n" + "技术信息:\n" + Ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #endregion
下一篇: C#远程获取图片文件流的方法
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25