通过Google Apps账户使用C#发送电子邮件

69

我有一个标准的Google Apps账户。我已经通过Google Apps设置了一个自定义域名。当我使用Gmail界面时,我能够成功地通过Google Apps发送和接收电子邮件。然而,我想通过代码来发送电子邮件。为此,我一直在尝试以下代码:

MailMessage mailMessage = new MailMessage();
mailMessage.To.Add("someone@somewhere.example");
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.example";
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可能更好用吗? - Lucero
以上代码有什么问题? - Marko
1
我遇到了超时问题,但是查看了所有的代码示例,似乎我的代码和设置都是正确的。 - Dan Csharpster
3
迟来的补充:Google要求您“启用不太安全的应用程序”才能使此功能正常工作:https://support.google.com/accounts/answer/6010255?hl=en - L_7337
5个回答

95

在您的代码中没有必要硬编码所有SMTP设置。相反,将它们放在web.config文件中。这样,如果需要,您可以对这些设置进行加密,并且无需重新编译应用程序即可随时更改它们。

<configuration>
  <system.net>
    <mailSettings>
      <smtp from="example@domain.example" deliveryMethod="Network">
          <network host="smtp.gmail.com" port="587"
              userName="example@domain.example" 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.example", "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 中,而不是在代码中设置它。


1
完整的Web配置文件位于<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> - Simon_Weaver
1
@Shay - 你怎样在配置中启用SSL? - Rinat Abdullin
2
@Rinat,这是.NET 4.0的新功能,只需在<smtp>中启用enableSsl即可。 - Shay Erlichmen
谢谢。加了+1。不幸的是,90% 的生产应用程序仍然是 .NET 3.5 及以下版本。特别是那些在 Azure 上的应用程序。 - Rinat Abdullin
为什么这个端口号在谷歌的说明中没有列出,我不知道! - Stokedout
显示剩余2条评论

9
这是我在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企业版,必须添加可执行文件名称(例如Bazar.*,适用于Bazar.exe和Bazar.vshost.exe)才能发送电子邮件...


我想制作一个“联系我们”的页面,让用户向网站管理员发送电子邮件。有没有办法将“发件人”设置为他们的电子邮件地址? - Shimmy Weitzhandler
你可以伪造发件人地址,但是有很大的风险会被标记为垃圾邮件。我建议你从info@yourhost.tld发送一封电子邮件给管理员和试图联系你的人。然后你的管理员可以回复所有人。 - Achilles
这里有一个小bug,导致显示名称被丢弃了。MailMessage的构造应该像这样: MailMessage mmsg = new MailMessage(maFrom, maTo); - Kevin Meboe

4

将端口号更改为465


3

您无需做任何事情。只需首次登录您当前的帐户并按照说明操作即可解决问题。

您遇到这个问题是因为您已经在Google Apps中创建了帐户,但没有登录。只需登录并按照说明操作即可尝试解决问题。


鉴于 OP 的代码看起来没问题,这可能就是问题所在。 - Dermot

0

我的代码正在使用TLS连接到smtp.google.com,端口为587(SSL应该是端口465),但仍需要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 帐户的以下重要先决条件:


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