通过GMail和.NET 4发送电子邮件

.NET 4在发送电子邮件时有任何问题吗? 我有一个.NET 3.5解决方案,它正在工作,然后将解决方案迁移到.NET 4,它不起作用; 没有改变!

注意:我得到这个例外:

System.Net.Mail.SmtpException:SMTP服务器需要安全连接或客户端未经过身份validation。 服务器响应为:5.5.1需要身份validation。 在System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode,String response)了解更多信息
在System.Net.Mail.MailCommand.Send(SmtpConnection conn,Byte []命令,字符串来自)
在System.Net.Mail.SmtpTransport.SendMail(MailAddress sender,MailAddressCollection recipients,String deliveryNotify,SmtpFailedRecipientException&exception)
在System.Net.Mail.SmtpClient.Send(MailMessage消息)
在 …

这是我的代码:

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 && email.CC.Length > 0) foreach (string cci in email.CC) mail.CC.Add(cci); if (email.BCC != null && email.BCC.Length > 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 > 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); } 

如果所有内容按照发布的代码和评论进行,那么我可以说您已经开启了对Google帐户 的两步validation ,在这种情况下,您需要生成应用专用密码。

这段代码是正确的,有效。 问题出在GMail方面并解决了(未检测到原因和方法)。

试着用这个:

 try { string smtpAddress = "smtp.gmail.com"; int portNumber = 587; bool enableSSL = true; string emailFrom = "senderemail@gmail.com"; string password = "password"; string emailTo = "receiver@gmail.com"; string subject = "Halo!"; string body = "Halo, Mr. SMTP"; MailMessage mail = new MailMessage(); mail.From = new MailAddress(emailFrom); mail.To.Add(emailTo); mail.Subject = subject; mail.Body = body; mail.IsBodyHtml = true; using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber)) { smtp.Credentials = new NetworkCredential(emailFrom, password); smtp.EnableSsl = enableSSL; smtp.Send(mail); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } 

*请注意,您需要激活此function: https : //myaccount.google.com/lesssecureapps

lesssecureapps

然后构建并运行代码..这太棒了.. 🙂