本文简单介绍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;
}
一、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;
}
分类:
01 .NET 1.0 技术
, 05 WinForm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现