您的位置:首页 > 其它

邮件发送功能

2015-08-17 11:14 218 查看
今天分享一个邮件发送的实例,使用的是Smtp服务,实例中使用到了网易的smtp服务器:smtp:163.com 和QQ的smtp服务器:smtp:qq.com,实现主要用到了微软的System.Net.Mail中提供的SmtpClient类和MailMessage类。

注意点:

我们要实现邮件发送,必须首先保证邮箱中的对应的服务是开启状态,下面以QQ邮箱为例,想要使用Smtp服务必须保证Smtp服务是开启的,看到QQ邮箱的服务设置,勾选上对应的服务即可,QQ默认是勾选上的,但也有些邮箱默认是不开启服务的。



页面端:

首先贴上页面图,设计页面,设置默认端口号为25,Smtp服务统一的端口号:




代码端:

首先是初始化代码:





1 //保存名称

2 private string fileName = "";

3 //文件操作

4 FileStream fs = null;

5

6 //设置Smtp协议

7 SmtpClient smtpClient = null;

8 //设置发信人地址 需要密码

9 MailAddress AddressFrom = null;

10 //设置收信人地址 不需要密码

11 MailAddress AddressTo = null;

12 //邮件信息

13 MailMessage Message = null;



页面载入代码,即Form_Load:





1 //页面载入

2 private void Form1_Load(object sender, EventArgs e)

3 {

4 //初始化下拉框

5 cmbHZ.SelectedIndex = 0;

6 cmbReceiveHZ.SelectedIndex = 0;

7 cmbSendHZ.SelectedIndex = 0;

8 cmbSmtp.SelectedIndex = 0;

9 }



页面载入时,主要是做一些初始化的工作,设定页面的下拉框为首项选中。

接下来是最重要的代码,邮件发送,即【发送】按钮代码:





1 //发送邮件

2 private void btnSend_Click(object sender, EventArgs e)

3 {

4 if (MessageBox.Show("您确定要发送当前邮件吗?", "发送提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)==DialogResult.Yes)

5 {

6 try

7 {

8 //设置Smtp服务器信息

9 SetSmtpClient("smtp." + cmbSmtp.Text + cmbHZ.Text, Convert.ToInt32(nudPort.Value));

10

11 }

12 catch (Exception err)

13 {

14 MessageBox.Show("邮件发送失败,请确定Smtp服务器名是否正确!"+"\n"+"技术信息:"+err.Message);

15 return;

16 }

17 try

18 {

19 if (tbPwd.Text == "")

20 {

21 MessageBox.Show("对不起,需要密码验证,请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

22 tbPwd.Focus();

23 return;

24 }

25

26 //设置发送地址信息

27 SetAddressFrom(tbSendEmail.Text.Trim() + cmbSendHZ.Text, tbPwd.Text);

28 }

29 catch (Exception)

30 {

31 MessageBox.Show("邮件发送失败,请确认发送邮箱地址和密码的正确性!");

32 return;

33 }

34

35 //message信息

36 Message = new MailMessage();

37

38 //发信人地址

39 Message.From = AddressFrom;

40 //收信人地址

41 AddressTo = new MailAddress(tbReceiveEmail.Text.Trim() + cmbReceiveHZ.Text);

42 //添加收信人地址

43 Message.To.Add(AddressTo);

44

45 //信息的主题

46 Message.Subject = tbTitle.Text;

47 //主题的编码方式

48 Message.SubjectEncoding = System.Text.Encoding.UTF8;

49

50 //邮件正文

51 Message.Body = tbContent.Text;

52 //邮件正文的编码

53 Message.BodyEncoding = System.Text.Encoding.UTF8;

54

55 //清除附件信息

56 Message.Attachments.Clear();

57 //添加附件

58 if (tbAttachment.Text != "")

59 {

60 Message.Attachments.Add(new Attachment(tbAttachment.Text.Trim()));

61 }

62 //发送

63 smtpClient.SendAsync(Message, "000000");

64 //发送完成回调函数

65 smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);

66

67 }

68 }



其中在该事件中还涉及到了SetSmtpClient()方法和SetAddressFrom()方法,在后面会讲解到。该事件主要实现了邮件的发送功能,但在邮件发送前需要对邮件的一些信息做一些配置,大致配置过程为:配置SmtpClient实例信息(服务器名,端口,超时等)-->>发件人信息验证(服务器验证,发件人地址,密码),使用Smtp服务时需要验证密码-->>配置MailMessage实例的信息(发件人地址,收件人地址,主题,正文,附件信息),同时指定编码方式-->>邮件发送回调函数(邮件发送成功事件),这就是这个事件代码执行的大致流程,同时在该事件中加入了一些逻辑判断,首先Smtp服务必须要有密码验证,所以必须使用户输入密码,然后是添加附件部分,我这里指定了附件的格式,即只允许将一定格式的文件作为附件,所以要对文件的格式做个判断,其次就是附件的大小,附件过大影响传送速度,所以限制了文件的大小在10M以内。

下面贴上发送邮件中使用到的方法代码,SetSmtpClient():





1 //设置Smtp服务器信息

2 private void SetSmtpClient(string serverHost, int Port)

3 {

4 smtpClient = new SmtpClient();

5 //指定Smtp服务名

6 //QQ:smtp.qq.com

7 //sina:smtp.sina.cn

8 smtpClient.Host = serverHost;

9 smtpClient.Port = Port;

10 smtpClient.Timeout = 0;

11 }



该方法主要实现对SmtpClient实例配置,指定其Host(服务器信息),Port(端口号),Timeout(超时)。

接着贴上SetAddressFrom()方法代码:





1 //验证发件人信息

2 private void SetAddressFrom(string mailAddress, string mailPwd)

3 {

4 //创建服务器验证

5 NetworkCredential networkCreadential_My = new NetworkCredential(mailAddress,mailPwd);

6 //实例化发件人地址

7 AddressFrom = new MailAddress(mailAddress,tbShowName.Text);

8 //指定发件人信息 邮箱地址和密码

9 smtpClient.Credentials = new NetworkCredential(AddressFrom.Address, mailPwd);

10

11 }





NetworkCredential 类是为基于密码的身份验证方案(如基本、简要、NTLM
和 Kerberos)提供凭据的基类.通过该类进行服务器验证,然后指定发件人的地址及密码,因为Smtp需要密码验证。

由于邮件实现了附件的发送,接下来是附件部分的代码,首先是选择附件即【...】按钮代码:





1 //选择附件

2 private void btn_SelectAttach_Click(object sender, EventArgs e)

3 {

4 //打开文件对话框

5 OpenFileDialog open = new OpenFileDialog();

6 if (open.ShowDialog() == DialogResult.OK)

7 {

8 //保存选择的文件名

9 fileName = open.SafeFileName;

10 tbAttachment.Text = open.SafeFileName;

11

12 }

13 }



该事件中主要用到了一个打开文件对话框,从而选择要附加的文件。

因为当选中了文件之后,需要显示些信息,必须文件大小啊,文件格式啊,是否添加成功啊...所以我添加了一个文本框内容变化事件(EditValueChanged),对这个方法可能你会陌生,其实只是由于用到了DXperience组件而已,所以对应的方法名也会有所改变了,先贴上该方法的代码:





1 //文本框变化事件

2 private void tbAttachment_EditValueChanged(object sender, EventArgs e)

3 {

4 //判断时候可以上传

5 if (CanAddAttachment(tbAttachment.Text))

6 {

7 //判断大小是否允许

8 if (CanAddSize(tbAttachment.Text))

9 {

10 lblState.Visible = true;

11 lblState.Text = "添加成功!";

12 }

13 else

14 {

15 MessageBox.Show("上传的文件过大!");

16 btnSend.Enabled = false;

17 return;

18 }

19 }

20 else

21 {

22 MessageBox.Show("不支持该格式的附件!");

23 btnSend.Enabled = false;

24 return;

25 }

26 }



可以发现,该方法中又有两个方法CanAddAttachment()方法和CanAddSize()方法,看方法名就知道一个用来判断是否可以添加该附件,一个是用来判断是否为允许大小。主要是这两个方法的调用,其他就是写逻辑判断,然后是打印出对应信息,比如邮件过大即弹出框提醒,添加成功即设置反馈信息为"添加成功"。

贴上这两个方法的代码,CanAddAttachment()方法:





1 //判断附件类型是否合法

2 private bool CanAddAttachment(string path)

3 {

4 //实例化文件操作对象

5 fs = new FileStream(path, FileMode.Open);

6 //设置允许添加的附件类型

7 string[] allowExtensions = new string[] { ".jpg", ".jpeg", ".doc", ".docx", ".txt", ".excel",".rar",".zip"};

8 //获取文件的后缀

9 string name = System.IO.Path.GetExtension(fs.Name);

10 for (int i = 0; i < allowExtensions.Length; i++)

11 {

12 if (name == allowExtensions[i])

13 {

14 return true;

15 }

16 }

17 fs.Flush();

18 fs.Close();

19 return false;

20 }



接着是CanAddSize()方法:





1 //获取文件大小

2 private bool CanAddSize(string path)

3 {

4 double size = Convert.ToDouble(fs.Length) / 1024.0 / 1024.0;

5 //设置最大为10M

6 if (size > 10)

7 {

8 return false;

9 }

10 fs.Flush();

11 fs.Close();

12 return true;

13 }



最后是邮件发送之后的回调函数,代码:



1 //回调函数

2 private void SendBack(object sender, AsyncCompletedEventArgs e)

3 {

4 MessageBox.Show("您的邮件已成功发送!","恭喜",MessageBoxButtons.OK,MessageBoxIcon.Information);

5 }

回调函数我写的很简单,就是弹出一个提示框,告知用户邮件发送成功。调用回调函数是在邮件发送代码中,即:

smtpClient.SendCompleted += new SendCompletedEventHandler(SendBack);



至此,该实例的界面,代码都讲解完了.......接下来看看运行效果吧......

首先运行(无附件)----填写信息:这里设置发送端为网易163邮箱,接收端为QQ邮箱



点击【发送】,没有问题,QQ邮箱提示有新邮件信息:




然后再看看带附件的邮箱发送效果,同样运行,然后点击【...】按钮选择附件信息,如图:




此时如果添加附件成功则有提示信息“添加成功”,说明此时的邮件已经带有了附件信息,然后同样点击【发送】按钮,这时QQ邮箱同样提示有新邮件信息,只不过这次的邮件是带附件邮件,如图:




那么点击邮件进去看看附件信息,如图:




没问题,就是我们刚才添加的"知识点笔记.doc"附件。

至此,这个邮件发送的实例讲解就到这为止了,欢迎大家扩展交流,,可以将其扩展成可以实现群发效果.........

转载:http://www.cnblogs.com/holyknight-zld/archive/2012/09/05/SendEmail.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: