我正在使用以下代码发送电子邮件。代码在我的本地机器上正常工作。但是在生产服务器上,我得到了错误消息
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
我真的看过很多想法,唯一的解决方案是这种方式(适用于不同的电子邮件提供商):
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)...
当您尝试从代码发送邮件时,发现错误“SMTP服务器需要安全连接或客户端未经过身份验证。服务器的响应是:5.5.1 Authentication Required”,错误可能发生在以下情况下。
情况1:密码错误
情况2:当你试图从某个App登录时
情况3:当您试图从您的时区/域/计算机以外的域登录时
(从代码发送邮件时,大多数情况都是这样)
每个问题都有解决方案
解决方法:输入正确的密码。
情况2的解决方案1:进入以下链接https://www.google.com/settings/security/lesssecureapps的安全设置,启用不太安全的应用程序。这样你就可以从所有的应用程序登录。
情况2的解决方案2:(参见https://stackoverflow.com/a/9572958/52277)启用双因素身份验证(又名两步验证),然后生成特定于应用程序的密码。使用新生成的密码通过SMTP进行身份验证。
情况3的解决方案1:(这可能有帮助)您需要回顾活动。但由于最新的安全标准,审查活动将没有帮助,链接将没有用处。所以试试下面的例子。
针对情况3的解决方案2:如果您将代码托管在生产服务器上的某个地方,并且可以访问生产服务器,那么请将远程桌面连接到生产服务器,并尝试从生产服务器的浏览器登录一次。
这将为登录谷歌添加奖励,您将被允许从代码登录。
但是如果您无法访问生产服务器呢?
尝试解决方案3
情况3的解决方案3:您必须为您的谷歌帐户启用从其他时区/ ip登录。
要做到这一点,请访问https://g.co/allowaccess链接,并通过单击继续按钮允许访问。
就是这样。给你。现在,您将能够从任何一台计算机和任何方式的应用程序登录到您的谷歌帐户。
我在部署到Microsoft Azure的应用程序中遇到了同样的问题。
SmtpException: SMTP服务器需要安全连接,或者SMTP服务器需要安全连接
客户端未被验证。服务器的响应是:5.5.1
认证要求。
首先,我在以下页面上批准了所有未知设备(一些来自爱尔兰的ip地址)(以gmail用户登录):
https://security.google.com/settings/u/1/security/secureaccount
我对客户端进行了如下设置:
var client = new SmtpClient("smtp.gmail.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("my_user_name@gmail.com", "my_password");
只有当我在smtp-client上设置了以下属性后,它才开始工作:
client.TargetName = "STARTTLS/smtp.gmail.com";
在今天花了几个小时尝试了这里的每个解决方案之后,我仍然无法克服这个错误。我以这种方式多次使用gmail,所以我知道这是一个愚蠢的东西,但我没有做任何事情来解决这个问题。我终于偶然发现了我的解决方案,所以我想分享一下。
首先,上面的大多数答案也是必需的,但在我的例子中,这只是在创建SmtpClient类时对代码进行排序的简单问题。
在下面的第一个代码片段中,请注意Credentials = creds行所在的位置。这个实现将生成这个问题中引用的错误,即使您已经正确设置了其他所有内容。
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
Credentials = creds,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
}
但是,如果您将凭证设置调用移到底部,则电子邮件将正常发送。我没有改变周围的代码…用户名/密码等。显然,无论是EnableSSL、UseDefaultCredentials还是DeliveryMethod都依赖于先设置的凭证…不过,我并没有全部测试以确定是哪一个。
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
Credentials = creds
}
希望这能帮助其他人在未来避免一些头痛。
我有一个以前工作的代码,现在抛出这个错误。密码没有问题。也不需要将消息转换为base64。事实证明,我需要做以下几点:
关闭双因素身份验证
将“允许不太安全的应用程序”设置为“开启”
从生产服务器登录到您的gmail帐户
也请到这里批准登录活动
在生产服务器上运行应用程序
工作代码
public static void SendEmail(string emailTo, string subject, string body)
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("youremail@gmail.com", "secretpassword"),
EnableSsl = true
};
client.Send("youremail@gmail.com", emailTo, subject, body);
}
关闭双重身份验证
将“允许不太安全的应用程序”设置为“开启”(同页,需要滚动到底部)