Электронные письма не доставляются

Я использую библиотеку System.Net.Mail для отправки электронной почты через подключение к удаленному рабочему столу. Электронные письма отправляются правильно, если это адрес моей компании, но для всех остальных адресов электронные письма не отправляются. Я не получаю никаких исключений или ошибок, они просто никогда не доходят до адреса или не попадают в спам / нежелательную почту. Когда я синхронизирую свою папку «Отправленные», появляется электронное письмо.

Код, который я использую для отправки электронных писем, приведен ниже.

    var smtpClient = new System.Net.Mail.SmtpClient(hostName)
    {
        EnableSsl = false,
        DeliveryMethod = SmtpDeliveryMethod.Network
    };
    smtpClient.Credentials = new NetworkCredential(userName, password);
    smtpClient.SendAndSaveMessageToIMAP(mailMessage, hostName, port, userName, password, "INBOX.Sent");

и следующие

        static System.IO.StreamWriter sw = null;
        static System.Net.Sockets.TcpClient tcpc = null;
        static System.Net.Security.SslStream ssl = null;
        static string path;
        static int bytes = -1;
        static byte[] buffer;
        static System.Text.StringBuilder sb = new System.Text.StringBuilder();
        static byte[] dummy;
        private static readonly bool IsRunningInDotNetFourPointFive = SendMethod.GetParameters().Length == 3;

        private static readonly System.Reflection.BindingFlags Flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
        private static readonly System.Type MailWriter = typeof(System.Net.Mail.SmtpClient).Assembly.GetType("System.Net.Mail.MailWriter");
        private static readonly System.Reflection.ConstructorInfo MailWriterConstructor = MailWriter.GetConstructor(Flags, null, new[] { typeof(System.IO.Stream) }, null);
        private static readonly System.Reflection.MethodInfo CloseMethod = MailWriter.GetMethod("Close", Flags);
        private static readonly System.Reflection.MethodInfo SendMethod = typeof(System.Net.Mail.MailMessage).GetMethod("Send", Flags);

        public static void SendAndSaveMessageToIMAP(this System.Net.Mail.SmtpClient self, System.Net.Mail.MailMessage mailMessage, string imapServer, int imapPort, string userName, string password, string sentFolderName)
        {
            try
            {
                path = System.Environment.CurrentDirectory + "\\emailresponse.txt";

                if (System.IO.File.Exists(path))
                    System.IO.File.Delete(path);

                sw = new System.IO.StreamWriter(System.IO.File.Create(path));

                tcpc = new System.Net.Sockets.TcpClient(imapServer, imapPort);

                ssl = new System.Net.Security.SslStream(tcpc.GetStream());

                try
                {
                    ssl.AuthenticateAsClient(imapServer);
                }
                catch (Exception ex)
                {
                    throw;
                }

                SendCommandAndReceiveResponse("");

                SendCommandAndReceiveResponse(string.Format("$ LOGIN {1} {2}  {0}", System.Environment.NewLine, userName, password));

                using (var m = mailMessage.RawMessage())
                {
                    m.Position = 0;
                    var sr = new System.IO.StreamReader(m);
                    var myStr = sr.ReadToEnd();
                    SendCommandAndReceiveResponse(string.Format("$ APPEND {1} (\\Seen) {{{2}}}{0}", System.Environment.NewLine, sentFolderName, myStr.Length));
                    SendCommandAndReceiveResponse(string.Format("{1}{0}", System.Environment.NewLine, myStr));
                }
                SendCommandAndReceiveResponse(string.Format("$ LOGOUT{0}", System.Environment.NewLine));
            }
            catch (System.Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("error: " + ex.Message);
            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                    sw.Dispose();
                }
                if (ssl != null)
                {
                    ssl.Close();
                    ssl.Dispose();
                }
                if (tcpc != null)
                {
                    tcpc.Close();
                }
            }
            self.Send(mailMessage);
        }

        private static void SendCommandAndReceiveResponse(string command)
        {
            try
            {
                if (command != "")
                {
                    if (tcpc.Connected)
                    {
                        dummy = System.Text.Encoding.ASCII.GetBytes(command);
                        ssl.Write(dummy, 0, dummy.Length);
                    }
                    else
                    {
                        throw new System.ApplicationException("TCP CONNECTION DISCONNECTED");
                    }
                }
                ssl.Flush();

                buffer = new byte[2048];
                bytes = ssl.Read(buffer, 0, 2048);
                sb.Append(System.Text.Encoding.ASCII.GetString(buffer));

                sw.WriteLine(sb.ToString());
                sb = new System.Text.StringBuilder();
            }
            catch (System.Exception ex)
            {
                throw new System.ApplicationException(ex.Message);
            }
        }

        public static System.IO.MemoryStream RawMessage(this System.Net.Mail.MailMessage self)
        {
            var result = new System.IO.MemoryStream();
            var mailWriter = MailWriterConstructor.Invoke(new object[] { result });
            SendMethod.Invoke(self, Flags, null, IsRunningInDotNetFourPointFive ? new[] { mailWriter, true, true } : new[] { mailWriter, true }, null);
            result = new System.IO.MemoryStream(result.ToArray());
            CloseMethod.Invoke(mailWriter, Flags, null, new object[] { }, null);
            return result;
        }

Любая помощь будет высоко ценится.


person George Oik    schedule 15.04.2020    source источник
comment
или перейти в спам / спам, в почтовый ящик получателя или на сервер / исходящий?   -  person Lasse V. Karlsen    schedule 15.04.2020
comment
Спасибо за ответ. Я говорю о получателе. Если я отправлю электронное письмо со своей учетной записью A на мою учетную запись B через пульт дистанционного управления, с этим кодом оно появится в папке «Отправленные» в A, но нигде в почтовом ящике B. На самом деле я не знаю, как я могу проверить, заблокирован ли он сервером по какой-либо причине.   -  person George Oik    schedule 15.04.2020
comment
К сожалению, электронная почта - это очень громкая проблема, у вас нет инструментов, доступных вам, чтобы выяснить, действительно ли получатель получил сообщение (пока), или что оно не было помещено в папку спама на конец получателя. Что вам следует сделать, так это убедиться, что вы придерживаетесь стандартов электронной почты, таких как SPF, что снижает вероятность того, что программное обеспечение получателя автоматически пометит его как спам.   -  person Lasse V. Karlsen    schedule 15.04.2020
comment
Ваш код сохраняет сообщение в почтовом ящике, который называется INBOX.Sent. На самом деле он никому не отправляет сообщение, он просто сохраняет сообщение в почтовом ящике. Если вы хотите отправить его, вы должны использовать другое соединение, обычно подключаясь к порту 587 и вводя такие команды, как MAIL FROM: ‹[email protected]› и RCPT TO: ‹[email protected]›. У этого почтового ящика с названием «Отправлено» подозрительное имя, но сохранение сообщения в нем не делает предположение верным, это просто наводящее на размышление имя.   -  person arnt    schedule 15.04.2020
comment
Благодарю за ваш ответ. На самом деле существует self.Send (mailMessage); который пытается отправить почту. Но да, до этого я также пытаюсь добавить электронное письмо в мою папку «Отправленные», потому что по-другому оно не появится. Я попробую ваше предложение также отправить электронное письмо с помощью команд, спасибо!   -  person George Oik    schedule 16.04.2020