C#开发邮件收发(同步)
发邮件界面:
收邮件界面:
先分析邮件发送类
邮件发送类使用smtp协议,这里以QQ邮箱为例
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- //添加的命名空间引用
- using System.Net;
- using System.Net.Mail;
- using System.IO;
- using System.Net.Mime;
- namespace SendMailExample
- {
- public partial class FormSendMail : Form
- {
- public FormSendMail()
- {
- InitializeComponent();
- }
- private void FormSendMail_Load(object sender, EventArgs e)
- {
- //邮箱协议
- textBoxSmtpServer.Text = "smtp.qq.com";
- //发送人邮箱
- textBoxSend.Text = "邮箱账号";
- //发送人姓名
- textBoxDisplayName.Text = "名字";
- //密码
- textBoxPassword.Text = "邮箱密码";
- //收件人姓名
- textBoxReceive.Text = "收件人邮箱账号";
- //发送标题
- textBoxSubject.Text = "测试mytest";
- //发送内容
- textBoxBody.Text = "This is a test(测试)";
- radioButtonSsl.Checked = true;
- }
- //单击【发送】按钮触发的事件
- private void buttonSend_Click(object sender, EventArgs e)
- {
- this.Cursor = Cursors.WaitCursor;
- //实例化一个发送邮件类
- MailMessage mailMessage = new MailMessage();
- //发件人邮箱,方法重载不同,可以根据需求自行选择
- mailMessage.From = new MailAddress(textBoxSend.Text, textBoxDisplayName.Text, System.Text.Encoding.UTF8);
- //收件人邮箱地址
- mailMessage.To.Add(textBoxReceive.Text);
- //邮件标题
- mailMessage.Subject = textBoxSubject.Text;
- //邮件发送使用的编码
- mailMessage.SubjectEncoding = System.Text.Encoding.Default;
- //邮件发送的内容
- mailMessage.Body = textBoxBody.Text;
- //发送邮件的标题
- mailMessage.BodyEncoding = System.Text.Encoding.Default;
- //指定邮件是否为html格式
- mailMessage.IsBodyHtml = false;
- //设置电子邮件的优先级
- mailMessage.Priority = MailPriority.Normal;
- //添加附件
- Attachment attachment = null;
- if (listBoxFileName.Items.Count > )
- {
- for (int i = ; i < listBoxFileName.Items.Count; i++)
- {
- string pathFileName = listBoxFileName.Items[i].ToString();
- string extName = Path.GetExtension(pathFileName).ToLower();
- //这里仅举例说明如何判断附件类型
- if (extName == ".rar" || extName == ".zip")
- {
- attachment = new Attachment(pathFileName, MediaTypeNames.Application.Zip);
- }
- else
- {
- attachment = new Attachment(pathFileName, MediaTypeNames.Application.Octet);
- }
- ContentDisposition cd = attachment.ContentDisposition;
- cd.CreationDate = File.GetCreationTime(pathFileName);
- cd.ModificationDate = File.GetLastWriteTime(pathFileName);
- cd.ReadDate = File.GetLastAccessTime(pathFileName);
- mailMessage.Attachments.Add(attachment);
- }
- }
- SmtpClient smtpClient = new SmtpClient();
- smtpClient.Host = textBoxSmtpServer.Text;
- smtpClient.Port = ;
- //是否使用安全套接字层加密连接
- smtpClient.EnableSsl = radioButtonSsl.Checked;
- //不使用默认凭证,注意此句必须放在client.Credentials的上面
- smtpClient.UseDefaultCredentials = false;
- smtpClient.Credentials = new NetworkCredential(textBoxSend.Text, textBoxPassword.Text);
- //邮件通过网络直接发送到服务器
- smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
- try
- {
- smtpClient.Send(mailMessage);
- MessageBox.Show("发送成功");
- }
- catch (SmtpException smtpError)
- {
- MessageBox.Show("发送失败:" + smtpError.StatusCode
- + "\n\n" + smtpError.Message
- + "\n\n" + smtpError.StackTrace);
- }
- finally
- {
- mailMessage.Dispose();
- smtpClient = null;
- this.Cursor = Cursors.Default;
- }
- }
- //单击【添加附件】按钮触发的事件
- private void buttonAddAttachment_Click(object sender, EventArgs e)
- {
- //提示用户打开一个文件夹
- OpenFileDialog myOpenFileDialog = new OpenFileDialog();
- myOpenFileDialog.CheckFileExists = true;
- //只接收有效的文件名
- myOpenFileDialog.ValidateNames = true;
- //允许一次选择多个文件作为附件
- myOpenFileDialog.Multiselect = true;
- myOpenFileDialog.ShowDialog();
- if (myOpenFileDialog.FileNames.Length > )
- {
- listBoxFileName.Items.AddRange(myOpenFileDialog.FileNames);
- }
- }
- }
- }
收邮件的代码:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- //添加的命名空间引用
- using System.Net;
- using System.Net.Sockets;
- using System.IO;
- namespace ReceiveMailExample
- {
- public partial class FormReceiveMail : Form
- {
- private TcpClient tcpClient;
- private NetworkStream networkStream;
- private StreamReader sr;
- private StreamWriter sw;
- public FormReceiveMail()
- {
- InitializeComponent();
- textBoxPOP3Server.Text = "pop.qq.com";
- textBoxPassword.Text = "密码";
- textBoxUser.Text = "邮箱账号";
- }
- //单击建立连接按钮触发的事件
- private void buttonConnect_Click(object sender, EventArgs e)
- {
- Cursor.Current = Cursors.WaitCursor;
- listBoxStatus.Items.Clear();
- try
- {
- //建立与POP3服务器的连接,使用默认端口110
- tcpClient = new TcpClient(textBoxPOP3Server.Text,);
- listBoxStatus.Items.Add("与pop3服务器连接成功");
- }
- catch
- {
- MessageBox.Show("与服务器连接失败");
- return;
- }
- string str;
- networkStream = tcpClient.GetStream();
- //得到输入流
- sr = new StreamReader(networkStream, Encoding.Default);
- //得到输出流
- sw = new StreamWriter(networkStream, Encoding.Default);
- sw.AutoFlush = true;
- //读取服务器回送的连接信息
- str = GetResponse();
- if (CheckResponse(str) == false) return;
- //向服务器发送用户名,请求确认
- SendToServer("USER " + textBoxUser.Text);
- str = GetResponse();
- if (CheckResponse(str) == false) return;
- //向服务器发送密码,请求确认
- SendToServer("PASS " + textBoxPassword.Text);
- str = GetResponse();
- if (CheckResponse(str) == false) return;
- //向服务器发送LIST命令,请求获取邮件总数和总字节数
- SendToServer("LIST");
- str = GetResponse();
- if (CheckResponse(str) == false) return;
- string[] splitString = str.Split(' ');
- //从字符串中取子串获取邮件总数
- int count = int.Parse(splitString[]);
- //判断邮箱中是否有邮件
- if (count > )
- {
- listBoxOperation.Items.Clear();
- groupBoxOperation.Text = "信箱中共有 " + splitString[] + " 封邮件";
- //向邮件列表框中添加邮件
- for (int i = ; i < count; i++)
- {
- str = GetResponse();
- splitString = str.Split(' ');
- listBoxOperation.Items.Add(string.Format(
- "第{0}封:{1}字节", splitString[], splitString[]));
- }
- listBoxOperation.SelectedIndex = ;
- //读出结束符
- str = GetResponse();
- //设置对应状态信息
- buttonRead.Enabled = true;
- buttonDelete.Enabled = true;
- }
- else
- {
- groupBoxOperation.Text = "信箱中没有邮件";
- buttonRead.Enabled = false;
- buttonDelete.Enabled = false;
- }
- buttonConnect.Enabled = false;
- buttonDisconnect.Enabled = true;
- Cursor.Current = Cursors.Default;
- }
- private bool SendToServer(string str)
- {
- try
- {
- sw.WriteLine(str);
- sw.Flush();
- listBoxStatus.Items.Add("发送:" + str);
- return true;
- }
- catch (Exception err)
- {
- listBoxStatus.Items.Add("发送失败:" + err.Message);
- return false;
- }
- }
- private string GetResponse()
- {
- string str = null;
- try
- {
- str = sr.ReadLine();
- if (str == null)
- {
- listBoxStatus.Items.Add("收到:null");
- }
- else
- {
- listBoxStatus.Items.Add("收到:" + str);
- if (str.StartsWith("-ERR"))
- {
- str = null;
- }
- }
- }
- catch (Exception ex)
- {
- listBoxStatus.Items.Add("接收失败:" + ex.Message);
- }
- return str;
- }
- private bool CheckResponse(string responseString)
- {
- if (responseString == null)
- {
- return false;
- }
- else
- {
- if (responseString.StartsWith("+OK"))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- }
- //单击断开连接按钮触发的事件
- private void buttonDisconnect_Click(object sender, EventArgs e)
- {
- SendToServer("QUIT");
- sr.Close();
- sw.Close();
- networkStream.Close();
- tcpClient.Close();
- listBoxOperation.Items.Clear();
- richTextBoxOriginalMail.Clear();
- listBoxStatus.Items.Clear();
- groupBoxOperation.Text = "邮件信息";
- buttonConnect.Enabled = true;
- buttonDisconnect.Enabled = false;
- }
- //单击阅读信件按钮触发的事件
- private void buttonRead_Click(object sender, EventArgs e)
- {
- Cursor.Current = Cursors.WaitCursor;
- richTextBoxOriginalMail.Clear();
- string mailIndex = listBoxOperation.SelectedItem.ToString();
- mailIndex = mailIndex.Substring(, mailIndex.IndexOf("封") - );
- SendToServer("RETR " + mailIndex);
- string str = GetResponse();
- if (CheckResponse(str) == false) return;
- try
- {
- string receiveData = sr.ReadLine();
- if (receiveData.StartsWith("-ERR") == true)
- {
- listBoxStatus.Items.Add(receiveData);
- }
- else
- {
- while (receiveData != ".")
- {
- richTextBoxOriginalMail.AppendText(receiveData + "\r\n");
- receiveData = sr.ReadLine();
- }
- }
- }
- catch (InvalidOperationException err)
- {
- listBoxStatus.Items.Add("Error: " + err.ToString());
- }
- Cursor.Current = Cursors.Default;
- }
- private void DecodeMailHeader(string mail)
- {
- string header = "";
- int pos = mail.IndexOf("\n\n");
- if (pos == -)
- {
- header = GetDecodedHeader(mail);
- }
- else
- {
- header = mail.Substring(, pos + );
- }
- //richTextBoxDecode.AppendText(GetDecodedHeader(header));
- }
- private string GetDecodedHeader(string header)
- {
- StringBuilder s = new StringBuilder();
- s.AppendLine("Subject:" + GetEncodedValueString(header, "Subject: ", false));
- s.AppendLine("From:" + GetEncodedValueString(header, "From: ", false).Trim());
- s.AppendLine("To:" + GetEncodedValueString(header, "To: ", true).Trim());
- s.AppendLine("Date:" + GetDateTimeFromString(GetValueString(header, "Date: ", false, false)));
- s.AppendLine("Cc:" + GetEncodedValueString(header, "Cc: ", true).Trim());
- s.AppendLine("ContentType:" + GetValueString(header, "Content-Type: ", false, true));
- return s.ToString();
- }
- /// <summary>
- /// 把时间转成字符串形式
- /// </summary>
- /// <param name="DateTimeString"></param>
- /// <returns></returns>
- private string GetDateTimeFromString(string DateTimeString)
- {
- if (DateTimeString == "")
- {
- return null;
- }
- try
- {
- string strDateTime;
- if (DateTimeString.IndexOf("+") != -)
- {
- strDateTime = DateTimeString.Substring(, DateTimeString.IndexOf("+"));
- }
- else if (DateTimeString.IndexOf("-") != -)
- {
- strDateTime = DateTimeString.Substring(, DateTimeString.IndexOf("-"));
- }
- else
- {
- strDateTime = DateTimeString;
- }
- DateTime dt = DateTime.Parse(strDateTime);
- return dt.ToString();
- }
- catch
- {
- return null;
- }
- }
- private string GetEncodedValueString(string SourceString, string Key, bool SplitBySemicolon)
- {
- int j;
- string strValue;
- string strSource = SourceString.ToLower();
- string strReturn = "";
- j = strSource.IndexOf(Key.ToLower());
- if (j != -)
- {
- j += Key.Length;
- int kk = strSource.IndexOf("\n", j);
- strValue = SourceString.Substring(j, kk - j).TrimEnd();
- do
- {
- if (strValue.IndexOf("=?") != -)
- {
- if (SplitBySemicolon == true)
- {
- strReturn += ConvertStringEncodingFromBase64(strValue) + "; ";
- }
- else
- {
- strReturn += ConvertStringEncodingFromBase64(strValue);
- }
- }
- else
- {
- strReturn += strValue;
- }
- j += strValue.Length + ;
- if (strSource.IndexOf("\r\n", j) == -)
- {
- break;
- }
- else
- {
- strValue = SourceString.Substring(j, strSource.IndexOf("\r\n", j) - j).TrimEnd();
- }
- }
- while (strValue.StartsWith(" ") || strValue.StartsWith("\t"));
- }
- else
- {
- strReturn = "";
- }
- return strReturn;
- }
- private string GetValueString(string SourceString, string Key, bool ContainsQuotationMarks, bool ContainsSemicolon)
- {
- int j;
- string strReturn;
- string strSource = SourceString.ToLower();
- j = strSource.IndexOf(Key.ToLower());
- if (j != -)
- {
- j += Key.Length;
- strReturn = SourceString.Substring(j, strSource.IndexOf("\n", j) - j).TrimStart().TrimEnd();
- if (ContainsSemicolon == true)
- {
- if (strReturn.IndexOf(";") != -)
- {
- strReturn = strReturn.Substring(, strReturn.IndexOf(";"));
- }
- }
- if (ContainsQuotationMarks == true)
- {
- int i = strReturn.IndexOf("\"");
- int k;
- if (i != -)
- {
- k = strReturn.IndexOf("\"", i + );
- if (k != -)
- {
- strReturn = strReturn.Substring(i + , k - i - );
- }
- else
- {
- strReturn = strReturn.Substring(i + );
- }
- }
- }
- return strReturn;
- }
- else
- {
- return "";
- }
- }
- private string ConvertStringEncodingFromBase64(string SourceString)
- {
- try
- {
- if (SourceString.IndexOf("=?") == -)
- {
- return SourceString;
- }
- else
- {
- int i = SourceString.IndexOf("?");
- int j = SourceString.IndexOf("?", i + );
- int k = SourceString.IndexOf("?", j + );
- char chrTransEnc = SourceString[j + ];
- switch (chrTransEnc)
- {
- case 'B':
- return ConvertStringEncodingFromBase64Ex(SourceString.Substring(k + , SourceString.IndexOf("?", k + ) - k - ), SourceString.Substring(i + , j - i - ));
- default:
- throw new Exception("unhandled content transfer encoding");
- }
- }
- }
- catch
- {
- return "";
- }
- }
- /// <summary>
- /// 把Base64编码转换成字符串
- /// </summary>
- /// <param name="SourceString"></param>
- /// <param name="Charset"></param>
- /// <returns></returns>
- private string ConvertStringEncodingFromBase64Ex(string SourceString, string Charset)
- {
- try
- {
- Encoding enc;
- if (Charset == "")
- enc = Encoding.Default;
- else
- enc = Encoding.GetEncoding(Charset);
- return enc.GetString(Convert.FromBase64String(SourceString));
- }
- catch
- {
- return "";
- }
- }
- /// <summary>
- /// 把字符串转换成Base64Ex编码
- /// </summary>
- /// <param name="SourceString"></param>
- /// <param name="Charset"></param>
- /// <param name="AutoWordWrap"></param>
- /// <returns></returns>
- private string ConvertStringEncodingToBase64Ex(string SourceString, string Charset, bool AutoWordWrap)
- {
- Encoding enc = Encoding.GetEncoding(Charset);
- byte[] buffer = enc.GetBytes(SourceString);
- string strContent = Convert.ToBase64String(buffer);
- StringBuilder strTemp = new StringBuilder();
- int ii = ;
- for (int i = ; i <= strContent.Length / - ; i++)
- {
- strTemp.Append(strContent.Substring( * i, ) + "\r\n");
- ii++;
- }
- strTemp.Append(strContent.Substring( * (ii)));
- strContent = strTemp.ToString();
- return strContent;
- }
- private string ConvertStringEncoding(string SourceString, string Charset)
- {
- try
- {
- Encoding enc;
- if (Charset == "8bit" || Charset == "")
- {
- enc = Encoding.Default;
- }
- else
- {
- enc = Encoding.GetEncoding(Charset);
- }
- return enc.GetString(Encoding.ASCII.GetBytes(SourceString));
- }
- catch
- {
- return Encoding.Default.GetString(Encoding.ASCII.GetBytes(SourceString));
- }
- }
- //单击删除信件按钮触发的事件
- private void buttonDelete_Click(object sender, EventArgs e)
- {
- string parameter = listBoxOperation.SelectedItem.ToString();
- parameter = parameter.Substring(, parameter.IndexOf("封") - );
- SendToServer("DELE " + parameter);
- string str = GetResponse();
- if (CheckResponse(str) == false) return;
- richTextBoxOriginalMail.Clear();
- int j = listBoxOperation.SelectedIndex;
- listBoxOperation.Items.Remove(listBoxOperation.Items[j].ToString());
- MessageBox.Show("删除成功");
- }
- }
- }
C#开发邮件收发(同步)的更多相关文章
- 用SugarORM快速开发需要同步和保存大量数据的Android互联网客户端
最近开发的一个项目主要有两个特点,这两点也是在项目开发前需要着重去规划解决方案的: 需要和Rest服务端请求大量的数据 同时这些数据本地也要保存到sqlite数据库 对于第一点,目前的Volley.G ...
- Linux驱动开发5——同步机制
上一章讲到了并发,指的是多个进程同时存取临界区资源的处理机制.这一章讲的同步机制,讲的是多个进程之间协同工作的处理机制,如临界区数据还没有准备好,A进程负责准备数据,B进程等待A进程完成之后读取数据. ...
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...
- C#多线程开发-线程同步 02
上一篇文章主要带领大家认识了线程,也了解到了线程的基本用法和状态,接下来就让我们一起学习下什么是线程同步. 线程中异常的处理 在线程中始终使用try/catch代码块是非常重要的,因为不可能在线程代码 ...
- java开发常用jar包介绍(转载)
jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar ANother Tool for Language Recognition ...
- laravel下的团队开发
当你的团队在开发一个大型应用时,该应用的不同部分可能以不同的速度前进.比如,设想下面的场景:一个开发热源被分配 数据层 的backend工作,而另外一个开发人员做front-end和web/contr ...
- ios程序开发杂记
ios程序开发杂记 一.程序构建 与一般的程序构建无太大区别,都是源文件编译链接这一套,通常是在mac上做交叉编译,也就是利用xcode里带的ios编译工具集去生成arm架构的ios程序(或是x86的 ...
- .NET软件开发与常用工具清单
[工欲善其事,必先利其器]软件开发的第一步就是选择高效.智能的工具. 下面列出的工具软件能辅助提高工作效率. 开发类工具 微软.Net平台下的集成开发环境:Visual Studio. Visual ...
- ACE框架 同步原语设计
ACE框架常用的同步机制设计成统一的原语接口.同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现.ACE框架使用了外观模式和适配器分两层,将同步原语统一 ...
随机推荐
- paxos 练手 推进中
学习https://github.com/huoyu820125/SecondPaxos 自己编写网络版本 在学习过程将此代码的线程 锁等改成c++11 就不用包含那么多文件 主要更改如下 // M ...
- Vue 全家桶介绍
Vue有著名的全家桶系列,包含了vue-router(http://router.vuejs.org),vuex(http://vuex.vuejs.org), vue-resource(https: ...
- js 异步加载和同步加载
异步加载 异步加载也叫非阻塞模式加载,浏览器在下载js的同时,同时还会执行后续的页面处理.在script标签内,用js创建一个script元素并插入到document中,这种就是异步加载js文件了: ...
- 别人的Linux私房菜(2)Linux简介
同一操作系统无法在不同硬件平台上运行.架构. Bell实验室和麻省理工学院MIT和通用电气公司GE发起了Multics计划,分时兼容系统,300以上多终端连接主机. Unics 由Multics中的人 ...
- fastq-to-fasta转换及fasta拆分、合并
格式转换: use awk :awk 'BEGIN{P=1}{if(P==1||P==2){gsub(/^[@]/,">");print}; if(P==4)P=0; P++ ...
- jquery特殊字符转义方法
//特殊字符转义function escapeJquery(srcString) { // 转义之后的结果 var escapseResult = srcString; // javascript正则 ...
- 【转载】Impala和Hive的区别
Impala和Hive的关系 Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中.并且im ...
- myeclipse cannot connect to vm
启动tomcat时,tomcat可以直接运行,而debug时弹出 解决方法:打开360安全卫士的功能大全找到修复网络(LSP)点击立即修复就可以使用debug
- 学以致用十七-----shell脚本之比较数字和字符串及if else
非常需要注意的是shell脚本对空格要求非常严格, 如: 比较字符串 (不能用于比较字符串) 以上这种写法会报错 因此比较字符串不用 单中括号 [ ] -----------------有误 而是 ...
- struts1(一)流程分析