C#에서 이메일 전송 기능 구현하기

  • 3 minutes to read

개요

이 강좌에서는 C#과 ASP.NET Core에서 이메일을 전송하는 기능을 구현하는 방법을 다룹니다. 이를 위해 IEmailSender 인터페이스를 정의하고 EmailSender 클래스를 구현하는 과정을 설명합니다.

IEmailSender 및 IMailchimpEmailSender 인터페이스 정의

인터페이스는 이메일 전송 기능을 제공하는 계약(contract) 역할을 합니다. 이를 통해 다양한 구현을 쉽게 교체할 수 있습니다.

인터페이스 코드

using System.Threading.Tasks;

namespace All.Services
{
    /// <summary>
    /// 이메일 전송 기능을 제공하는 인터페이스입니다.
    /// </summary>
    public interface IEmailSender
    {
        /// <summary>
        /// 비동기적으로 이메일을 전송합니다.
        /// </summary>
        /// <param name="email">수신자 이메일 주소</param>
        /// <param name="subject">이메일 제목</param>
        /// <param name="message">이메일 본문</param>
        /// <param name="isBodyHtml">이메일 본문을 HTML 형식으로 보낼지 여부(기본값: true)</param>
        Task SendEmailAsync(string email, string subject, string message, bool isBodyHtml = true);
    }

    public interface IMailchimpEmailSender
    {
        Task SendEmailAsync(string email, string subject, string message, bool isBodyHtml = true);
    }
}

appsettings.json 설정

{
    "AppKeys": {
        "SmtpServer": "smtp.mandrillapp.com",
        "SmtpUserName": "your-username",
        "SmtpPassword": "your-api-key",
        "SmtpEmail": "your-email@example.com"
    }
}

EmailSender 및 MailchimpEmailSender 클래스 구현

이제 IEmailSender 인터페이스를 구현하는 EmailSender 클래스를 생성합니다.

클래스 코드

using Microsoft.Extensions.Configuration;
using System;
using System.Net;
using System.Net.Mail;
using System.Threading.Tasks;

namespace Hawaso.Services
{
    public class EmailSender : All.Services.IEmailSender
    {
        public Task SendEmailAsync(string email, string subject, string message, bool isBodyHtml = true)
        {
            Console.WriteLine(message);
            return Task.CompletedTask;
        }
    }

    public class MailchimpEmailSender : All.Services.IMailchimpEmailSender
    {
        private const string REPLY_TO_EMAIL = "support@hawaso.com";
        private const string REPLY_TO_NAME = "Hawaso Team";

        private readonly string _smtpServer;
        private readonly string _smtpUserName;
        private readonly string _smtpPassword;
        private readonly string _smtpEmail;

        public MailchimpEmailSender(IConfiguration configuration)
        {
            _smtpServer = configuration["AppKeys:SmtpServer"];
            _smtpUserName = configuration["AppKeys:SmtpUserName"];
            _smtpPassword = configuration["AppKeys:SmtpPassword"];
            _smtpEmail = configuration["AppKeys:SmtpEmail"];
        }

        public async Task SendEmailAsync(string email, string subject, string message, bool isBodyHtml = true)
        {
            using var client = new SmtpClient(_smtpServer);
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(_smtpUserName, _smtpPassword);

            var mailMessage = new MailMessage
            {
                From = new MailAddress(_smtpEmail, REPLY_TO_NAME),
                Subject = subject,
                Body = message,
                IsBodyHtml = isBodyHtml
            };
            mailMessage.To.Add(email);
            mailMessage.ReplyToList.Add(new MailAddress(REPLY_TO_EMAIL, REPLY_TO_NAME));

            await client.SendMailAsync(mailMessage);
        }
    }
}

서비스 등록

ASP.NET Core에서 EmailSender 및 MailchimpEmailSender 서비스를 DI(의존성 주입) 컨테이너에 등록하여 사용할 수 있습니다.

Program.cs 파일에서 서비스 등록

builder.Services.AddTransient<IEmailSender, EmailSender>();
builder.Services.AddTransient<IMailchimpEmailSender, MailchimpEmailSender>();

컨트롤러에서 사용 예시

public class MailchipEmailTestController : Controller
{
    private readonly IEmailSender _emailSender;
    private readonly IMailchimpEmailSender _mailchimpEmailSender;

    public MailchipEmailTestController(IEmailSender emailSender, IMailchimpEmailSender mailchimpEmailSender)
    {
        _emailSender = emailSender;
        _mailchimpEmailSender = mailchimpEmailSender;
    }

    public async Task<IActionResult> SendTestEmail()
    {
        await _emailSender.SendEmailAsync("recipient@example.com", "Test Email", "This is a test email.");
        return Content("Basic email sent successfully!");
    }

    public async Task<IActionResult> SendMailchimpEmail()
    {
        await _mailchimpEmailSender.SendEmailAsync("recipient@example.com", "Mailchimp Email", "This is a Mailchimp test email.");
        return Content("Mailchimp email sent successfully!");
    }
}

결론

이 강좌에서는 IEmailSender 및 IMailchimpEmailSender 인터페이스를 정의하고 각각의 클래스를 구현하는 방법을 배웠습니다. 이를 통해 이메일 설정을 appsettings.json에서 관리할 수 있으며, 다양한 이메일 서비스를 연동할 수 있습니다.

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com