C#에서 첨부 파일이 있는 이메일 보내기

Saad Aslam 2023년10월12일
  1. C#에서 첨부 파일이 있는 이메일을 보내는 데 사용할 양식 만들기
  2. C#에 첨부된 이메일 보내기
C#에서 첨부 파일이 있는 이메일 보내기

이 자습서에서는 C#에서 SMTP 클라이언트를 사용하여 첨부 파일이 있는 이메일을 보내는 방법을 보여줍니다.

NET 및 .NET Core에는 System.Net.Mail 네임스페이스를 통해 이메일을 보내는 기능이 내장되어 있습니다. 가장 쉬운 옵션일 수 있지만 SMTP 서버가 필요합니다.

기존 Gmail 계정을 사용하거나 새 계정을 만들어 SMTP를 통해 이메일을 보내세요. Google의 SMTP 서버를 활용하려면 프로필의 보안 탭에서 보안 수준이 낮은 앱 액세스를 활성화해야 합니다.

C#에서 첨부 파일이 있는 이메일을 보내는 데 사용할 양식 만들기

먼저 Visual Studio에서 새 Windows Form 응용 프로그램을 만듭니다.

.cs 디자인 파일을 열고 양식 내부에 패널을 만듭니다. Compose, label1 텍스트가 있는 레이블을 추가하고 가장 오른쪽에 X를 추가하여 이 양식을 닫습니다.

기능을 추가하려면 레이블을 두 번 클릭하면 label_Click 기능으로 이동합니다. 내부에 다음 줄을 작성하십시오.

this.Dispose();

다음과 같이 5개의 텍스트 상자를 만듭니다.

  • txtFrom
  • txtPassword
  • txtTo
  • txtTitle
  • txtBody

txtPassword 텍스트 상자의 passwordChar 속성에 문자(* 또는 )를 추가하여 오른쪽 하단 솔루션 탐색기 패널에서 사용자가 입력한 암호를 숨깁니다.

내부에 Send가 포함된 btnSend라는 이름의 버튼을 만들고 파란색으로 지정합니다. 이 버튼을 누르면 대상 이메일 주소로 이메일이 전송됩니다.

이제 파일을 보내기 전에 이메일에 첨부할 수 있는 버튼과 선택한 파일 경로를 표시하는 레이블이 하나 더 필요합니다. 따라서 LinkLabel을 만들고 이름을 linkLabel1로 지정하고 레이블은 lblLocation으로 지정하겠습니다.

솔루션 탐색기에서 LinkLabel 이미지와 Attach File 텍스트를 할당합니다. 이제 .cs 양식 디자인 파일에서 이 LinkLabel을 두 번 클릭하면 이 버튼 클릭 기능 코드로 이동합니다.

이 함수 내에서 대화 상자를 열어야 합니다. 그러나 그 전에 OpenFileDialog를 양식 디자인으로 끌어다 놓고 Attach File 버튼에 연결해야 합니다.

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의 새 인스턴스를 초기화합니다. Gmail 간에 메일을 교환해야 하기 때문에 smtp.gmail.com을 전달합니다.

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);

Gmail에서 사용하는 포트, 보낸 사람의 이메일 주소, 비밀번호를 비롯한 일부 값을 SMTP에 할당해야 합니다. 데이터를 안전하게 전송하려면 SSL(Secure Sockets Layer)을 활성화해야 합니다.

그런 다음 Send() 메서드를 호출하고 메일을 전달합니다. 메일을 보낸 후 정보 아이콘과 확인 버튼이 있는 메시지를 표시할 메시지 상자를 만들어 보겠습니다.

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) {}
  }
}

출력:

첨부 파일이 포함된 이메일을 보내려면 양식을 작성했습니다

보내기를 누르면 다음 메시지 상자가 나타납니다.

첨부 파일이 있는 이메일을 성공적으로 보냈습니다

작가: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

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

관련 문장 - Csharp Email