【问题标题】:Send Email via C# through Google Apps account通过 Google Apps 帐户通过 C# 发送电子邮件
【发布时间】:2010-10-19 23:15:42
【问题描述】:

我有一个标准的 Google Apps 帐户。我已经通过 Google Apps 设置了一个自定义域。使用 Gmail 界面时,我可以通过 Google Apps 成功发送和接收电子邮件。但是,我想通过代码发送电子邮件。为了尝试这个,我一直在尝试以下代码:

MailMessage mailMessage = new MailMessage();
mailMessage.To.Add("someone@somewhere.com");
mailMessage.Subject = "Test";
mailMessage.Body = "<html><body>This is a test</body></html>";
mailMessage.IsBodyHtml = true;

// Create the credentials to login to the gmail account associated with my custom domain
string sendEmailsFrom = "emailAddress@mydomain.com";             
string sendEmailsFromPassword = "password";
NetworkCredential cred = new NetworkCredential(sendEmailsFrom, sendEmailsFromPassword);

SmtpClient mailClient = new SmtpClient("smtp.gmail.com", 587);
mailClient.EnableSsl = true;
mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mailClient.UseDefaultCredentials = false;
mailClient.Timeout = 20000;
mailClient.Credentials = cred;
mailClient.Send(mailMessage); 

当到达 Send 方法时,会抛出一个异常,指出:

"SMTP 服务器需要一个安全的 连接或客户端没有 认证。服务器响应 是:5.5.1 需要身份验证。”

如何通过 Google 通过我的自定义域发送电子邮件?

谢谢!

【问题讨论】:

  • 465 端口会更好吗?
  • 上面的代码有什么问题?
  • 我遇到了超时问题,但是查看所有代码示例,我的代码和设置似乎都是正确的。
  • 后期添加:Google 要求您“启用安全性较低的应用程序”才能使其正常工作:support.google.com/accounts/answer/6010255?hl=en

标签: c# smtp google-apps


【解决方案1】:

这是我在 WPF 4 中使用的

SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("sender_email@domain.tld", "P@$$w0rD");
client.Port = 587;
client.Host = "smtp.gmail.com";
client.EnableSsl = true;

try 
{
    MailAddress maFrom = new MailAddress("sender_email@domain.tld", "Sender's Name", Encoding.UTF8),
    MailAddress maTo = new MailAddress("recipient_email@domain2.tld", "Recipient's Name", Encoding.UTF8);
    MailMessage mmsg = new MailMessage(maFrom, maTo);
    mmsg.Body = "<html><body><h1>Some HTML Text for Test as BODY</h1></body></html>";
    mmsg.BodyEncoding = Encoding.UTF8;
    mmsg.IsBodyHtml = true;
    mmsg.Subject = "Some Other Text as Subject";
    mmsg.SubjectEncoding = Encoding.UTF8;

    client.Send(mmsg);
    MessageBox.Show("Done");
} 
catch (Exception ex) 
{
    MessageBox.Show(ex.ToString(), ex.Message);
    //throw;
}

注意防火墙和防病毒。这些令人毛骨悚然的事情往往会阻止应用程序发送电子邮件。 我使用 McAfee Enterprise,我必须添加可执行文件名称(如 Bazar.exe 和 Bazar.vshost.exe 的 Bazar.*)才能发送电子邮件...

【讨论】:

  • 我想创建一个“联系我们”页面,以便用户向站点管理员发送电子邮件。有没有办法将“发件人”设置为他们的电子邮件地址??
  • 可以伪造发件人地址;但是很有可能将您的电子邮件标记为垃圾邮件。我建议您从 info@yourhost.tld 向管理员和尝试与您联系的人发送电子邮件。然后您的管理员可以向所有人发送回复。
  • 这里有一个小错误,导致显示名称被丢弃。 MailMessage 结构应如下所示: MailMessage mmsg = new MailMessage(maFrom, maTo);
【解决方案2】:

我的代码在端口=587(SSL 应该是端口 465)上使用 TLS 连接到 smtp.google.com,但仍需要 EnableSsl=true

SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = false;
NetworkCredential credentials = new NetworkCredential();
credentials.UserName = "INSERT EMAIL";
credentials.Password = "INSERT PASSWORD";
smtp.Credentials = credentials;

MailAddress addressFrom = new MailAddress(credentials.UserName);
MailAddress addressTo = new MailAddress("INSERT RECIPIENT");
MailMessage msg = new MailMessage(addressFrom, addressTo);
msg.Subject = "SUBJECT"
msg.Body = "BODY";

smtp.Send(msg);

在您的 G SUITE 帐户中注意这些重要的先决条件

【讨论】:

    【解决方案3】:

    无需在代码中硬编码所有 smtp 设置。将它们放在 web.config 中。这样,您可以在需要时加密这些设置并即时更改它们,而无需重新编译您的应用程序。

    <configuration>
      <system.net>
        <mailSettings>
          <smtp from="example@domain.com" deliveryMethod="Network">
              <network host="smtp.gmail.com" port="587"
                  userName="example@domain.com" password="password"/>
          </smtp>
        </mailSettings>
      </system.net>
    </configuration>
    

    在您发送电子邮件时结束,只需在您的 SmtpClient 上启用 SSL:

    var message = new MailMessage("navin@php.net");
    // here is an important part:
    message.From = new MailAddress("example@domain.com", "Mailer");
    // it's superfluous part here since from address is defined in .config file
    // in my example. But since you don't use .config file, you will need it.
    
    var client = new SmtpClient();
    client.EnableSsl = true;
    client.Send(message);
    

    确保您发送的电子邮件地址与您在 Gmail 中尝试进行身份验证时使用的电子邮件地址相同。

    注意:从 .NET 4.0 开始,您可以将 enableSsl="true" 插入 web.config,而不是在代码中进行设置。

    【讨论】:

    • 完整的 webconfig 在 下并且应该是
    • 你也可以把 enableSsl 放到配置里。
    • @Shay - 如何在配置中启用 SSL?
    • @Rinat 新的 .NET 4.0 只需将 enableSsl 放入
    • 谢谢。添加了+1。不幸的是,90% 的生产应用程序仍然是 .NET 3.5 及更低版本。特别是。 Azure 上的那些。
    【解决方案4】:

    没有必要做任何事情。只需第一次登录您当前的帐户并按照说明进行操作。

    您的问题将得到解决。这是因为您在谷歌应用程序中创建了帐户但没有登录。只需登录并按照说明操作即可。

    【讨论】:

    • 鉴于 OP 的代码看起来不错,这实际上可能是问题所在。
    【解决方案5】:

    将端口改为 465

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2017-03-13
      • 2013-08-15
      • 1970-01-01
      • 2020-09-07
      • 2020-12-15
      相关资源
      最近更新 更多