在 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