title: Sending Email via GMail and .NET 4
body: <p>Does .NET 4 has any problems in sending emails? I had a .NET 3.5 solution and it was working then migrated the solution to .NET 4 and It does not works; nothing changed!</p>
  
  <p>Notes:
  I get this exception:</p>
  
  <blockquote>
    <p>System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at
    at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)<br>
    at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)<br>
    at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException&amp; exception)<br>
    at System.Net.Mail.SmtpClient.Send(MailMessage message)<br>
    at ...</p>
  </blockquote>
  
  <p>And this is my code:</p>
  
  <pre><code>public static void SendEmail(
      this Email email)
  {
      if (email.MailingSettings == null) throw new ArgumentNullException("email.MailingSettings", "specify email.MailingSettings");
  
      var settings = email.MailingSettings;
  
      if (string.IsNullOrEmpty(email.Sender)) throw new ArgumentException("email.Sender", "specify a sender");
      if (email.Recipients == null) throw new ArgumentNullException("email.Recipients", "specify at least a recipient");
      if (email.Recipients.Length == 0) throw new ArgumentNullException("email.Recipients", "specify at least a recipient");
      if (string.IsNullOrEmpty(settings.SMTPHost)) throw new ArgumentException("email.SMTPHost", "specify email.SMTPHost");
  
      var mail = new MailMessage();
  
      if (string.IsNullOrEmpty(email.SenderDisplayName))
          mail.From = new MailAddress(email.Sender);
      else
          mail.From = new MailAddress(email.Sender, email.SenderDisplayName);
  
      if (!string.IsNullOrEmpty(email.ReplyTo))
      {
          if (string.IsNullOrEmpty(email.ReplyToDisplayName))
          {
              mail.ReplyToList.Add(new MailAddress(email.ReplyTo));
          }
          else
          {
              mail.ReplyToList.Add(new MailAddress(email.ReplyTo, email.ReplyToDisplayName));
          }
      }
  
      foreach (string recipient in email.Recipients)
          mail.To.Add(new MailAddress(recipient));
  
      mail.Subject = email.Subject;
      mail.Body = email.Body;
      mail.IsBodyHtml = settings.IsBodyHtml;
  
      if (email.CC != null &amp;&amp; email.CC.Length &gt; 0)
          foreach (string cci in email.CC)
              mail.CC.Add(cci);
  
      if (email.BCC != null &amp;&amp; email.BCC.Length &gt; 0)
          foreach (string bcci in email.BCC)
              mail.Bcc.Add(bcci);
  
      if (email.Attachments != null)
          foreach (var ifn in email.Attachments)
              mail.Attachments.Add(
                  new Attachment(
                      new MemoryStream(
                          ifn.Content),
                      ifn.FileName));
  
      var smtpPort = settings.SMTPPort &gt; 0 ? settings.SMTPPort : 25;
  
      var smtpClient = new SmtpClient(settings.SMTPHost, smtpPort);
      smtpClient.EnableSsl = settings.EnableSsl;
  
      if (!string.IsNullOrEmpty(settings.SMTPUser))
      {
          smtpClient.UseDefaultCredentials = false;
  
          var smtpPassword = settings.SMTPPassword == null ? string.Empty : settings.SMTPPassword;
  
          NetworkCredential netCred;
          if (string.IsNullOrEmpty(settings.SMTPDomain))
              netCred = new NetworkCredential(settings.SMTPUser, smtpPassword);
          else
              netCred = new NetworkCredential(settings.SMTPUser, smtpPassword, settings.SMTPDomain);
  
          smtpClient.Credentials = netCred;
      }
      else
          smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
  
      smtpClient.Timeout = 180 * 1000;
      smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
  
      ServicePointManager.ServerCertificateValidationCallback =
          delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
          { return true; };
  
      smtpClient.Send(mail);
  }
  </code></pre>