我正在使用以下代码发送电子邮件。代码在我的本地机器上正常工作。但是在生产服务器上,我得到了错误消息

var fromAddress = new MailAddress("mymailid@gmail.com");
var fromPassword = "xxxxxx";
var toAddress = new MailAddress("yourmailid@yourdoamain.com");

string subject = "subject";
string body = "body";

System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)       
};

using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})

smtp.Send(message);

在我的Gmail A/c上,我从生产服务器运行代码后收到了以下电子邮件

Hi , Someone recently used your password to try to sign in to your Google Account mymailid@gmail.com. This person was using an application such as an email, client or mobile device. We prevented the sign-in attempt in case this was a hijacker trying to access your account. Please review the details of the sign-in attempt: Friday, 3 January 2014 13:56:08 o'clock UTC IP Address: xxx.xx.xx.xxx (abcd.net.) Location: Philadelphia PA, Philadelphia, PA, USA If you do not recognise this sign-in attempt, someone else might be trying to access your account. You should sign in to your account and reset your password immediately. Reset password If this was you and you are having trouble accessing your account, complete the troubleshooting steps listed at http://support.google.com/mail?p=client_login Yours sincerely, The Google Accounts team


当前回答

2022年5月30日之后,Gmail改变了对外部应用程序的政策 使用谷歌SMTP发送电子邮件详细信息。 Solition是登录谷歌帐户,您要发送电子邮件,启用谷歌两步验证,并为外部应用程序创建密码

其他回答

当您尝试从不同的时区或IP地址计算机登录时,通常会发生这种情况。您的生产服务器和您使用的邮件id都位于不同的时区。以下两种方案任选其一:

1)通过远程访问登录生产服务器,并使用您的凭证登录gmail一次。他们会要求确认,确认后注销。

或者2)登录gmail到你的本地计算机,按照这个链接,选择审查这个活动,并采取适当的行动。

2018年11月,我尝试了以上所有方法,但都没有成功。

下面是最终有效的解决方案。不幸的是,它不使用SSL,但它工作!!

var fromAddress = new MailAddress(asd@asd.com, "From Name");
var toAddress = new MailAddress("tosend@asd.com", "To Name");

const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
{
    Host = "aspmx.l.google.com",
    Port = 25,
    EnableSsl = false
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

Tomasz Madeyski的评论解决了我的问题…他告诉存在一个错误的SetDefaultCredential,他说:

问题是在UseDefaultCredentials setter中有这样的代码:this.transport. credentials = value ?(ICredentialsByHost) CredentialCache。DefaultNetworkCredentials: (ICredentialsByHost) null;它覆盖由凭证设置器设置的凭证。对我来说,它看起来像SmtpClient的bug。”

如果你输入smtpClient。设置凭证后UseDefaultCredentials = false…这一行设置为空这些凭据…

我真的看过很多想法,唯一的解决方案是这种方式(适用于不同的电子邮件提供商):

            try
        {
            ViewProgressbar("Try to connect mail-server...", progressBar1.Value = 20);
            string host = dsProvider.Rows[y]["POP_hostOut"].ToString();
            int port = int.Parse(dsProvider.Rows[y]["POP_portOut"].ToString());  //587
            string[] email = von1.Split('@');
            string userName = (dsProvider.Rows[y]["login"].ToString() == "email[0]@email[1]")? email[0]+"@"+email[1] : email[0];
            string password = layer.getUserPassword(listSender.SelectedValue.ToString());
            SmtpClient client = new SmtpClient(host, port);
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            //A idea from MSDN but it not works. You got "The server response was: 5.5.1 Authentication Required."
            //System.Net.NetworkCredential myCreds = new System.Net.NetworkCredential(userName, password, host);
            //System.Net.CredentialCache cache = new System.Net.CredentialCache();
            //cache.Add(host, port, "NTLM", myCreds);
            ///cache.GetCredential(host, port, "NTLM");   //NTLM
            client.Credentials = new System.Net.NetworkCredential(userName, password);
            client.Host = host;
            client.Port = port;
            client.EnableSsl = true;
            client.Send(message);
            ViewProgressbar();
        }
        catch (SmtpException ex)...

Gmail/谷歌最近删除了(从2022年5月起)不安全的应用程序访问。他们是这么说的:

为确保您的账户安全,自2022年5月30日起,谷歌将不再支持仅使用用户名和密码登录谷歌账户的第三方应用程序或设备。

现在任何有直接SMTP电子邮件发送的电子邮件将抛出错误“535-5.7.8用户名和密码不接受”。这是因为现在谷歌要求应用程序特定的密码和电子邮件帐户密码不是应用程序密码,所以他们显示用户名/密码不接受。

您需要创建和使用应用程序特定的密码。应用程序密码就像你账户的备用密码一样。它只能被与您共享它的应用程序使用,因此它比共享您的主密码更安全。

创建应用程序特定的密码:

启用2因素认证。 进入Gmail的帐户设置,选择应用程序密码。 命名为任何您想要的名称,并创建密码。 使用这个新的16位密码和gmail电子邮件SMTP(在密码的地方使用这个16位密码)

享受发送邮件的乐趣!!