使用C#编写简单的图形化的可发送附件的邮件客户端程序
程序员文章站
2022-05-26 10:58:10
今天谈一下c#(winform)如何发送带附件的电子邮件!废话少说,先截图伺候:
首先c#发送邮件需要smtp服务的支持,我也不知道是不是c#只支持smtp协议,...
今天谈一下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
上一篇: PHP7下协程的实现方法详解