使用C#通过Gmail SMTP服务器发送电子邮件

CVe*_*tex 238 .net c# email gmail smtp

出于某种原因," 通过Gmail发送.NET中的电子邮件 "既没有被接受的答案也没有其他任何一个对我有用.他们为什么不工作?

更新:我在另一个问题中尝试了所有答案(接受和否则),但没有一个能够奏效.

我想知道它是否适用于其他任何人,否则谷歌可能已经改变了一些事情(之前发生过).

当我尝试使用的代码片段时SmtpDeliveryMethod.Network,我会在Send(消息)上快速收到SmtpException.信息是

SMTP服务器需要安全连接或客户端未经过身份验证.

服务器响应是:

5.5.1需要验证.了解更多"< - 认真,它在那里结束.

更新:

这是我很久以前问过的一个问题,接受的答案是我在不同的项目中使用了很多次的代码.

我已经在这篇文章和其他EmailSender项目中采用了一些想法,在Codeplex上创建了一个EmailSender项目.它专为可测试性而设计,支持我最喜欢的SMTP服务,如GoDaddy和Gmail.

egl*_*ius 289

CVertex,请务必检查您的代码,如果没有透露任何内容,请发布.我只是在我正在研究的测试ASP.NET站点上启用它,并且它可以工作.

实际上,在某些时候我的代码存在问题.我没有发现它,直到我在控制台程序上有一个更简单的版本并且看到它正在工作(因为你担心,Gmail方面没有变化).下面的代码就像您引用的示例一样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也使用web.config,http://msdn.microsoft.com/en-us/library/w355a94k.aspx和代码的组合工作(因为EnableSsl配置文件中没有匹配:().

  • 您可能还需要在gmail设置页面中为"安全性较低的应用"启用访问权限:https://www.google.com/settings/security/lesssecureapps.如果您收到异常"`服务器响应是:5.5.1需要身份验证,则必须执行此操作. (17认同)
  • 请记住,像这样的代码有效地将纯文本的gmail凭据传输给用户...... (12认同)
  • 在4.0中添加的@Zidad. (4认同)
  • 实际上web.config中的enableSsl匹配设置,请参阅下面的答案 (3认同)

Erx*_*der 68

如果所有人都失败了,以下几乎可以回答你的问题:

我得到了完全相同的错误,事实证明谷歌的新密码车力量测量算法已经改变了我的推定当前密码太弱了,没有告诉我关于它的事情(甚至不是一个消息或警告)......我是怎么发现这个?好吧,我选择更改我的密码以查看它是否有用(尝试其他一切无济于事),当我更改密码时,它有效!

那么,对于一个实验,我试图改变我的密码回到我以前的密码,看看会发生什么,和Gmail实际上并没有让我这样做,理由的理由"对不起,我们不能让你这个改变保存为您的选择密码太弱"并且不会让我回到我的旧密码.我认为这是错误的,因为a)你需要每x个月或b)更改一次密码.正如我之前所说,他们的密码强度算法发生了变化,因此我所接受的弱密码未被接受,即使他们在尝试登录时没有说出任何相关信息!这个(数字2)是最可能的情况,因为我的弱密码大约有4个月的时间,它允许我在Gmail中使用它.

他们对此没有说什么是非常糟糕的,但这是有道理的.因为大多数被劫持的电子邮件是使用gmail以外的软件登录的,我猜你要在Gmail环境之外使用Gmail时需要更强的密码.

我希望这有帮助!

  • 谢谢,正如你所说,更改密码,以便它是强大的,一切都会正常工作. (2认同)
  • 这正是我的问题——所有其他建议都是关于配置的,但我的配置从一开始就是正确的,但我一直收到错误消息。更改密码使一切变得不同, (2认同)

Joh*_*sch 65

除了上面的其他疑难解答步骤之外,我还想补充一点,如果您在GMail帐户上启用了双因素身份验证(也称为两步验证),则必须生成应用程序专用密码并使用新密码生成密码以通过SMTP进行身份验证.

要创建一个,请访问:https://www.google.com/settings/并选择授权应用程序和网站以生成密码.

  • 我没有启用两步验证,不管我设置的密码有多安全,这是我解决问题的唯一方法。我能够使用其他 Gmail 帐户而没有 2 步和较弱的密码,没有任何问题……要使用我真正想使用的帐户,我必须启用 2 步并使用特定于应用程序的密码。 (2认同)

Suh*_*wan 52

Turn On Access For Less Secure Apps and it will work for all no need to change password.
Run Code Online (Sandbox Code Playgroud)

链接到Gmail设置

在此输入图像描述

  • 此设置不再可用。[了解详情](https://support.google.com/accounts?p=less-secure-apps&amp;hl=en) (3认同)

小智 30

我在从我的Gmail帐户发送电子邮件时遇到了一些问题,这是由于上述几种情况造成的.以下是我如何使其工作并同时保持灵活性的摘要:

  • 首先设置您的GMail帐户:
    • 启用IMAP并断言正确的最大消息数(您可以在此处执行此操作)
    • 确保您的密码至少为7个字符并且非常强大(根据Google)
    • 确保您不必先输入验证码.您可以通过从浏览器发送测试电子邮件来完成此操作.
  • 在web.config(或app.config中进行更改,我还没有尝试过,但我认为它在Windows应用程序中运行起来同样容易):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class
Run Code Online (Sandbox Code Playgroud)

现在,无论何时您想发送电子邮件,您只需致电SSLMail.SendMail:

例如,在具有PasswordRecovery控件的页面中:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

或者您可以在代码中的任何地方致电:

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助任何遇到这篇文章的人!(我使用VB.NET,但我认为将它转换为任何.NET语言都是微不足道的.)


小智 13

Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")
Run Code Online (Sandbox Code Playgroud)

如果您收到错误,例如"SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要验证.了解更多信息",在此之前,请确保SMTPClientObj.UseDefaultCredentials = False包含此行和此行应该在之前SMTPClientObj.Credentials.

我确实尝试以相反的方式切换这两行,并返回5.5.1 Authentication Required错误.


小智 13

哦......真是太棒了......首先我无法发送任何理由的电子邮件.但是在我改变了这两行的顺序之后,它完美地工作了.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!!! :)


Kev*_*vin 10

解决这个问题的简单步骤:

1)登录您的Gmail

2)导航到此页面https://www.google.com/settings/security/lesssecureapps并设置为"开启"


Jas*_*ort 9

问题不在于通过gmail发送的技术能力.这适用于大多数情况.如果您无法将机器发送,通常是由于机器未在控件上至少进行过一次人工认证.

大多数用户面临的问题是Google决定始终更改出站限额.您应该始终为您的解决方案添加防御性代码.如果您开始看到错误,请停止发送速度,然后停止发送一段时间.如果您一直试图发送Google,有时会在延迟期间增加额外的时间,然后再发送.

我在当前系统中所做的是在每条消息之间发送1.5秒的延迟.然后,如果我收到任何错误,请停止5分钟,然后重新开始.这通常有效,并允许您发送帐户的限制(最后我检查它是每天首要客户登录2,000.).

  • 这正是我的问题!当我部署到生产时,我遇到了问题,在我登录到服务器上的 Gmail 后,它又开始工作了。 (2认同)

小智 9

我遇到了同样的问题,但结果是我的病毒防护阻止了传出的"垃圾邮件"电子邮件.关闭它允许我使用端口587通过GMail发送SMTP电子邮件


Wie*_*sma 8

我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的enableSsl设置(我使用的是.NET 4.0,但我怀疑它可以在.NET 2.0或更高版本中运行),但是这个配置可以用于我(并且不要求您使用任何编程配置):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

您可能必须先在Gmail帐户中启用POP或IMAP:https://mail.google.com/mail/?shva = 1# settings/fwdandpop

我建议先用普通邮件客户端尝试...

  • 这是4.0的新手,比较版本 - > http://msdn.microsoft.com/en-us/library/ms164242(v=VS.90).aspx (2认同)

Cel*_*elt 8

如果此处没有其他任何内容可供您使用,则可能需要允许从第三方应用程序访问您的Gmail帐户.这是我的问题.要允许访问,请执行以下操作:

  1. 登录您的Gmail帐户.
  2. 访问此页面https://accounts.google.com/DisplayUnlockCaptcha并单击按钮以允许访问.
  3. 访问此页面https://www.google.com/settings/security/lesssecureapps并启用对安全性较低的应用的访问权限.

这对我有用,希望它适用于其他人!


小智 6

@Andres Pompiglio:是的,你必须至少更改一次密码..这段代码很好用:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法调用该函数:

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))
Run Code Online (Sandbox Code Playgroud)


Ned*_*Ned 6

我正在使用企业VPN连接.这就是为什么我无法从我的应用程序发送电子邮件的原因.如果我从VPN断开连接,它会工作.


Alb*_*ori 5

我遇到了同样的错误(“SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:需要 5.5.1 身份验证。了解更多信息”)并发现我使用了错误的密码。我修复了登录凭据,并正确发送。

我知道这已经晚了,但也许这会对其他人有所帮助。


小智 5

我还发现,我以前登录的帐户由于某种原因被谷歌取消激活.一旦我重置密码(与以前一样),我就可以发送电子邮件了.我也收到了5.5.1的消息.


小智 5

我也试过很多解决方案,但做一些改变它会起作用

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true
Run Code Online (Sandbox Code Playgroud)

使用smtpclient以上参数在gmail中工作


Vla*_*mas 5

我遇到了同样的错误,上述解决方案均无济于事。

我的问题是我正在从远程服务器运行代码,该服务器从未用于登录gmail帐户。

我打开了远程服务器上的浏览器,并从那里登录gmail。它询问了一个安全问题,以确认是我自己,因为这是一个新位置。完成安全检查后,我可以通过代码进行身份验证。


Bur*_*kan 5

为您的帐户开启安全性较低的应用程序:https : //www.google.com/settings/security/lesssecureapps


rez*_*e08 5

  1. 首先检查您的 Gmail 帐户设置并从“访问不太安全的应用程序”中打开 在此处输入图片说明

我们强烈建议您使用安全的应用程序(例如 Gmail)来访问您的帐户。Google 开发的所有应用都符合这些安全标准。另一方面,使用安全性较低的应用程序可能会使您的帐户容易受到攻击。了解更多。

  1. smtp.UseDefaultCredentials = false;
    
    Run Code Online (Sandbox Code Playgroud)

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    
    Run Code Online (Sandbox Code Playgroud)