GMail SMTP via C# .Net errors on all ports

前端 未结 7 1601
鱼传尺愫
鱼传尺愫 2020-11-27 17:35

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: Sending email through Gmail SMT

7条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-27 17:55

    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:

        /// 
        /// Send an electronic message using the Collaboration Data Objects (CDO).
        /// 
        /// http://support.microsoft.com/kb/310212
        private void SendTestCDOMessage()
        {
            try
            {
                string yourEmail = "YourUserName@gmail.com";
    
                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.

提交回复
热议问题