如何通过Gmail用C#发送电子邮件

15

在尝试通过我的 Web 服务发送电子邮件时,我遇到了错误。 我尝试启用访问较不安全的应用程序、禁用两步验证以及通过 Web 浏览器登录帐户等解决方法,但是 Stack Overflow 上的任何解决方案都没有对我起作用。 我仍然收到以下错误:

  

Error:System.Net.Mail.SmtpException:SMTP 服务器需要安全连接或客户端未经身份验证。 服务器响应为:5.5.1 要求身份验证。

我该怎么做才能解决这个问题?

namespace EmailService
{
    public class Service1 : IService1
    {    
        public string SendEmail(string inputEmail, string subject, string body)
        {
            string returnString = "";
            try
            {
                MailMessage email = new MailMessage();
                SmtpClient smtp = new SmtpClient();
                smtp.Host = "smtp.gmail.com";

                // set up the Gmail server
                smtp.EnableSsl = true;
                smtp.Port = 587;
                smtp.Credentials = new System.Net.NetworkCredential("myemail@gmail.com", "mypassword");
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.UseDefaultCredentials = false;

                // draft the email
                MailAddress fromAddress = new MailAddress("cse445emailservice@gmail.com");
                email.From = fromAddress;
                email.To.Add(inputEmail);
                email.Subject = body;
                email.Body = body;

                smtp.Send(email);

                returnString = "Success! Please check your e-mail.";
            }
            catch(Exception ex)
            {
                returnString = "Error: " + ex.ToString();
            }
            return returnString;
        }
    }
}

看看这个是否有帮助:https://dev59.com/X2Ml5IYBdhLWcg3wTlnY - Saagar Elias Jacky
1
你尝试过ping服务器吗?如果是的话,那么Eghbal Sohrabi提到的解决方案是可以的。 - Shubhojit
@Shubhojit 请ping一下Google服务器? - Johnny
@Johnny,我的意思是你的防火墙是否阻止了请求,有时会发生这种情况。只是为了确保... - Shubhojit
那么为什么我可以在本地主机上成功运行类似的代码,但是在Web服务器上运行时却出现了这个错误? - PongGod
1个回答

37

请前往此处:更少安全的应用,使用您在C#代码中用于发送邮件的电子邮件和密码登录,并选择打开

另外,请使用此链接并单击继续 允许访问您的Google账户

同时我稍微编辑了一下:

public string sendit(string ReciverMail)
{
    MailMessage msg = new MailMessage();

    msg.From = new MailAddress("YourMail@gmail.com");
    msg.To.Add(ReciverMail);
    msg.Subject = "Hello world! " + DateTime.Now.ToString();
    msg.Body = "hi to you ... :)";
    SmtpClient client = new SmtpClient();
    client.UseDefaultCredentials = true;
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.EnableSsl = true;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.Credentials = new NetworkCredential("YourMail@gmail.com", "YourPassword");
    client.Timeout = 20000;
    try
    {
       client.Send(msg);
        return "Mail has been successfully sent!";
    }
    catch (Exception ex)
    {
        return "Fail Has error" + ex.Message;
    }
    finally
    {
       msg.Dispose();
    }
}

如果上述代码不起作用,请尝试将其更改为以下代码:

    SmtpClient client = new SmtpClient();
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.EnableSsl = true;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential("YourMail@gmail.com", "YourPassword");

我已经尝试了这两种方法,但仍然无法正常工作。 - Johnny
5
原文:It turns out that smtp.UseDefaultCredentials = false; must go before smtp.Credentials = new System.Net.NetworkCredential("myemail@gmail.com", "mypassword"); I simply swapped those lines and everything works fine.翻译:原来 smtp.UseDefaultCredentials = false; 必须在 smtp.Credentials = new System.Net.NetworkCredential("myemail@gmail.com", "mypassword"); 之前设置,我只需要交换这两行代码的位置就可以了,现在一切都正常工作了。 - Johnny
你的意思是将 smtp.UseDefaultCredentials = true; 改为 smtp.UseDefaultCredentials = false; 并将其放置在 smtp.Credentials = new System.Net.NetworkCredential("myemail@gmail.com", "mypassword"); 之前,如果是的话,请告诉我修改我的答案。 - Eqbal Sohrabi
是的,我认为默认凭据需要为false,并且那行代码必须放在另一行之前。 - Johnny
我遇到了一个“Null”异常,但它没有告诉我实际的错误是什么。 - rollsch
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接