Blue Dream

记录成长的每一个脚印,写下漫长的程序人生
随笔 - 4, 文章 - 121, 评论 - 1, 阅读 - 89514
  首页  :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

C#编程发送邮件

Posted on   Dennis  阅读(474)  评论(0编辑  收藏  举报
本文简单介绍SMTP协议以及如何用C#编程实现EMAIL发送。

 

一、SMTP协议简介

1、  客户端通过服务器的25端口建立TCP/IP连接

服务器端: 220 server.com Simple Mail Transfer Service Ready

2、  客户端使用“HELO”命令标识发件人

客户端:HELO server.com

服务器端:250 server.com

3、  客户端发送MAIL命令,服务器端以OK作为响应表明准备接收

客户端: MAIL FROM: <A@B.com>

服务器端: 250 OK

4、  客户端发送RCPT命令标识收件人,服务器端回应是否愿意为收件人接受邮件

客户端:RCPT TO: <d@e.com>

服务器端:250 OK

5、  协商结束后用命令DATA发送发送邮件

客户端:DATA

服务器端:354 Start mail input: end with <CRLF>.<CRLF>

6、  客户端以.表示结束输入内容一起发送出去 

客户端:Subject:  <CRLF>

内容<CRLF>

.<CRLF>

7、客户端用QUIT命令退出。 

              客户端:QUIT

服务器端:250 server.com closing transmission channel

 

二、SMTP客户端程序代码:

1、  用VS.NET新建一个C#  WINDOWS应用程序项目,命名为SMTP。

2、  在窗体上添加控件:

一个按钮:设置属性name->btnsend;text->发送

六个标签:分别提示服务器地址、发件人、收件人、主题、内容以及发送记录

五个文本框:服务器地址txtsmtp、发件人txtfrom、收件人txtto、主题txtsub、内

容txtmsg对应相应的标签放置。

              一个列表框:lstlog

 

3、在程序开头添加以下名字空间:

       using System.Data;

using System.Net;

using System.Net.Sockets;

using System.IO;

 

 

 

       4、在 btnsend_Click 函数中添加代码

       private void btnsend_Click(object sender, System.EventArgs e)

{

                 // 将鼠标形状改为漏斗状

              Cursor cr = Cursor.Current;

              Cursor.Current = Cursors.WaitCursor;

              //定义变量

              string Data;

              byte[] szData;

              string CRLF = "\r\n";

              //创建与服务器25端口的连接

              TcpClient SmtpServ = new TcpClient(txtsmtp.Text,25);

              

              lstlog.Items.Clear();            

                   //显示服务器初始信息

                   NetworkStream NetStrm = SmtpServ.GetStream();

                   StreamReader  RdStrm= new StreamReader(SmtpServ.GetStream());

                   lstlog.Items.Add(RdStrm.ReadLine());

                   //标志发件人

                   Data = "HELO server " + CRLF;                  

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                   lstlog.Items.Add(RdStrm.ReadLine());

                   //标志发件人

                   Data = "MAIL FROM: " + "<" + txtfrom.Text + ">" + CRLF;

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                  lstlog.Items.Add(RdStrm.ReadLine(

                   // 标志收件人

                   Data = "RCPT TO: " + "<" + txtto.Text + ">" + CRLF;

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                   lstlog.Items.Add(RdStrm.ReadLine());

                   //准备发送内容

                   Data = "DATA " + CRLF;

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                   lstlog.Items.Add(RdStrm.ReadLine());               

                   //发送主题

                   Data = "SUBJECT: " + txtsub.Text + CRLF ;

                   //发送内容

                   Data = Data+ txtmsg.Text + CRLF ;

                   //结束发送

                   Data = Data+ "." + CRLF;

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                   lstlog.Items.Add(RdStrm.ReadLine());               

                   //退出

                   Data = "QUIT " + CRLF;

                   szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

                   NetStrm.Write(szData,0,szData.Length);

                   lstlog.Items.Add(RdStrm.ReadLine());               

                   //关闭连接

                   NetStrm.Close();

                   RdStrm.Close();

                   lstlog.Items.Add("连接关闭");

                   lstlog.Items.Add("发送成功");

 

                   //将鼠标恢复箭头状

                   Cursor.Current = cr;

              }

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示