Я разрабатываю инструмент проверки электронной почты для клиента. Одна из функций, которую они запрашивают, - это подтвердить, что на почтовом сервере существует почтовый ящик для проверяемого адреса электронной почты. Я реализовал протокол SMTP с помощью TCP-клиента на C#, однако, когда я пытаюсь выполнить команду 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:<[email protected]>\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
}
}
}





Если вы посмотрите на принимающие серверы для 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.
Поэтому измените сервер на тот, который действительно принимает почту для данного домена, и попробуйте еще раз.