邮件发送(附源码)

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

注意点:

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


页面端:

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

 


代码端:

首先是初始化代码:

ExpandedBlockStart.gif 初始化
 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:

ExpandedBlockStart.gif 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         }

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

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

ExpandedBlockStart.gif 发送邮件
 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():

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

ExpandedBlockStart.gif 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需要密码验证。

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

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

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

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

ExpandedBlockStart.gif 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         }

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

ExpandedBlockStart.gif 回调函数
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"附件。


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

 

 

 

 

 

转载于:https://www.cnblogs.com/holyknight-zld/archive/2012/09/05/SendEmail.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Winfrom 发邮件源码的实现步骤如下: 1. 添加引用SmtpSender.dll和Newtonsoft.Json.dll; 2. 在窗体添加邮件标题、收件人、发件人、件等控件,并添加相应的代码实现邮件发送功能; 3. 在代码创建邮件对象MailMessage,设置发件人、收件人、主题、正文、件等内容; 4. 创建SmtpClient对象,设置STMP服务器、用户名和密码等参数; 5. 调用SmtpClient的Send方法发送邮件,根据返回结果判断邮件是否发送成功。 以下是一个简单的Winform发送邮件源码示例: ```c# using System; using System.Net; using System.Net.Mail; using Newtonsoft.Json; using SmtpSender; namespace WinformMailSender { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnSend_Click(object sender, EventArgs e) { try { // 创建邮件对象 MailMessage message = new MailMessage(); message.From = new MailAddress(txtFrom.Text.Trim()); message.To.Add(txtTo.Text.Trim()); message.Subject = txtSubject.Text.Trim(); message.Body = txtBody.Text.Trim(); if (!string.IsNullOrEmpty(txtAttachment.Text.Trim())) { Attachment attachment = new Attachment(txtAttachment.Text.Trim()); message.Attachments.Add(attachment); } // 发送邮件 SmtpClient client = new SmtpClient(); client.Host = txtServer.Text.Trim(); client.Port = int.Parse(txtPort.Text.Trim()); client.EnableSsl = true; client.Credentials = new NetworkCredential(txtUsername.Text.Trim(), txtPassword.Text.Trim()); client.Send(message); // 发送成功 MessageBox.Show("邮件发送成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { // 发送失败 MessageBox.Show("邮件发送失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnAttachment_Click(object sender, EventArgs e) { // 选择件 OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) { txtAttachment.Text = openFileDialog.FileName; } } private void btnCancel_Click(object sender, EventArgs e) { // 取消发送 this.Close(); } } } ``` 以上代码使用了SmtpSender工具库简化了邮件发送过程。使用时需要先在NuGet搜索并安装SmtpSender和Newtonsoft.Json两个库,然后在代码添加`using SmtpSender;`和`using Newtonsoft.Json;`即可。值得注意的是,代码涉及的控件和变量名均需要根据实际情况更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值