1、使用TcpClient连接邮箱服务器
需要提供邮件服务器的域名,以及服务端口号
2、发送HELO命令
建立连接之后发送HELO命令,检验指定的服务器端口是否提供SMTP服务
3、验证身份
发送用户名和密码给到邮件服务器,验证身份是否合法
4、发送mail from命令
5、发送rcpt to命令,验证邮箱是否有效
public static List<string> GetNoValidEmailList(string[] emails)
{
var rst = new List<string>();
var ServerIp = Config.GetValue("ServerHost");
var Port = int.Parse(Config.GetValue("ServerPort"));
var mailUserName = Config.GetValue("UserName");
var mailPwd = "xxxxxx";
TcpClient client = new TcpClient();
try
{
client.Connect(ServerIp, Port);
StreamReader sr = new StreamReader(client.GetStream(), Encoding.Default);
var line = sr.ReadLine();
if (OperateStream(client, $"helo {MailServerIp}") != "250")
{
Console.WriteLine("HELO命令失败,本端口不提供SMTP服务");
return rst;
}
var bs = Encoding.Default.GetBytes($"\0{mailUserName}\0{mailPwd}");
var bs64 = Convert.ToBase64String(bs);
if (OperateStream(client, $"auth plain {bs64}") != "235")
{
Console.WriteLine("认证失败,用户信息不对");
return rst;
}
if (OperateStream(client, $"mail from:<{mailUserName}>") != "250")
{
Console.WriteLine("MAIL命令失败,请先验证身份");
return rst;
}
for (int i = 0; i < emails.Length; i++)
{
if (OperateStream(client, $"rcpt to:<{emails[i]}>") != "250")
{
rst.Add(emails[i]);
}
}
}
catch (Exception e)
{
throw e;
}
finally
{
OperateStream(client, "QUIT");
}
return rst;
}
private static string OperateStream(TcpClient client, string cmd)
{
cmd = cmd + "\r\n";
Stream tcpStream = client.GetStream();
byte[] bws = Encoding.Default.GetBytes(cmd.ToArray());
tcpStream.Write(bws, 0, bws.Length);
StreamReader sr = new StreamReader(client.GetStream(), Encoding.Default);
var line = sr.ReadLine();
var rst = string.Empty;
if (!string.IsNullOrEmpty(line) && line.Length >= 3)
rst = line.Substring(0, 3);
return rst;
}