我正在为客户开发电子邮件验证工具。他们要求的一项功能是确认邮件服务器上是否存在用于测试电子邮件地址的邮箱。我已经在C#中使用TCP客户端实现了SMTP协议,但是当我尝试发出MAIL FROM命令时,出现一条错误消息,提示我未通过身份验证;尝试在GMail上验证电子邮件地址时发生了这种情况。
我知道这应该可行,因为客户端提供了指向执行类似操作(https://www.upwork.com/leaving?ref=https://verifalia.com/validate-email)的服务的链接。使用该站点,如果我输入有效的GMail地址,它将返回正确的信息(一个有效,另一个超出配额)。如果我随后更改地址的一个字母,它会正确报告该邮箱不存在。我正在尝试实现相同的功能,但是根据错误消息,我似乎几乎需要在Google上拥有一个帐户。
但是,这对我来说没有意义。其他任何SMTP服务器如何连接到GMail(或其他任何SMTP服务器)以传递邮件?每台服务器不能在每台其他服务器上都有一个帐户。我只是想让SMTP协议处理DATA元素(因为我不想发送实际的电子邮件)。
任何信息或帮助将不胜感激。我在下面包括了我当前的代码。请注意,该代码目前尚未优化,一旦协议生效,我计划对其进行改进。另外,我一直使用的MAIL FROM地址实际上不是test @ example(我曾尝试使用GMail,AIM和其他地址,但都导致了相同的错误)。
using (var client = new TcpClient())
{
host = "smtp.gmail.com";
var port = 465;
client.Connect(host, port);
// as gmail requires ssl we should use sslstream
// if your smtp server doesn't support ssl you can
// work directly with the underlying stream
using (var stream = client.GetStream())
using (var sslstream = new SslStream(stream))
{
sslstream.AuthenticateAsClient(host);
using (var writer = new StreamWriter(sslstream))
using (var reader = new StreamReader(sslstream))
{
string read = "";
if (stream.DataAvailable)
{
read = reader.ReadLine();
}
if (!read.StartsWith("220"))
{
return false;
}
writer.WriteLine("EHLO " + host);
writer.Flush();
do
{
read = reader.ReadLine();
} while (read.StartsWith("250-"));
if (read.StartsWith("220") || read.StartsWith("250"))
{
writer.WriteLine("mail from:<test@example.com>\r\n");
writer.Flush();
read = reader.ReadLine();
if (read.StartsWith("530"))
{
do
{
read = reader.ReadLine();
} while (read.StartsWith("530-"));
}
if (read.StartsWith("250"))
{
writer.WriteLine("rcpt to:<" + _emailAddress + ">");
writer.Flush();
read = reader.ReadLine();
if (read.StartsWith("250"))
{
writer.WriteLine("quit");
writer.Flush();
read = reader.ReadLine();
if (read.StartsWith("221"))
{
return true;
}
}
else
{
writer.WriteLine("quit");
writer.Flush();
}
}
else
{
writer.WriteLine("quit");
writer.Flush();
}
}
else
{
writer.WriteLine("quit");
writer.Flush();
}
// gmail responds with: 220 mx.google.com esmtp
}
}
}
答案 0 :(得分:0)
如果您查看gmail.com的接收服务器,对我来说响应是
host -t mx gmail.com
gmail.com mail is handled by 30 alt3.gmail-smtp-in.l.google.com.
gmail.com mail is handled by 20 alt2.gmail-smtp-in.l.google.com.
gmail.com mail is handled by 5 gmail-smtp-in.l.google.com.
gmail.com mail is handled by 40 alt4.gmail-smtp-in.l.google.com.
gmail.com mail is handled by 10 alt1.gmail-smtp-in.l.google.com.
什么是smtp.gmail.com
host smtp.gmail.com
smtp.gmail.com is an alias for gmail-smtp-msa.l.google.com.
gmail-smtp-msa.l.google.com has address 108.177.127.109
gmail-smtp-msa.l.google.com has address 108.177.127.108
gmail-smtp-msa.l.google.com has IPv6 address 2a00:1450:4013:c00::6d
如您所见,它们不是同一回事。如果您想将邮件发送到gmail.com地址,则需要使用MX记录中定义的服务器。从名称中可以看到,名称中有一个“ gmail-smtp-in”,表明它们是用于接收电子邮件的。您正在使用的服务器用于通过Google服务器发送电子邮件。
因此将服务器更改为该域实际接收邮件的服务器,然后重试。