欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用C#编写简单的图形化的可发送附件的邮件客户端程序

程序员文章站 2022-05-26 10:58:10
今天谈一下c#(winform)如何发送带附件的电子邮件!废话少说,先截图伺候: 首先c#发送邮件需要smtp服务的支持,我也不知道是不是c#只支持smtp协议,...

今天谈一下c#(winform)如何发送带附件的电子邮件!废话少说,先截图伺候:

使用C#编写简单的图形化的可发送附件的邮件客户端程序

首先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