tags:

views:

1768

answers:

6

I've been trying for a whlie on this, and have so far been failing miserably. My most recent attempt was lifted from this stack code here: http://stackoverflow.com/questions/704636/sending-email-through-gmail-smtp-server-with-c, but I've tried all the syntax I could find here on stack and elsewhere. My code currently is:

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");

Running that code gives me an immediate exception "Failure sending mail" that has an innerexeption "unable to connect to the remote server".

If I change the port to 465 (as gmail docs suggest), I get a timeout every time.

I've read that 465 isn't a good port to use, so I'm wondering what the deal is w/ 587 giving me failure to connect. My user and pass are right. I've read that I have to have POP service setup on my gmail account, so I did that. No avail.

I was originally trying to get this working for my branded GMail account, but after running into the same problems w/ that I thought going w/ my regular gmail account would be easier... so far that's not the case.

Thanks for the help. Paul

+4  A: 

I tried your code, and it works prefectly with port 587, but not with 465.

Have you checked the fire wall? Try from the command line "Telnet smtp.gmail.com 587" If you get "220 mx.google.com ESMTP...." back, then the port is open. If not, it is something that blocks you call.

Daniel

Daniel Svalefelt
thanks, that was exactly it. I had put the rule in my firewall to let port 587 through, and my email client had no problem using it, but my a/v was suspicious of my console test app, thinking it was a worm trying to propogate.
Paul
A: 

I implemented an email client sometime back that could talk to gmail on both 587 and 465...

Port 25 is the normal unencrypted pop port; not available on gmail.

The other two ports have encryption; 587 uses TLS, 465 uses SSL.

To use 587 you should set SmtpClient.EnableSsl = true.

465 wont work with SmtpClient, it will work with the deprecated class SmtpMail instead.

rschnitzer
as mentioned, I already had EnableSsl = true, see my code.
Paul
A: 

Hi i have the same problem as Paul. when i tried connecting by telnet on 587 it says it does is unable to connect. What must i change in my firewall settings to get it to connect...

please help

A: 

if you are using port 587 you must enable IMAP settings from gmail account.

chat
A: 

your private network's wirewall blocked 587, 465 port. you can use default port 25 or enable there ports on wirewall

erdenetsogt
A: 

I ran in to this problem a while ago as well. The problem is that SmtpClient does not support implicit SSL connections, but does support explicit connections (System.Net.Mail with SSL to authenticate against port 465). The previous class of MailMessage (I believe .Net 1.0) did support this but has long been obsolete.

My answer was to call the CDO (Collaborative Data Objects) (http://support.microsoft.com/kb/310212) directly through COM using something like the following:

    /// <summary>
    /// Send an electronic message using the Collaboration Data Objects (CDO).
    /// </summary>
    /// <remarks>http://support.microsoft.com/kb/310212&lt;/remarks&gt;
    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);
        }
    }

Do not forget to browse through your COM references and add the "Microsoft CDO for Windows 200 Library" which should add two references: ADODB, and CDO.

Bryan Allred