邮件发送(附源码)

   今天分享一个邮件发送的实例,使用的是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:

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():

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()方法代码:

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组件而已,所以对应的方法名也会有所改变了,先贴上该方法的代码:

EditValueChanged
 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()方法:

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()方法:

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"附件。


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

 

 

 

 

 

posted @ 2012-09-05 09:31  HolyKnight  阅读(9146)  评论(20编辑  收藏  举报