SMTP RCPT TO Тестирование - PullRequest
       1

SMTP RCPT TO Тестирование

0 голосов
/ 17 ноября 2018

Я разрабатываю инструмент проверки электронной почты для клиента.Одной из функций, которую они запрашивают, является подтверждение наличия почтового ящика на почтовом сервере для проверяемого адреса электронной почты.Я реализовал протокол 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
                }
            }
        }

1 Ответ

0 голосов
/ 17 ноября 2018

Если вы посмотрите на принимающие серверы для 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.

Итак, измените сервер на тот, который фактически получает почту для данного домена, и повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...