带有Button_Click事件的 C# 电子邮件



我正在尝试创建一个向Gmail帐户发送电子邮件的Button_Click事件。 这是我得到的错误:

无法从传输连接读取数据:net_io_connectionclosed。

它指出了第 63 行,即:

client.Send(mail);

这是代码:

protected void Button2_Click(object sender, EventArgs e)
{
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
SmtpClient client = new SmtpClient();
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = "smtp.gmail.com";
mail.IsBodyHtml = true;
mail.To.Add(new MailAddress("yourclassroomconnection@gmail.com"));
mail.From = new MailAddress("yourclassroomconnection@gmail.com");
mail.Subject = "New Order";
string bodyTemplate = Label2.Text;
mail.Body = bodyTemplate;
client.Send(mail);
}

知道我哪里出错了吗?

您可以使用以下代码作为小型测试。尝试使用最少的选项发送电子邮件。然后添加其他选项,如 html 支持。因此,当您尝试新事物时,您可以缩小问题范围。

try {
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("your_email_address@gmail.com");
mail.To.Add("to_address");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
} catch (Exception ex)
{
}

您需要生成应用专用密码并在此处使用它,而不是您的Gmail密码。

也请阅读本教程。 http://csharp.net-informations.com/communications/csharp-smtp-mail.htm

硬编码用户名和密码(即凭据)有时可能会令人沮丧。 您可以做的是,您只能在web.config文件中添加一次这些凭据。你很好去。这是更好的解决方案。

web.config文件代码如下:

<configuration> 
<appSettings>
<add key="receiverEmail" value ="ReceiverEmailAddressHere"/>
</appSettings>
</appSettings> 
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="yourclassroomconnection@gmail.com"> 
<network host="smtp.gmail.com" port="587" enableSsl="true" 
userName="YourActualUsername" password="YourActualPassword"/>
</smtp>
</mailSettings>
</system.net>
</configuration>

请注意,您必须根据您的Gmail帐户更改主机。我不确定主机是否正确。我正在使用 Outlook 发送电子邮件,以便主机smtp-mail.outlook.com

这就是您的 web.config 文件如何具有您一次在一个位置定义的所有必要的连接凭据。您不必每次在应用程序中使用电子邮件功能时都使用它。

protected void btnSendMail_Click(object sender, EventArgs e)
{
MailMessage msg = new MailMessage();
// get the receiver email address from web.config
msg.To.Add(ConfigurationManager.AppSettings["receiverEmail"]);

// get sender email address path from web.config file
var address = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
string emailAddress = address.Network.UserName;
string password = address.Network.Password;
NetworkCredential credential = new NetworkCredential(emailAddress, password);
msg.Subject = " Subject text here "
}
SmtpClient client = new SmtpClient();
client.EnableSsl = true;  
client.Send(msg);   // send the message

这里的关键点是访问发件人的电子邮件地址和收件人的电子邮件地址。请注意,我使用了(SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");这将导航您的 web.config 文件并搜索其中可用的层次结构 - 获取电子邮件地址,如果未获取电子邮件地址,则失败。

希望这有帮助。祝您编码愉快!

最新更新