Swift - SMTP

Marble·2025년 2월 4일

SMTP란?

Simple Mail Transfer Protocol의 약어인 SMTP는 TCP/IP 프로토콜 스택의 애플리케이션 계층에서 작동하는 프로토콜로 이메일을 전송하기 위해 사용합니다. SMTP는 클라이언트-서버 모델을 기반으로 하며, 이메일 클라이언트와 이메일 서버간의 통신을 관리합니다.

작동 방식

SMTP의 작동 방식은 다음과 같습니다.

  • SMTP 연결 설정: 이메일 클라이언트는 SMTP 서버에 TCP 연결을 설정합니다. 클라이언트는 서버에 자신을 소개하기 위해 HELO 또는 EHLO 명령을 보냅니다. EHLO는 확장된 기능을 지원하는 경우 사용됩니다.

  • 메일 전송: 클라이언트는 MAIL FROM 명령을 사용하여 발신자 주소를 지정하고, RCPT TO 명령을 사용하여 수신자 주소를 지정합니다. 이 과정에서 여러 수신자를 지정할 수 있습니다.

  • 메일 전송 에이전트(MTA): 서버가 메일 전송 에이전트(MTA)라는 프로그램을 실행해서 수신자의 IP 주소를 찾습니다.

  • 데이터 전송: 수신자가 확인되면, 클라이언트는 DATA 명령을 보내고, 이메일의 본문과 헤더를 전송합니다.

  • 전송 완료: 서버는 이메일을 수신하고, 클라이언트에게 전송이 완료되었음을 알리는 응답을 보냅니다. 이후 서버는 이메일을 적절한 수신자 서버로 라우팅합니다.

  • 연결 종료: 모든 작업이 완료되면 클라이언트는 QUIT 명령을 보내어 연결을 종료합니다.

SwiftSMTP

SwiftSMTP는 이메일 전송을 위한 오픈 소스 라이브러리로 위에서 설명한 STMP 프로토콜을 사용하여 이메일을 쉽게 전송할 수 있도록 도와줍니다.

사용 방법

사용 방법은 다음과 같습니다.

  1. SPM 추가하기

  2. 메일을 위한 코드 작성하기

import SwiftUI
import SwiftSMTP

struct ContentView: View {
    var body: some View {
        VStack {
            Text("이메일 전송 예제")
                .font(.largeTitle)
                .padding()

            Button(action: sendEmail) {
                Text("이메일 전송")
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(8)
            }
        }
        .padding()
    }

    func sendEmail() {
        let smtp = SMTP(
            hostname: "smtp.gmail.com", // SMTP 서버 주소
            email: "your_email@gmail.com", // 발신자 이메일
            password: "your_password" // 발신자 이메일 비밀번호
        )

        let from = Mail.User(name: "Your Name", email: "your_email@gmail.com") // 발신자
        let to = Mail.User(name: "Recipient Name", email: "recipient_email@example.com") // 수신자

        let mail = Mail(
            from: from,
            to: [to],
            subject: "테스트 이메일",
            text: "안녕하세요! 이 이메일은 SwiftUI와 SwiftSMTP를 사용하여 전송된 테스트 이메일입니다."
        )

        smtp.send(mail) { error in
            if let error = error {
                print("이메일 전송 중 오류 발생: \(error)")
            } else {
                print("이메일이 성공적으로 전송되었습니다.")
            }
        }
    }
}
profile
개발자가 되고 싶은 공돌이

0개의 댓글