通信软件设Smtp邮件的发送与接收
信电院学
信息与电气工程学院
;学学年第二期,2012/2013
电程名 ,称 通信电件电电二电电目
电 目 , 电件电送电件
电电班电 , 通信工程 10-1
学生姓名 , 袁平
学号 , 100310111
指电电 ,教电湘 电电 任丹萍 国
电电周 ,数 周 1
电电成电 ,
年月日2013628
通信电件电电二电电目任电电
一、电目, 电件电送电件
二、班电, 信电院通信学 10-1
三、小电成电, 袁平 王敬 电思佳 强 争刘
四、起止电电, 第六期第十七周 学 2013-6-22~2012-6-28
1
信电院学
五、电电要求思路,与
要求能电方便地电电和电送电子电件~电有附件的电件电送至用电指定的电箱;可并将
以多,。通电电电掌握个学并System.Net.Mail 命名空电中相电的电;包括Attachment、MailAddress、MailMessage、SmtpClient等,的使用。
并考电不使用SmtpClient~而是直接使用TCP套接字~电程电电SMTP电电的客电端相电功能~最电电电电电电件的电送。
六、主要任电,
1、深入理解电子电件系电的成和构SMTP电电的工作原理~
2、电电掌握学并System.Net.Mail 命名空电中相电的电的使用~ 3、完成客电电送客电端电件的电电和电电~
4、按照
要求撰电电电告。写
学 生;电字,,
指电电;电字,,教
系 主 任;电字,, 院 电 ;电字,, 1、电程电电任电要求与
要求能电方便地电电和电送电子电件~电有附件的电件电送至用电指定的电箱;可以多,。并将个
通电电电掌握学并System.Net.Mail 命名空电中相电的电;包括Attachment、MailAddress、MailMessage、SmtpClient等,的使用。
并考电不使用SmtpClient~而是直接使用TCP套接字~电程电电SMTP电电的客电端相电功能~最电电电电电电件的电送。
;1,、深入理解电子电件系电的成和构SMTP电电的工作原理。
;2,、电电掌握学并System.Net.Mail 命名空电中相电的电的使用。 ;3,、完成客电电送客电端电件的电电和电电。
电件电电电体
2
信电院学
电子电件电称又电子信箱、电子电政是电用电子手段提供信息交电的通信方式。是称—它(E-mai1)
全球多电电上使用最普遍的一电服电。电电非交互式的通信网加速了信息的
及据电送数它—是,,个电易、快速的
。通电电接全世界的电电各电信的电送、接收、存电等电理号将电件送到世Internet,,界的各角落。个
2.1 电件分析
本电电电送程序采取了可电送电件服电器电接又可以直接接收电件服电器电接的方式电电电既与与来
子电件的电送。用电在“收件人电箱”所电电的电电中电入收件人的框地址~在“电件人电并Email箱”所电的电电中电入电信人的框地址~电电信件的正文;本例电可以电送附件~只要填写真Email
确径的路~就可以电送附件,~然后电电“电送”按电~便可完成电子电件的电送。电子电件电送成功~程序电出一“电送成功”的消息电电~若电子电件电送失电~程序电出失电的相电信息。将个框将
2.1.1电子电件系电成构
电子电件系电由用电代理;,以及电件电电代理;MUAMail User AgentMTAMail Transfer
,;,电件投电代理电成~指用于收电的程序~Agent,MDAMail Delivery AgentMUAMailMTA指自将来的信件电电电指定用电的程序~就是将接收的信件依照信件的流向MUAMDAMTA
;送到里,电信件放置到本机电电下的电件文件中;收件箱,~用电 哪将当从中电送一电份MUA 件电~电电件被电送送到会~而后在一系列中电电~直到到最电电送目电电止。 它达MTAMTA
2.1.2SMTP电电工作原理
电电是英文的电~意电电电电件电电电电~默电端口电写号。SMTP,Simple Mail Transfer Protocol25使用电送电件电~有电形式~一电是不使用客电端电电~客电端可使用匿名方式电送电件~两即SMTP
电电方式是一般的~一电要求客电端必电提供用电名和密电~电电方式电另称~或者叫SMTPESMTP电展。SMTP
客电端电送电子电件的电程是,先通电客电端电件~电件电送到将服电器~然后再由SMTPSMTP服电器其电送到目电将服电器。客电端电件通常是电用程序客电端电件或提供SMTPWindowsSMTP服电的公司提供的电用程序~电电用程序电电件客电电是服电器~但相电于来服电器WebWebSMTP来电电是客电端。
电于电件接收者电~接受电件电~首先通电来与电件服电器电接~的意思是电POP3SMTPPOP局电电~用于电子电件的接受。通电登电到服电器后~可以电指定的电件电行电除或是下电到本地。POP3
在中~电子电件有三部分电成~信封、首部和正文。SMTP
;,信封1
3
信电院学
信封包括电件收电者的电件地址~用两条命令指明。SMTP
? 电信人的地址~告电服电器电信人的地址。MAIL FROM:<>SMTP
? 收信人的地址~告电服电器收信人地址。RCPT TO:<>SMTP
;,首部2
首部中常用命令,
? ,姓名电件地址~
明电件电送者是电。FROM<><>
? ,姓名电件地址~表明电件接收者是电。TO<><>
? ,电件电电~表明电件的主电。SUBJECT<>
? ,电电~表明电电件的电电。DATE<>
? ,电件地址~表明电件的回电地址。REPLY-TO<>
? ,电件电型~表明电件包含文本、超文本和附件的些电型。哪Content-Type<>HTML
? ,电件电先电~表明电件的电送电先电。X-Priority<>
? ,版本~的意思是MIME-Version<>MIMEMultipurpose Internet Mail
~多用途即电件电展电准~电电电容的消息、附件及其他的电容定电了格式。它内内ExtensionsInternet
;,正文3
正文是电件的容。首部以一空行电束~再下内个面就是正文部分。;,电束符号4
电件以“电束。.”
2.1.3利用System.Net.Mail 命名空电中的SmtpClient电从的介电可以看出~电送和接受电件的部电电电程电是内从比电电电的~如果全部底电电行电STMP
程~需要考电的电电就比电多。因此在框架的命名空电中提供了电电电电件.NET2.0System.NET.Mail
电行电理的电~而使电件的电送电从得非常电电。
电于行在有电用电件服电器的运没数大多客电程序而言~向服电器电送电件需要提供用电SMTP
名和密电~服电器电电成功后~才能电行电件的电送或接受。因此在电用程序中电送电件~需要使用下
面几个电,
;,命名空电下的电1System.NetNetworkCredential电电用于提供客电端身份凭电电机制的据。其中包括电准身份电电方法;基本、电要、电商、Internet
和身份个电电,以及可以电建的自定电方法。在电件电送中~我电需要使用电电向NTLMKerberos
服电器提供所需要的用电名和密电~用法电,STMP
电件人电件地址”密电”~NetworkCredential myCredentials=new NetworkCredential(“,“);,命名空电下的电2System.Net.MailMailAddress
4
信电院学电电用于提供电件人和收件人的电件地址~常用格式电,
;“电件人电件地址”,~MailAddress from=new MailAddress
;“收件人电件地址”,~MailAddress to=newMailAddress
;,命名空电下的电3System.Net.MailMailMessage
电电用于提供电件的信息~包括主电、容、附件和信息电型等~常用形式电,内
;~,~MailMessage message=new MailMessagefromto
主电”message.Subject=”;
message.SubjectEncoding=System.Text.Encoding.UTF8;
电件容”内message.Body=”;
message.BodyEncoding=System.Text.Encoding.UTF8;
命名空电下的电(4)System.Net.MailAttachment
电电用于提供附件电象~常用形式电,
;“文件名”,~Attachment attachFile=new Attachment
;,~message.Attchment.AddattachFile
;,电5SmtpClient
电电用于电送电件~常用形式电,
;“电件服电器地址”,~SmtpClient client=new SmtpClientClient.Send(message);
2.2 电件电电
本电电是利用电用程序~电电电送电件的功能~来达利用正电表式电电用电电入的信息~Windows
当将电入的信息符合要求电~才允电电件电送到电件服电器。
电建一名电个的电用程序~将改名电SendMailExampleWindowsForm1.cs
~电电界面如电来表示,FormSendMail.cs2
5
信电院学
电电送口窗2
电件电件系电电电流程电,2.3
6
信电院学
电始
点电电送
提示电电
N电入是否符合有
效,
Y
电始电送
N
成功了电,N
Y
提示,成功提示,失电电完了没,
Y
电束
7
信电院学2.4 程序电电
电送口的窗体整程序电电如下,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Mail;
namespace WindowsFormsApplication1
{
public partial class FromSendMail : Form
{
public FromSendMail()
{
InitializeComponent();
}
//电件人改电电电触
private void textBoxUserName_TextChanged(object sender, EventArgs e)
{
//要求电足电子电件的格式
labelUserName.Visible = !Regex.IsMatch(textBoxUserName.Text, @"^\w+([-+.']\w+)*@\w+
([-.]\w+)*\.com*$");
}
// 密电改电电电触
private void textBoxPassWord_TextChanged(object sender, EventArgs e)
{
//要求电足5~20个数英文字母或者字的电合
labelPassword.Visible = !Regex.IsMatch(textBoxPassword.Text, @"^\w{5,20}$");
}
//收件人地址改电电电触
private void textBoxReceive_TextChanged(object sender, EventArgs e)
{
//要求电足电子电件的格式
labelReceive.Visible = !Regex.IsMatch(textBoxUserName.Text, @"^\w+([-+.']\w+)*@\w+
([-.]\w+)*\.com*$");
8
信电院学
}
//主电改电电电触
private void textBoxSubject_TextChanged(object sender, EventArgs e)
{
//不能电空
labelSubject.Visible = !Regex.IsMatch(textBoxSubject.Text, @"^.{1,}$");
}
//电送容内触改电电电
private void textBoxBody_TextChanged(object sender, EventArgs e)
{
//不能电空
labelBody.Visible = !Regex.IsMatch(textBoxBody.Text, @"^.{1,}$");
}
private void buttonSend_Click(object sender, EventArgs e)
{
string invalidString = "";
if (labelUserName.Visible == true) invalidString += "用电名、";
if (labelPassword.Visible == true) invalidString += "密电、";
if (labelReceive.Visible == true) invalidString += "收件人、";
if (labelSubject.Visible == true) invalidString += "主电、";
if (labelBody.Visible == true) invalidString += "电件容、内";
if (invalidString.Length > 0)
{
MessageBox.Show(invalidString.TrimEnd('、') + "不能电空或者有不符合电定的容内");
}
else
{
//电件人和收件人的地址
///String[] toes = textBoxReceive.Text.Trim().Split(';');
MailAddress from = new MailAddress(textBoxUserName.Text);
MailAddress to = new MailAddress(textBoxReceive.Text);
MailMessage msg = new MailMessage(from, to);
MailAddressCollection mac = msg.To;
//for (Int32 i = 1; i < toes.Length; i++)
//{
// mac.Add(toes[i]);
//}
//电件主电、容内
MailMessage message = new MailMessage(from, to);
message.Subject = textBoxSubject.Text;
message.SubjectEncoding = System.Text.Encoding.UTF8;
9
信电院学
message.Body = textBoxBody.Text;
message.BodyEncoding = System.Text.Encoding.UTF8;
//添加附件
if (listBox.Items.Count > 0)
{
for (int i = 0; i < listBox.Items.Count; i++)
{
Attachment attachFile = new Attachment(listBox.Items[i].ToString());
message.Attachments.Add(attachFile);
}
}
try
{
//大部分电件服电器均加smtp.前电
SmtpClient client = new SmtpClient("smtp." + from.Host);
SendMail(client, from, textBoxPassword.Text, to, message);
MessageBox.Show("电件电送成功");
}
catch (SmtpException err)
{
//如果电电原因是有到服电器~电电电不加没找smtp.前电的服电器
if (err.StatusCode == SmtpStatusCode.GeneralFailure)
{
try
{
//有些电件服电器不加smtp.前电
SmtpClient client = new SmtpClient(from.Host);
SendMail(client, from, textBoxPassword.Text, to, message);
MessageBox.Show("电件电送成功");
}
catch (SmtpException err1)
{
MessageBox.Show(err1.Message, "电送失电");
}
}
else
{
MessageBox.Show(err.Message, "电送失电");
}
}
}
}
//根据指定的电送电件参数
10
信电院学
private void SendMail(SmtpClient client, MailAddress from, string password, MailAddress to,
MailMessage message)
{
//不使用默电电~凭注意此句必电放在client.Credentials是上面
client.UseDefaultCredentials = false;
//指定用电名、密电
client.Credentials = new NetworkCredential(from.Address, password);
//电件通电电电送到服电器网
client.DeliveryMethod = SmtpDeliveryMethod.Network;
try
{
client.Send(message);
}
catch
{
throw;
}
finally
{
//及电电放占用的电源
message.Dispose();
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
OpenFileDialog myOpenFileDialog = new OpenFileDialog();
myOpenFileDialog.CheckFileExists = true;
//只接受有效的文件名
myOpenFileDialog.ValidateNames = true;
//允电依次电电多文件作电附件个
myOpenFileDialog.Multiselect = true;
myOpenFileDialog.ShowDialog();
if (myOpenFileDialog.FileName.Length > 0)
{
listBox.Items.AddRange(myOpenFileDialog.FileNames);
}
}
private void buttonExit_Click(object sender, EventArgs e)
{
Application.Exit();
11
信电院学
}
private void buttonAddFile_Click(object sender, EventArgs e)
{
OpenFileDialog myOpenFileDialog = new OpenFileDialog();
myOpenFileDialog.CheckFileExists = true;
//只接受有效的文件名
myOpenFileDialog.ValidateNames = true;
//允电依次电电多文件作电附件个
myOpenFileDialog.Multiselect = true;
myOpenFileDialog.ShowDialog();
if (myOpenFileDialog.FileName.Length > 0)
{
listBox.Items.AddRange(myOpenFileDialog.FileNames);
}
}
private void buttonAddFile_Click_1(object sender, EventArgs e)
{
OpenFileDialog myOpenFileDialog = new OpenFileDialog();
myOpenFileDialog.CheckFileExists = true;
//只接受有效的文件名
myOpenFileDialog.ValidateNames = true;
//允电依次电电多文件作电附件个
myOpenFileDialog.Multiselect = true;
myOpenFileDialog.ShowDialog();
if (myOpenFileDialog.FileName.Length > 0)
{
listBox.Items.AddRange(myOpenFileDialog.FileNames);
}
}
private void buttonSend_Click_1(object sender, EventArgs e)
{
string invalidString = "";
if (labelUserName.Visible == true) invalidString += "用电名、";
if (labelPassword.Visible == true) invalidString += "口令、";
if (labelReceive.Visible == true) invalidString += "收件人、";
if (labelSubject.Visible == true) invalidString += "主电、";
if (labelBody.Visible == true) invalidString += "电件容、内";
if (invalidString.Length > 0)
{
12
信电院学
MessageBox.Show(invalidString.TrimEnd('、') + "不能电空或者有不符合电定的容内");
}
else
{
//电件人和收件人的地址
///String[] toes = textBoxReceive.Text.Trim().Split(';');
MailAddress from = new MailAddress(textBoxUserName.Text);
MailAddress to = new MailAddress(textBoxReceive.Text);
MailMessage msg = new MailMessage(from, to);
MailAddressCollection mac = msg.To;
//for (Int32 i = 1; i < toes.Length; i++)
//{
// mac.Add(toes[i]);
//}
//电件主电、容内
MailMessage message = new MailMessage(from, to);
message.Subject = textBoxSubject.Text;
message.SubjectEncoding = System.Text.Encoding.UTF8;
message.Body = textBoxBody.Text;
message.BodyEncoding = System.Text.Encoding.UTF8;
//添加附件
if (listBox.Items.Count > 0)
{
for (int i = 0; i < listBox.Items.Count; i++)
{
Attachment attachFile = new Attachment(listBox.Items[i].ToString());
message.Attachments.Add(attachFile);
}
}
try
{
//大部分电件服电器均加smtp.前电
SmtpClient client = new SmtpClient("smtp." + from.Host);
SendMail( client, from, textBoxPassword.Text, to, message);
MessageBox.Show("电件电送成功");
}
catch (SmtpException err)
{
//如果电电原因是有到服电器~电电电不加没找smtp.前电的服电器
if (err.StatusCode == SmtpStatusCode.GeneralFailure)
{
try
{
13
信电院学
//有些电件服电器不加smtp.前电
SmtpClient client = new SmtpClient(from.Host);
SendMail(client, from, textBoxPassword.Text, to, message);
MessageBox.Show("电件电送成功");
}
catch (SmtpException err1)
{
MessageBox.Show(err1.Message, "电送失电");
}
}
else
{
MessageBox.Show(err.Message, "电送失电");
}
}
}
}
private void buttonExit_Click_1(object sender, EventArgs e)
{
Application.Exit();
}
private void FromSendMail_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
2.5程序电电
2.5.1电送电件中的口~窗如下电3表示,
14
信电院学
电电送电件中的口窗3
2.5.2电送电件失电的口~窗如下电4所示,
15
信电院学2.5.3电送电件成功的口~窗如下电所示,
电电送电件成功的口窗5
16
信电院学
电登电接收电件6
电附件7
3、电程电电出电的电电
电电 不到电型或命名空电名“找称是否缺少 指令或程序集引用3.1SendMail”(using )
17
信电院学解方法,决个窗并即并重新建立一口~把代电电制一遍可~不是代电电电~只是由于VS2008本身电件电电~完全相同的代电也有可能出电电电~重启即可。
3.2 电电 电件口中代电窗labelUserName.Visible=!
Regex.IsMatch(textBoxUserName.Text,@"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");改电labelUserName.Visible = !Regex.IsMatch(textBoxUserName.Text, @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.com*$");中的com
即可电*电电com后消失
3.3 电电 电件电送口中窗*不消失如电
修改,将labelUserName中TextChange属性改电textBoxUserName_TextChanged~相同的~将labelPassword中TextChange属性改电textBoxPassword_TextChanged,将labelReceive中TextChange属性改电textBoxReceive_TextChanged.
4、电电电电
电周的电程电电是将学很去年的电电完善一下~是电漏电缺的一次电电~但由于我电不精~多方法都不电得了~通电重新电看电小电老电的Windows电电电电电电出了电件~但是我电的电电有没太多功能上的完善~只是把电件电送的一电一完成了~另个没外附件添加多也完成了。大家有弄出用tcp套接字的方式电送电件~是电很真学憾。但任电电上的要求我电电是电的电了解了。电在回电电想感电自己的知电的不电~学很扎会学真践也不以致用。有电电到用电方恨少的感电~是电古人的至理名言了~可惜不是好的方面。此次我电做的电电电是最电电的一电~电存在多不它很足~比如系电比电电电~系电的电形操作很它它缺乏~需要美化~需要人性化~电电的功能也不完善。电之~要想电电完善~使达断断学断研它到更好的水平~需要电电者不的电充知电~不的电~不的究~才能逐步电于完美~俗电电得好,慢工出电活。心急吃不了电豆腐等等~都是要求我电做事电不要急功近利~要下塌心来个献慢慢做~要耐的住寂寞~那电得电电电电的大家都是在成名前电电了默默奉~默默耕耘~才
18
信电院学电的今日的电煌。我电年电一代更电如此~虚学心电。
4、考文参献
[1] Douglas E Comer 著,林瑶电.用TCP/IP电行电互电 国[M],北京,电子工电出版社~1998,全电
[2] Jonathan B Postel著.SMPLEMAL TRANSFER PROTOCOL[S],RFC821,1982:全电[3]T H H ildebrandt,W L in Optical Recognition of Handritten Chinese Characers: Pattern Recognition Advances Since,1980,26(2):205~225
电程电电
电 电
电程电电指电电教
成 电;电字, 年 月 日
19
信电院学
20