C # SMTP-код отправки электронной почты не работает для Yahoo Mail, но отлично работает для других серверов, кто-нибудь может помочь? - PullRequest
7 голосов
/ 23 февраля 2011

Я использую этот код для отправки электронной почты SMTP через SMTP-сервер Yahoo, я пишу для личного проекта.

using System.Net.Mail;
using System.Net;

SmtpClient theClient = new SmtpClient("smtp.mail.yahoo.com", 465);
theClient.UseDefaultCredentials = false;
theClient.Credentials = new NetworkCredential("username", "password");
theClient.EnableSsl = true;

MailMessage theMessage = new MailMessage("username@yahoo.com", 
                                         "to.someone@gmail.com");

theMessage.Subject = "Dave test from C# subject";
theMessage.Body = "Dave test from C# body";

theClient.Send(theMessage);

Это довольно стандартный код для отправки электронной почты SMTP, но ... сервер, похоже, выдает ошибку. Это принудительно разрывает соединение. Этого не происходит, если я использую другие SMTP-серверы, такие как Gmail, Windows Live или другие SMPp-серверы ISP.

Это исключение и трассировка стека:

System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at ConsoleApplication1.Program.Main(String[] args) in E:\dev\ARCSoftware.FTPProcessor\ConsoleApplication1\Program.cs:line 28

Я знаю, что проблема не в окружающей среде, поскольку я могу отправить на тот же сервер с этими точными настройками, используя Outlook Express. Мне интересно, если мне нужно отправить сертификат или что-то?

Если вы или кто-либо из ваших знакомых имеет какие-либо идеи по этому поводу, я был бы очень признателен за помощь.

Ответы [ 5 ]

6 голосов
/ 26 сентября 2011
using System.Net.Mail;
using System.Net;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Send_Click(object sender, RoutedEventArgs e)
    {
        MailMessage oMail = new MailMessage(new MailAddress("username@yahoo.com"), new MailAddress("username@yahoo.com"));
        SmtpClient oSmtp = new SmtpClient();
        oSmtp.Host = "smtp.mail.yahoo.com";
        oSmtp.Credentials = new NetworkCredential("username", "password");
        oSmtp.EnableSsl = false;
        oSmtp.Port = 587;
        oSmtp.Send(oMail);
    }
}
3 голосов
/ 23 февраля 2011

Это не поддерживается через 465, но в следующем посте подробно описан обходной путь

Как я могу отправлять электронные письма через SSL SMTP с помощью .NET Framework?

ОБНОВЛЕНИЕ:Эта ссылка подробно объясняет, почему он может работать через Outlook Express, но не через System.Net.Mail

http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx

2 голосов
/ 23 февраля 2011

Порт 465 не поддерживается System.Net.Mail.SmtpClient.

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl.aspx

Из раздела «Примечания»:

Этот метод подключенияиногда называется SMTP / SSL, SMTP через SSL или SMTPS и по умолчанию использует порт 465. Этот альтернативный метод подключения с использованием SSL в настоящее время не поддерживается.

Редактировать: вместо этого можно попробовать использовать порт 587 (если Yahoo это поддерживает).

0 голосов
/ 24 мая 2012

У меня была такая же проблема, пока я не установил порт на 587 и не отключил SSL.

0 голосов
/ 23 февраля 2011

Я думаю, вам следует вернуться к using System.Web.Mail, который позволяет вам контролировать поля, которые не доступны через более новую System.Net. Попробуйте поиграть с ними. Например, вы можете попробовать это: (использование задокументировано здесь , поля задокументированы здесь )

        MailMessage msg = new MailMessage();            
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "smtp.mail.yahoo.com");   
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");

        // try "2", I have not tested for yahoo mail
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");                                    
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "1");                        
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); // 0= anonymous - 1=basic - 2=NTLM
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "yahoousername");
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "yahoopwd");
...