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

  • 3 minutes to read

개요

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

IEmailSenderIMailchimpEmailSender 인터페이스 정의

인터페이스는 이메일 전송 기능을 제공하는 계약(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"
    }
}

EmailSenderMailchimpEmailSender 클래스 구현

이제 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에서 EmailSenderMailchimpEmailSender 서비스를 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!");
    }
}

결론

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

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com