通过 Google Apps 帐户通过 C# 发送电子邮件

Posted

技术标签:

【中文标题】通过 Google Apps 帐户通过 C# 发送电子邮件【英文标题】:Send Email via C# through Google Apps account 【发布时间】: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 【参考方案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 帐户中注意这些重要的先决条件

确保您使用的用户名已通过首次登录时出现的 CAPTCHA 字词验证测试。 确保帐户具有安全密码 - https://support.google.com/accounts/answer/32040 确保为所需帐户启用了不太安全的应用程序-https://support.google.com/a/answer/6260879

【讨论】:

【参考方案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

【讨论】:

以上是关于通过 Google Apps 帐户通过 C# 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用 nodejs 中的服务帐户域范围委派通过 Google Apps Gmail 发送邮件

通过Google Apps向Django发送电子邮件时,为电子邮件帐户指定名称

允许匿名访问 Google Apps Script Web 应用程序(Google Apps 帐户)

服务帐户可以调用 Google Apps Script Execution API 吗?

typescript 创建Google Apps文件并通过电子邮件发送给某人

使用 Google Apps 帐户登录时,在 Android 上对 Google Play 游戏服务进行身份验证会导致错误