2009-07-04 5 views
10

J'ai essayé de tout savoir sur ce point, et jusqu'à présent, j'ai échoué lamentablement. Ma tentative la plus récente a été levée de ce code de pile ici: Sending email through Gmail SMTP server with C#, mais j'ai essayé toute la syntaxe que j'ai pu trouver ici sur la pile et ailleurs. Mon code est actuellement:GMail SMTP via des erreurs C# .Net sur tous les ports

var client = new SmtpClient("smtp.gmail.com", 587) 
{ 
    Credentials = new NetworkCredential("[email protected]", "mypass"), 
    EnableSsl = true 
}; 

client.Send("[email protected]","[email protected]","Test", "test message"); 

Courir ce code me donne une exception immédiate « Le non l'envoi du courrier » qui a un innerexeption « incapable de se connecter au serveur distant ».

Si je change le port en 465 (comme le suggèrent les documents Gmail), j'obtiens un timeout à chaque fois. J'ai lu que 465 n'est pas un bon port à utiliser, donc je me demande ce que l'affaire est w/587 me donnant l'échec de se connecter. Mon utilisateur et mon laissez-passer ont raison. J'ai lu que je devais installer le service POP sur mon compte Gmail, c'est ce que j'ai fait. Pas de résultat J'ai d'abord essayé de faire fonctionner cela pour mon compte GMail, mais après avoir rencontré les mêmes problèmes que pensé aller avec mon compte Gmail régulier serait plus facile ... jusqu'à présent, ce n'est pas le Cas.

+0

Pouvez-vous vous connecter via un client de messagerie standard? Sinon, cela pourrait être un problème avec votre pare-feu. Avez-vous activé l'accès POP dans votre compte? – MiffTheFox

+0

Oui, je peux, et oui je l'ai fait. – Paul

Répondre

14

J'ai essayé votre code, et il fonctionne prefectly avec le port 587, mais pas avec 465.

Avez-vous vérifié le mur coupe-feu? Essayez à partir de la ligne de commande "Telnet smtp.gmail.com 587" Si vous obtenez "220 mx.google.com ESMTP ....", le port est ouvert. Sinon, c'est quelque chose qui vous bloque.

Daniel

+0

merci, c'était exactement ça. J'avais mis la règle dans mon pare-feu pour laisser passer le port 587, et mon client de messagerie n'avait aucun problème à l'utiliser, mais mon système audio-visuel était suspect de mon application de test de console, pensant qu'il s'agissait d'un ver. – Paul

+0

bonjour, j'ai essayé ce test dans telnet, ça a marché (j'ai eu 220 mx.google.com ESMTP), mais quand j'essaye d'envoyer du courrier en utilisant l'application .net 2.0, je reçois 'le serveur ne supporte pas les connexions sécurisées. ce qui cause le problème – Smith

9

I mis en œuvre un client de messagerie qui pourrait parfois en arrière parler à la fois gmail 587 et 465 ...

port 25 est le port pop sans chiffrement; non disponible sur gmail.

Les deux autres ports ont un cryptage; 587 utilise TLS, 465 utilise SSL.

Pour utiliser 587, vous devez définir SmtpClient.EnableSsl = true.

465 ne fonctionnera pas avec SmtpClient, il fonctionnera plutôt avec la classe obsolète SmtpMail.

+0

comme mentionné, j'avais déjà EnableSsl = true, voir mon code. – Paul

+0

@ utilisateur133243 Merci pour cette information – prabhakaran

1

Votre pare-feu de réseau privé bloqué les ports 587 et 465. Vous pouvez utiliser le port 25 par défaut ou activer là ports sur le firewall

15

j'ai couru à ce problème il y a un moment aussi. Le problème est que SmtpClient ne prend pas en charge les connexions SSL implicites, mais prend en charge les connexions explicites (System.Net.Mail with SSL to authenticate against port 465). La classe précédente de MailMessage (je crois que .Net 1.0) a supporté ceci mais a été longtemps obsolète.

Ma réponse a été d'appeler les CDO (Collaborative Data Objects) (http://support.microsoft.com/kb/310212) directement par COM en utilisant quelque chose comme ce qui suit:

/// <summary> 
    /// Send an electronic message using the Collaboration Data Objects (CDO). 
    /// </summary> 
    /// <remarks>http://support.microsoft.com/kb/310212</remarks> 
    private void SendTestCDOMessage() 
    { 
     try 
     { 
      string yourEmail = "[email protected]"; 

      CDO.Message message = new CDO.Message(); 
      CDO.IConfiguration configuration = message.Configuration; 
      ADODB.Fields fields = configuration.Fields; 

      Console.WriteLine(String.Format("Configuring CDO settings...")); 

      // Set configuration. 
      // sendusing:    cdoSendUsingPort, value 2, for sending the message using the network. 
      // smtpauthenticate:  Specifies the mechanism used when authenticating to an SMTP service over the network. 
      //         Possible values are: 
      //         - cdoAnonymous, value 0. Do not authenticate. 
      //         - cdoBasic, value 1. Use basic clear-text authentication. (Hint: This requires the use of "sendusername" and "sendpassword" fields) 
      //         - cdoNTLM, value 2. The current process security context is used to authenticate with the service. 

      ADODB.Field field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"]; 
      field.Value = "smtp.gmail.com"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]; 
      field.Value = 465; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusing"]; 
      field.Value = CDO.CdoSendUsing.cdoSendUsingPort; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]; 
      field.Value = CDO.CdoProtocolsAuthentication.cdoBasic; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusername"]; 
      field.Value = yourEmail; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"]; 
      field.Value = "YourPassword"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"]; 
      field.Value = "true"; 

      fields.Update(); 

      Console.WriteLine(String.Format("Building CDO Message...")); 

      message.From = yourEmail; 
      message.To = yourEmail; 
      message.Subject = "Test message."; 
      message.TextBody = "This is a test message. Please disregard."; 

      Console.WriteLine(String.Format("Attempting to connect to remote server...")); 

      // Send message. 
      message.Send(); 

      Console.WriteLine("Message sent."); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

Ne pas oublier de parcourir vos références COM et ajoutez le « CDO Microsoft pour Windows 200 Library "qui devrait ajouter deux références: ADODB, et CDO.

1

J'ai rencontré le même problème, mais je n'ai pas été en mesure de modifier les restrictions de pare-feu de mon entreprise. Basé sur l'une des notes sur this Google doc, avec la réponse d'erdenetsogt ci-dessus, j'ai essayé d'utiliser le port 25 et cela a fonctionné.(Au début, je craignais que l'utilisation du port 25 puisse impliquer que le message ne soit pas crypté, donc j'ai défini EnableSSL sur false, ce qui a amené Gmail à le rejeter car le StartTLS n'a jamais été appelé. SSL, même sur le port 25).

0

Il y a deux façons de faire SMTP sur SSL: explicite et implicite. Explicite signifie que vous vous connectez à un port SMTP normal (généralement 25 ou 587) en texte clair, puis lancez la commande "starttls" pour passer en mode SSL. Implicite signifie que vous vous connectez à un port qui s'attend à ce que tout soit SSL (généralement 465).

Asp.net utilise "System.Net.Mail.SmtpClient()" pour envoyer un courriel. Le problème principal est que SmtpClient ne supporte pas les connexions SSL implicites, mais supporte les connexions explicites (System.Net.Mail avec SSL pour s'authentifier sur le port 465). Ainsi, si le serveur de messagerie (SMTP) ne prend pas en charge la connexion explicite, il ne parvient pas à envoyer des e-mails et afficher des messages tels que "Délai de connexion", "Le message n'a pas pu être envoyé au serveur SMTP. Le code d'erreur de transport était 0x80040217. La réponse du serveur n'était pas disponible "etc.

Pour résoudre ce problème dans ASP.net, nous pouvons utiliser la bibliothèque CDO (Collaboration Data Objects) pour Windows 2000 (Cdosys.dll) pour envoyer un message électronique avec des pièces jointes. Microsoft Outlook utilise cette DLL pour envoyer un courrier électronique. Dans votre solution ASP.net, vous devez ajouter la référence "Microsoft CDO pour Windows 2000 Library". Il va ajouter deux DLL marqué dans le dossier Bin.

image to add referance

Maintenant, faites le code ci-dessous en C# .net:

public static void SendMail(string FromName, string FromEmail, string ReceiverEmail, string CC, string BCC, string subj, string Mssg) 
{ 
const var cdoSendUsingPort = 2; 
const var cdoBasicAuth = 1; 
const var cdoTimeout = 60; 
var mailServer = "mail.XXXXXXX.net"; 
var SMTPport = 465; 
var mailusername = "[email protected]"; 
var mailpassword = "PPPPXXXX"; 
var objEmail = CreateObject("CDO.Message"); 
var objConf = objEmail.Configuration; 
var objFlds = objConf.Fields; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword; 
objFlds.Update(); 
objEmail.To = ReceiverEmail; 
objEmail.From = FromEmail; 
objEmail.CC = CC; 
objEmail.BCC = BCC; 
objEmail.Subject = subj; 
objEmail.HTMLBody = Mssg; 
objEmail.Send(); 
} 

Dans VB.net

Public Shared Sub SendMail(ByVal FromName As String, ByVal FromEmail As String, ByVal ReceiverEmail As String, ByVal CC As String, ByVal BCC As String, ByVal subj As String, ByVal Mssg As String) 

''#################Sending Email########################## 

Const cdoSendUsingPort = 2 ' Send the message using SMTP 
Const cdoBasicAuth = 1 ' Clear-text authentication 
Const cdoTimeout = 60 ' Timeout for SMTP in seconds 

Dim mailServer = "mail.XXXXXXX.net" 
Dim SMTPport = 465 
Dim mailusername = "[email protected]" 
Dim mailpassword = "PPPPXXXX" 




Dim objEmail = CreateObject("CDO.Message") 
Dim objConf = objEmail.Configuration 
Dim objFlds = objConf.Fields 

With objFlds 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername 
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword 
.Update() 
End With 

objEmail.To = ReceiverEmail 
objEmail.From = FromEmail 
objEmail.CC = CC 
objEmail.BCC = BCC 
objEmail.Subject = subj 
objEmail.HTMLBody = Mssg 
'objEmail.AddAttachment "C:\report.pdf" 
objEmail.Send() 
End Sub 

Referance: Original post Implicite & SMTP explicite http://help.fogcreek.com/9002/using-an-smtp-server-with-ssl utiliser la Bibliothèque Cdosys.dll pour envoyer un message électronique avec pièces jointes https://support.microsoft.com/en-us/help/310212/how-to-use-the-cdosys-dll-library-to-send-an-e-mail-message-with-attac

Questions connexes