Я разрабатываю инструмент проверки электронной почты для клиента.Одной из функций, которую они запрашивают, является подтверждение наличия почтового ящика на почтовом сервере для проверяемого адреса электронной почты.Я реализовал протокол SMTP с использованием TCP-клиента в C #, однако, когда я пытаюсь выполнить команду MAIL FROM, я получаю сообщение об ошибке, говорящее, что я не аутентифицирован;это произошло при попытке проверить адрес электронной почты в GMail.
Я знаю, что это возможно, поскольку клиент предоставил ссылку на службу, которая делает нечто подобное (https://www.upwork.com/leaving?ref=https://verifalia.com/validate-email). Использование этого сайта, если явведите мои действительные адреса GMail, он возвращает правильную информацию (тот, который является действительным, а другой превышает квоту). Если я затем изменить одну букву адреса, он правильно сообщает, что почтовый ящик не существует. Я пытаюсь реализовать то же самоефункций, но на основании полученного сообщения об ошибке кажется, что мне нужно иметь учетную запись в Google.
Однако это не имеет смысла для меня. Как любой другой SMTP-сервер подключается к GMail(или, если уж на то пошло, любой другой SMTP-сервер) для доставки почты? У каждого сервера не может быть учетной записи на каждом другом сервере. Я просто пытаюсь заставить протокол SMTP работать до элемента DATA (так как я нехочу отправить фактическое письмо).
Любая информация или помощь будет принята с благодарностью. У меня есть incпохвалил мой текущий код ниже.Обратите внимание, что этот код в настоящее время не оптимизирован, и я планирую улучшить его, как только протокол заработает.Кроме того, адрес MAIL FROM, который я использовал, на самом деле не является примером test @ (я пытался использовать 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
}
}
}