在 C# 中发送带附件的电子邮件
本教程将演示如何使用 C# 中的 SMTP 客户端发送带附件的电子邮件。
NET 和 .NET Core 具有通过 System.Net.Mail 命名空间发送电子邮件的内置功能。虽然这可能是最简单的选择,但这需要一个 SMTP 服务器。
使用你现有的 Gmail 帐户或创建一个新帐户以通过 SMTP 发送电子邮件。你必须在你的个人资料的安全选项卡上启用安全性较低的应用访问,才能使用 Google 的 SMTP 服务器。
在 C#
中创建一个用于发送带有附件的电子邮件的表单
首先,在 Visual Studio 中创建一个新的 Windows 窗体应用程序。
打开你的 .cs
设计文件并在表单中创建一个面板。添加带有文本 Compose
、label1
的标签,并在最右侧添加 X
以关闭此表单。
要添加功能,请双击标签,它会将你导航到 label_Click
功能。在里面写下下面这行。
this.Dispose();
创建 5 个文本框,命名如下:
txtFrom
txtPassword
txtTo
txtTitle
txtBody
在 txtPassword
文本框中,在 passwordChar
属性中添加一个字符(*
或 •
)以隐藏用户在解决方案资源管理器右下角输入的密码。
创建一个名为 btnSend
的按钮,其中包含 Send
,并将其指定为蓝色。此按钮会将电子邮件发送到其目标电子邮件地址。
现在,你需要一个按钮来在发送之前将文件附加到你的电子邮件中,并需要一个标签来显示选定的文件路径。因此,让我们创建一个 LinkLabel 并将其命名为 linkLabel1
和一个名为 lblLocation
的标签。
从解决方案资源管理器中为 LinkLabel 分配一个图像和一个文本附加文件
。现在,在你的 .cs
表单设计文件中双击此 LinkLabel,它会将你导航到单击此按钮的功能代码。
在这个函数内部,我们需要打开一个对话框。但在此之前,你必须将 OpenFileDialog 拖放到表单设计中并将其连接到 附加文件
按钮。
我们将在 linkLabel1_linkClicked
函数中编写以下代码来打开对话框并连接其选定的文件路径以显示在 lblLocation
中。
openFileDialog1.ShowDialog();
lblLocation.Text = openFileDialog1.FileName;
输出:
现在一切准备就绪,收集发件人的电子邮件和密码、收件人电子邮件、邮件和附件。让我们编写功能代码以使用 SMTP 客户端发送电子邮件。
双击我们在表单设计中创建的发送
按钮。在其 button1_Click
函数中,我们将执行以下操作。
在 C#
中发送带附件的电子邮件
首先,创建一个 try-catch
语句块。程序执行尝试 try
块,如果发生任何错误,它会自动捕获异常。
try {
} catch () {
}
在 try
块中,我们声明了一个名为 mail
的数据类型 MailMessage 变量,并初始化其默认构造函数 MailMessage()
以在电子邮件发送过程中使用其属性。
MailMessage mail = new MailMessage();
现在,声明另一个数据类型为 SmtpClient 的变量 smtp
,并初始化需要字符串主机的 SmtpClient 的新实例。我们通过 smtp.gmail.com
因为我们需要在 Gmail 之间交换邮件。
SmtpClient smtp = new SmtpClient("smtp.gmail.com");
然后,我们将使用 MailMessage 类的 .From
、.To.Add()
、.Subject
和 .Body
,并为它们分配我们文本框的值。
mail.From = new MailAddress(txtFrom.Text);
mail.To.Add(txtTo.Text);
mail.Subject = txtTitle.Text;
mail.Body = txtBody.Text;
然后,我们需要将选定的文件附加到邮件中。我们将创建一个 System.Net.Mail.Attachment
数据类型的变量 attachment
并为其分配所选文件的路径。
使用 .Attachments.Add()
方法通过将附件传递给邮件,将文件附加到邮件中。
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(lblLocation.Text);
mail.Attachments.Add(attachment);
我们需要为 SMTP 分配一些值,包括 Gmail 使用的端口、发件人的电子邮件地址和密码。我们应该启用 SSL(安全套接字层)来安全地传输数据。
然后,我们调用 Send()
方法并传递我们的邮件。发送邮件后,让我们创建一个消息框,其中将显示带有信息图标和 OK 按钮的消息。
smtp.Port = 587;
smtp.Credentials = new System.Net.NetworkCredential(txtFrom.Text, txtPassword.Text);
smtp.EnableSsl = true;
smtp.Send(mail);
MessageBox.Show("Mail has been sent successfully!", "Email Sent", MessageBoxButtons.OK,
MessageBoxIcon.Information);
现在,catch
块将包含以下代码。这些代码行将捕获发生的任何异常并将其输出到 MessageBox。
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
完整的源代码
using System;
using System.Net.Mail;
namespace send_email_with_attachment {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e) {
this.Dispose();
}
private void label5_Click(object sender, EventArgs e) {}
private void label7_Click(object sender, EventArgs e) {}
private void button1_Click(object sender, EventArgs e) {
try {
MailMessage mail = new MailMessage();
SmtpClient smtp = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress(txtFrom.Text);
mail.To.Add(txtTo.Text);
mail.Subject = txtTitle.Text;
mail.Body = txtBody.Text;
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(lblLocation.Text);
mail.Attachments.Add(attachment);
smtp.Port = 587;
smtp.Credentials = new System.Net.NetworkCredential(txtFrom.Text, txtPassword.Text);
smtp.EnableSsl = true;
smtp.Send(mail);
MessageBox.Show("Mail has been sent successfully!", "Email Sent", MessageBoxButtons.OK,
MessageBoxIcon.Information);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
openFileDialog1.ShowDialog();
lblLocation.Text = openFileDialog1.FileName;
}
private void txtFrom_TextChanged(object sender, EventArgs e) {}
}
}
输出:
按发送,将出现以下消息框。
I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.
LinkedIn