邮件发送(附源码)

   今天分享一个邮件发送的实例,使用的是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
    评论
以下是一个简单的PHP脚本,可以使用SMTP协议批量发送邮件: ```php <?php // 邮件发送函数 function sendMail($to, $subject, $body) { $host = 'smtp.example.com'; // SMTP服务器地址 $username = 'your_username'; // SMTP用户名 $password = 'your_password'; // SMTP密码 $headers = array( 'From' => 'your_email@example.com', 'To' => $to, 'Subject' => $subject, 'Content-Type' => 'text/html; charset=UTF-8' ); $smtp = new SMTP($host, 25); // 创建SMTP对象 $smtp->setAuth($username, $password); // 设置SMTP认证信息 $smtp->setHeaders($headers); // 设置邮件头 $smtp->setBody($body); // 设置邮件内容 return $smtp->send(); // 发送邮件 } // 要发送的邮件列表 $emails = array('email1@example.com', 'email2@example.com', 'email3@example.com'); // 发送邮件的循环 foreach ($emails as $email) { $result = sendMail($email, '邮件主题', '邮件内容'); if ($result) { echo '邮件发送成功:' . $email . '<br>'; } else { echo '邮件发送失败:' . $email . '<br>'; } } ?> ``` 这个脚本使用了一个名为SMTP的自定义类,需要先定义这个类。以下是SMTP类的代码: ```php class SMTP { private $host; // SMTP服务器地址 private $port; // SMTP服务器端口 private $username; // SMTP用户名 private $password; // SMTP密码 private $headers; // 邮件头 private $body; // 邮件内容 public function __construct($host, $port) { $this->host = $host; $this->port = $port; } public function setAuth($username, $password) { $this->username = $username; $this->password = $password; } public function setHeaders($headers) { $this->headers = $headers; } public function setBody($body) { $this->body = $body; } public function send() { $socket = fsockopen($this->host, $this->port, $errno, $errstr); if (!$socket) { return false; } // 建立连接 $response = fgets($socket); if (substr($response, 0, 3) != '220') { return false; } fputs($socket, "EHLO " . $this->host . "\r\n"); while ($response = fgets($socket)) { if (substr($response, 3, 1) != '-') { break; } } if (substr($response, 0, 3) != '250') { return false; } // 身份认证 fputs($socket, "AUTH LOGIN\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '334') { return false; } fputs($socket, base64_encode($this->username) . "\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '334') { return false; } fputs($socket, base64_encode($this->password) . "\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '235') { return false; } // 设置邮件头和内容 $headers = ''; foreach ($this->headers as $key => $value) { $headers .= $key . ': ' . $value . "\r\n"; } $headers .= "\r\n" . $this->body . "\r\n"; // 发送邮件 fputs($socket, "MAIL FROM: <" . $this->headers['From'] . ">\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '250') { return false; } fputs($socket, "RCPT TO: <" . $this->headers['To'] . ">\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '250') { return false; } fputs($socket, "DATA\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '354') { return false; } fputs($socket, $headers . "\r\n.\r\n"); $response = fgets($socket); if (substr($response, 0, 3) != '250') { return false; } // 关闭连接 fputs($socket, "QUIT\r\n"); fclose($socket); return true; } } ``` 请注意,这个脚本只是一个例子,需要根据实际情况进行修改和调整。特别是SMTP服务器的设置,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值