我想从我的应用程序中发送一封电子邮件,并且我已经编写了以下用于发送邮件的代码
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid");
msg.To.Add("receipientid");
msg.Subject = "test";
msg.Body = "Test Content";
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
client.UseDefaultCredentials = true;
client.Send(msg);
我在本地主机上运行它,所以我在发送它时犯了什么错误。
当我发送按钮时,它会给出一个错误,例如
SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1 需要身份验证。
Web.config 文件中的代码
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="smtpServer" value="smtp.gmail.com" />
<add key="EnableSsl" value = "true"/>
<add key="smtpPort" value="587" />
<add key="smtpUser" value="sender@gmail.com" />
<add key="smtpPass" value="mypassword" />
<add key="adminEmail" value="sender@gmail.com" />
</appSettings>
<system.net>
<mailSettings>
<smtp from="sender@gmail.com">
<network host="smtp.gmail.com" password="mypassword" port="587" userName="sender@gmail.com" enableSsl="true"/>
</smtp>
</mailSettings>
</system.net>
我应该怎么做才能解决这个错误并发送邮件?
我也有同样的问题。
我找到了这个解决方案:
Google 可能会阻止来自不使用现代安全标准的某些应用或设备的登录尝试。由于这些应用程序和设备更容易被入侵,因此阻止它们有助于确保您的帐户更安全。
一些不支持最新安全标准的应用示例包括:
装有 iOS 6 或更低版本的 iPhone 或 iPad 上的邮件应用
8.1 版本之前的 Windows 手机上的邮件应用程序
一些桌面邮件客户端,如 Microsoft Outlook 和 Mozilla Thunderbird
因此,您必须在您的 Google 帐户中启用不太安全的登录(或不太安全的应用程序访问)。
登录谷歌账号后,访问:
https://www.google.com/settings/security/lesssecureapps
或
https://myaccount.google.com/lesssecureapps
在 C# 中,您可以使用以下代码:
using (MailMessage mail = new MailMessage())
{
mail.From = new MailAddress("email@gmail.com");
mail.To.Add("somebody@domain.com");
mail.Subject = "Hello World";
mail.Body = "<h1>Hello</h1>";
mail.IsBodyHtml = true;
mail.Attachments.Add(new Attachment("C:\\file.zip"));
using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
{
smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
smtp.EnableSsl = true;
smtp.Send(mail);
}
}
首先检查 gmail 的安全相关问题。您可能在 gmail 中启用了双重身份验证。如果您收到任何安全警报,还请检查您的 gmail 收件箱。在这种情况下,请检查@mjb 的其他答案,如下所示
以下是我总是首先检查此类问题的非常普遍的事情
client.UseDefaultCredentials = true;
将其设置为假。
注意@Joe King 的answer - 您必须设置 client.UseDefaultCredentials before 您设置 client.Credentials
确保在调用 SmtpClient.UseDefaultCredentials = false
之后设置 SmtpClient.Credentials
。
顺序很重要,因为设置 SmtpClient.UseDefaultCredentials = false
会将 SmtpClient.Credentials
重置为 null。
我已经搜索并尝试了几个小时的不同事物。总而言之,我必须考虑以下几点:
使用 smtp.gmail.com 而不是 smtp.google.com 使用端口 587 设置 client.UseDefaultCredentials = false;在设置凭据之前为不太安全的应用程序打开访问设置 client.EnableSsl = true;
如果这些步骤没有帮助,请检查此 answer。
也许,您也可以在此 System.Net.Mail FAQ 上找到有用的东西。
尝试登录您的 gmail 帐户。如果您使用 gmail SMTP 发送电子邮件,它会被锁定。我不知道在它被锁定之前你可以发送的电子邮件的限制,但如果你登录一次,它就会再次从代码中工作。确保您的 webconfig 设置良好。
试试这种方式,我只是做了一些轻微的改变:
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid@gmail.com");
msg.To.Add("receipientid@gmail.com");
msg.Subject = "test";
msg.Body = "Test Content";
//msg.Priority = MailPriority.High;
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("mymailid@gmail.com", "mypassword");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
如果您在那里有邮件设置,请同时显示您的 app.config 文件。
应用密码帮助了我。
转到 https://myaccount.google.com/security。向下滚动到“登录 Google”。启用两步验证。添加应用密码。在您的代码中使用生成的密码。
尝试启用允许不太安全的应用程序访问。
在这里,您可以在使用 Gmail 登录后启用安全性较低的应用程序。
https://myaccount.google.com/lesssecureapps
谢谢。
https://i.stack.imgur.com/KWKEe.png
MailMessage mail = new MailMessage();
mail.From = new MailAddress("xx@gmail.com");
mail.Sender = new MailAddress("xx@gmail.com");
mail.To.Add("external@emailaddress");
mail.IsBodyHtml = true;
mail.Subject = "Email Sent";
mail.Body = "Body content from";
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx");
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.EnableSsl = true;
smtp.Timeout = 30000;
try
{
smtp.Send(mail);
}
catch (SmtpException e)
{
textBox1.Text= e.Message;
}
即使我将“UseDefaultCredentials”设置为 false,我也遇到了同样的问题。后来我发现根本原因是我在我的帐户中打开了“两步验证”。我关掉后问题就消失了。
下面是我的代码。我也有同样的错误,但问题是我输入了错误的密码。下面的代码将完美运行..试试看
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("fromaddress@gmail.com");
mail.To.Add("toaddress1@gmail.com");
mail.To.Add("toaddress2@gmail.com");
mail.Subject = "Password Recovery ";
mail.Body += " <html>";
mail.Body += "<body>";
mail.Body += "<table>";
mail.Body += "<tr>";
mail.Body += "<td>User Name : </td><td> HAi </td>";
mail.Body += "</tr>";
mail.Body += "<tr>";
mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
mail.Body += "</tr>";
mail.Body += "</table>";
mail.Body += "</body>";
mail.Body += "</html>";
mail.IsBodyHtml = true;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
您可以在 Sending mail 中引用它
我多次遇到同样的问题。启用不太安全的应用程序选项后,问题解决了。从此处启用安全性较低的应用程序:https://myaccount.google.com/lesssecureapps
希望这会有所帮助。
就我而言,我面临着同样的问题。经过长时间的研究,不要将 UseDefaultCredentials 值设置为 false。因为 UseDefaultCredentials 的默认值为 false。
另一个关键点是在 client.send(message) 语句之前设置网络凭据。
错误代码:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
client.Send(message);
错误代码:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = true;
client.Send(message);
正确的代码
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
// client.UseDefaultCredentials = true;
client.Send(message);
正确的代码
SmtpClient client = new SmtpClient();
client.Host = ServerName;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Send(message);
现在它与两个更正的代码都可以正常工作。所以在这种情况下,顺序很重要。
干杯!
如果它是一个新的 google 帐户,您必须通过常规用户界面发送一封电子邮件(第一个)。之后,您可以使用您的应用程序/机器人发送消息。
您应该考虑在配置文件中指定 SMTP 配置数据,并且不要在代码中覆盖它们 - 请参阅 http://www.systemnetmail.com/faq/4.1.aspx 处的 SMTP 配置数据
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="admin@example.com">
<network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/>
</smtp>
</mailSettings>
</system.net>
我今天早上创建了一个 Microsoft 365 Developer subscription (E5),并使用以下设置发送了一封测试电子邮件
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(username, password);
client.Host = "smtp.office365.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
一开始它不起作用,因为我不断收到此错误消息以及此代码引发的异常。然后,我花了大约 4 个多小时来使用 Microsoft 365 管理中心设置并阅读文章以找出问题所在。最终,我更改了我的 Microsoft 365 管理中心密码,它就像一个魅力。因此,在考虑任何高级解决方案之前,有必要在收到此消息时尝试更改密码。
请注意,当我毫无问题地登录到我的 Microsoft 365 帐户时,密码肯定不是无效的。但是,密码更改解决了这个问题。
在浏览了每个提出的解决方案之后,我意识到正确的答案取决于您当前的服务器和电子邮件客户端情况。就我而言,我的 MX 记录指向我的本地出站服务器。此外,由于我使用 G Suite 而不是 Gmail 来发送通知电子邮件,因此我必须遵循以下配置:https://support.google.com/a/answer/2956491?hl=en。
话虽如此,我找到了完成这项工作的正确方法,确实是首先从我的 G Suite 帐户配置 SMTP 中继服务:
https://i.stack.imgur.com/CYIII.png
https://i.stack.imgur.com/HnzFQ.png
IPv6 地址是 MX 记录指向的网络服务器的地址(例如:1234:454:c88a:d8e7:25c0:2a9a:5aa2:104)。
完成后,使用此代码补充解决方案:
//Set email provider credentials
SmtpClient smtpClient = new SmtpClient("smtp-relay.gmail.com", "587");
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = true;
MailAddress from = new MailAddress("username@yourdomain.com", "EmailFromAlias");
MailAddress to = new MailAddress("destination@anydomain.com");
MailMessage = new MailMessage(from, to);
MailMessage.Subject = subject;
MyMailMessage.Body = message;
MyMailMessage.IsBodyHtml = false;
smtpClient.Send(MyMailMessage);
请注意,使用此方法 smtpClient.UseDefaultCredentials = true;而不是其他解决方案中建议的错误。此外,由于我们使用 IPv6 地址连接 SMTP 客户端,因此不需要指定用户名或密码。因此,在我看来,这是一种更安全、更安全的方法。
一些 smtp 服务器(安全的)要求您同时提供用户名和电子邮件,如果它的 gmail 则很可能是您需要解决的“不太安全的登录”问题,否则您可以尝试:
public static void SendEmail(string address, string subject,
string message, string email, string username, string password,
string smtp, int port)
{
var loginInfo = new NetworkCredential(username, password);
var msg = new MailMessage();
var smtpClient = new SmtpClient(smtp, port);
msg.From = new MailAddress(email);
msg.To.Add(new MailAddress(address));
msg.Subject = subject;
msg.Body = message;
msg.IsBodyHtml = true;
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = loginInfo;
smtpClient.Send(msg);
}
请注意,来自的电子邮件和用户名是不同的,这与某些将它们称为相同的实现不同。
调用此方法可以这样完成:
SendEmail("to-mail@gmail.com", "test", "Hi it worked!!",
"from-mail", "from-username", "from-password", "smtp", 587);
在转 less secure option on 并尝试其他解决方案后,如果您仍然面临同样的问题,请尝试使用此重载:
client.Credentials = new NetworkCredential("mymailid", "mypassword");
代替:
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
我有同样的问题,通过将密码更改为强密码解决了。
如果您在使用 Office 365 帐户时遇到此问题。在 Exchange Online 中,默认情况下,将为所有 Office 365 邮箱帐户禁用 SMTP 客户端身份验证。您必须为有问题的帐户手动启用 SMTP Auth 并再次检查案例。检查以下线程。
https://morgantechspace.com/2021/01/the-smtp-server-requires-a-secure-connection-or-the-client.html
这可能是:1)用户或密码错误 2)未启用 SSL 3)安全应用程序未启用 4)您尚未使用此邮件登录服务器 5)您尚未设置 client.UseDefaultCredentials = false
尝试这种方式,并通过单击此链接来启用安全性较低的应用程序
var fromEmail = new MailAddress("your@gmail.com", "Title");
var toEmail = new MailAddress(emailID);
var fromEmailPassword = "yourPassword";
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromEmail.Address, fromEmailPassword)
};
using (var message = new MailMessage(fromEmail, toEmail)
{
Subject = subject,
Body = body,
IsBodyHtml = true
})
smtp.Send(message);
我还面临着“SMTP 服务器需要安全连接或客户端未通过身份验证”之类的问题。服务器响应是:5.5.0 Authentication Required' 然后浏览了很多互联网资料,但它并没有完全帮助我。我是如何解决的
step1:smtp.gmail.com 是 gmail 服务器,所以转到您的帐户 gmail 设置->单击查看所有设置->转发和 IMAP/POP->检查弹出和 imap 是否已启用,如果未启用它->保存更改。 step2-单击您的gmail个人资料图片->单击管理您的google帐户->转到安全选项卡->检查访问安全性较低的应用程序(如果您没有选择两步验证,则此选项可用)->默认情况下谷歌将其设置为禁用,使其能够使用您的真实 gmail 密码来发送电子邮件。注意:-为不太安全的应用程序启用 gmail 访问,可能对您很危险,所以我不推荐这样做
第 3 步:-如果您的帐户启用了两步验证,或者想要使用您的 gmail 真实密码以外的密码,请尝试以下操作:- 单击您的 gmail 个人资料图片->单击管理您的 google 帐户->转到安全性选项卡->搜索应用程序密码->选择任何给定的应用程序名称->选择任何设备名称->单击生成->复制 16 位密码并将其粘贴到您必须输入 gmail 密码的应用程序中您真正的 gmail 密码。