백엔드 개발 Golang Golang이 SMTP 메일 전달 기능을 구현하는 방법

Golang이 SMTP 메일 전달 기능을 구현하는 방법

Apr 25, 2023 am 10:33 AM

Golang은 강력한 프로그래밍 언어로서 네트워크 프로그래밍 분야에서 특히 뛰어난 성능을 발휘합니다. 네트워크를 통해 통신할 때 Golang은 많은 편리한 도구와 라이브러리를 제공하며 그 중 하나가 SMTP 라이브러리입니다. 네트워크 전송 프로토콜인 SMTP 프로토콜은 이메일을 보내고 받는 데 사용되며 네트워크 통신의 중요한 부분입니다. 실제 애플리케이션에서는 수신된 이메일을 전달해야 하는 경우가 있습니다. 이 기사에서는 Golang이 SMTP 이메일 전달 기능을 구현하는 방법을 소개합니다.

  1. SMTP 소개

SMTP(Simple Mail Transfer Protocol)는 이메일을 보내고 받는 데 사용되는 텍스트 기반 메일 전송 프로토콜입니다. SMTP 프로토콜은 인터넷 표준 프로토콜 중 하나이며 이메일 전송의 핵심 프로토콜입니다. SMTP 프로토콜은 기본 전송 프로토콜로 TCP를 사용하고 전송 포트로 포트 25를 사용합니다.

SMTP에는 다음과 같은 기본 개념이 포함되어 있습니다.

  • 메일 보낸 사람: 메일을 보내야 하는 사용자 또는 시스템입니다.
  • 메일 수신자: 메일을 받아야 하는 사용자 또는 시스템입니다.
  • SMTP 클라이언트: 메일 전송을 위한 애플리케이션입니다.
  • SMTP 서버: 이메일 수신 및 전달을 위한 서버입니다.

SMTP 프로토콜 작업 흐름은 다음과 같습니다.

  • 클라이언트가 SMTP 서버에 연결됩니다.
  • 클라이언트는 통신 매개변수를 협상하기 위해 EHLO 명령을 서버에 보냅니다.
  • 클라이언트는 인증 정보를 서버로 보냅니다.
  • 클라이언트는 이메일 정보와 수신자 정보를 서버로 보냅니다.
  • 서버는 수신자 정보를 기반으로 수신 서버를 찾아 연결합니다.
  • 이메일 정보와 수신자 정보를 수신 서버로 보냅니다.
  • 수신 서버는 이메일을 해당 메일함에 저장합니다.
  1. SMTP 라이브러리 사용

Golang의 SMTP 라이브러리를 사용하면 쉽게 이메일을 보낼 수 있습니다. Golang의 SMTP 라이브러리는 SMTP 프로토콜을 기반으로 이메일 전송 기능을 구현하고 편리한 API 인터페이스를 제공합니다.

먼저 SMTP 서버에 접속하기 위해서는 SMTP 라이브러리에서 제공하는 Dial 기능을 이용해야 합니다. 이 기능은 SMTP 서버의 주소와 포트 번호, 사용자 이름과 비밀번호, 기타 정보를 전달해야 합니다.

func Dial(addr string, a Auth) (*클라이언트, 오류)

이 중 Auth 유형은 사용자 이름과 비밀번호를 포함한 SMTP 서버의 인증 정보를 나타냅니다. SMTP 서버에 연결하기 위한 샘플 코드는 다음과 같습니다.

import (

"net/smtp"
로그인 후 복사

)

func main() {

// 创建认证信息
auth := smtp.PlainAuth("", "smtp_username", "smtp_password", "smtp_host")

// 连接SMTP服务器
client, err := smtp.Dial("smtp_host:smtp_port")
if err != nil {
    panic(err)
}

// 登录SMTP服务器
err = client.Auth(auth)
if err != nil {
    panic(err)
}

// 退出SMTP服务器
defer client.Quit()
로그인 후 복사

}

SMTP 서버에 성공적으로 연결한 후 서버에 이메일 정보를 보낼 수 있습니다. SMTP 프로토콜의 요구 사항에 따라. 보낸 사람과 받는 사람 정보를 보내려면 smtp 라이브러리에서 제공하는 Mail 및 Rcpt 메서드를 사용해야 합니다. Mail 및 Rcpt 메소드의 샘플 코드는 다음과 같습니다.

//발신자 정보 보내기
func (c *Client) Mail(from string) error

//수신자 정보 보내기
func (c *Client) Rcpt( to string) error

이메일 정보를 보내려면 smtp 라이브러리에서 제공하는 Data 메소드를 사용하여 이메일 내용을 SMTP 서버로 보내야 합니다. Data 메소드의 샘플 코드는 다음과 같습니다.

//Send email content
func (c *Client) Data() (io.WriteCloser, error)

이메일을 보낸 후에는 연결을 닫고 사용해야 합니다. SMTP 서버를 종료하는 Quit 메소드. 코드는 다음과 같습니다.

// SMTP 서버 종료
func (c *Client) Quit() 오류

  1. 이메일 전달 기능 구현

이메일 전달 기능을 구현하려면 이메일을 보낸 후 이메일 내용을 지정된 수신자에게 전달해야 합니다. 따라서 지정된 SMTP 서버와 수신자에게 이메일 콘텐츠를 보내려면 Golang의 SMTP 라이브러리를 사용해야 합니다.

구체적인 단계는 다음과 같습니다.

  • 프로젝트의 포트 번호를 듣고 수신 이메일을 수락하세요.
  • 수신자와 발신자가 요구 사항을 충족하는지 확인하세요. 일치하는 경우 이메일 내용이 메일 유형으로 캡슐화되어 전달 서비스 주소로 전송됩니다.
  • 포워딩 서비스로부터 응답을 받아 이메일이 성공적으로 전달되었는지 확인하세요.

구체적인 구현 코드는 다음과 같습니다.

import (

"bytes"
"errors"
"fmt"
"log"
"net"
"net/smtp"
"strings"
로그인 후 복사

)

// Listening port
func ListenAndServe(addr string) error {

listener, err := net.Listen("tcp", addr)
if err != nil {
    return err
}

defer listener.Close()

for {
    conn, err := listener.Accept()
    if err != nil {
        log.Printf("Failed to accept connection (%s)", err)
        continue
    }

    go handleConnection(conn)
}
로그인 후 복사

}

// 수신된 이메일 처리
func handlerConnection(conn net .Conn) {

defer conn.Close()

// 读取邮件内容
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if err != nil {
    log.Printf("Failed to read connection (%s)", err)
    return
}

defer conn.Close()

// 解析邮件
message, err := parseMessage(buf[:n])
if err != nil {
    log.Printf("Failed to parse message (%s)", err)
    return
}

// 判断收件人和发件人是否符合要求
if !checkRecipient(message.Recipient) {
    log.Printf("Invalid recipient (%s)", message.Recipient)
    return
}

if !checkSender(message.Sender) {
    log.Printf("Invalid sender (%s)", message.Sender)
    return
}

// 构建SMTP客户端
auth := smtp.PlainAuth("", "smtp_username", "smtp_password", "smtp_host")
client, err := smtp.Dial("smtp_host:smtp_port")
if err != nil {
    log.Printf("Failed to connect SMTP server (%s)", err)
    return
}
defer client.Quit()

// 发送邮件内容
err = client.Mail("from_address")
if err != nil {
    log.Printf("Failed to send 'MAIL FROM' command (%s)", err)
    return
}

err = client.Rcpt(message.Recipient)
if err != nil {
    log.Printf("Failed to send 'RCPT TO' command (%s)", err)
    return
}

w, err := client.Data()

if err != nil {
    log.Printf("Failed to send 'DATA' command (%s)", err)
    return
}

defer w.Close()

buf.WriteString(fmt.Sprintf("To: %s\r\n", message.Recipient))
buf.WriteString(fmt.Sprintf("From: %s\r\n", message.Sender))
buf.WriteString(fmt.Sprintf("Subject: %s\r\n", message.Subject))
buf.WriteString("\r\n")
buf.WriteString(message.Body)

_, err = w.Write(buf.Bytes())
if err != nil {
    log.Printf("Failed to write email to client (%s)", err)
    return
}

log.Printf("Mail sent to %s", message.Recipient)
로그인 후 복사

}

// 이메일 내용 구문 분석
func parseMessage(message []byte) (*Message, error) {

var msg Message
msg.Body = string(message)

// 提取发件人地址
start := bytes.Index(message, []byte("From: "))
if start == -1 {
    return nil, errors.New("Failed to find 'From:' in message")
}

start += 6
end := bytes.Index(message[start:], []byte("\r\n"))
if end == -1 {
    return nil, errors.New("Failed to find end of 'From:' in message")
}

msg.Sender = string(message[start : start+end])

// 提取收件人地址
start = bytes.Index(message, []byte("To: "))
if start == -1 {
    return nil, errors.New("Failed to find 'To:' in message")
}

start += 4
end = bytes.Index(message[start:], []byte("\r\n"))
if end == -1 {
    return nil, errors.New("Failed to find end of 'To:' in message")
}

msg.Recipient = string(message[start : start+end])

// 提取邮件主题
start = bytes.Index(message, []byte("Subject: "))
if start == -1 {
    return nil, errors.New("Failed to find 'Subject:' in message")
}

start += 9
end = bytes.Index(message[start:], []byte("\r\n"))
if end == -1 {
    return nil, errors.New("Failed to find end of 'Subject:' in message")
}

msg.Subject = string(message[start : start+end])

return &msg, nil
로그인 후 복사

}

// 수신자가 합법적인지 확인
func checkRecipient (수신자 문자열) bool {

// 收件人地址必须以@mydomain.com结尾
return strings.HasSuffix(recipient, "@mydomain.com")
로그인 후 복사

}

// 보낸 사람이 합법적인지 확인
func checkSender(sender string) bool {

// 任意发件人地址均合法
return true
로그인 후 복사

}

// 이메일 구조
type 메시지 구조 {

Sender    string
Recipient string
Subject   string
Body      string
로그인 후 복사

}

  1. 결론

Golang의 SMTP 라이브러리를 통해 이메일의 전송 및 전달 기능을 쉽게 구현할 수 있습니다. SMTP 이메일 전달을 구현할 때 이메일 내용의 보안을 보장하기 위해 수신자와 발신자 확인에 주의해야 합니다. 실제 애플리케이션에서 SMTP 이메일 전달 기능은 기업 내부 이메일 전달, 소셜 네트워크에서의 메시지 전달 등과 같은 다양한 시나리오에 적용될 수 있습니다.

위 내용은 Golang이 SMTP 메일 전달 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Debian Openssl의 취약점은 무엇입니까? Debian Openssl의 취약점은 무엇입니까? Apr 02, 2025 am 07:30 AM

보안 통신에 널리 사용되는 오픈 소스 라이브러리로서 OpenSSL은 암호화 알고리즘, 키 및 인증서 관리 기능을 제공합니다. 그러나 역사적 버전에는 알려진 보안 취약점이 있으며 그 중 일부는 매우 유해합니다. 이 기사는 데비안 시스템의 OpenSSL에 대한 일반적인 취약점 및 응답 측정에 중점을 둘 것입니다. DebianopensSL 알려진 취약점 : OpenSSL은 다음과 같은 몇 가지 심각한 취약점을 경험했습니다. 심장 출혈 ​​취약성 (CVE-2014-0160) :이 취약점은 OpenSSL 1.0.1 ~ 1.0.1F 및 1.0.2 ~ 1.0.2 베타 버전에 영향을 미칩니다. 공격자는이 취약점을 사용하여 암호화 키 등을 포함하여 서버에서 무단 읽기 민감한 정보를 사용할 수 있습니다.

PPROF 도구를 사용하여 GO 성능을 분석하는 방법은 무엇입니까? PPROF 도구를 사용하여 GO 성능을 분석하는 방법은 무엇입니까? Mar 21, 2025 pm 06:37 PM

이 기사는 프로파일 링 활성화, 데이터 수집 및 CPU 및 메모리 문제와 같은 일반적인 병목 현상을 식별하는 등 GO 성능 분석을 위해 PPROF 도구를 사용하는 방법을 설명합니다.

GO에서 단위 테스트를 어떻게 작성합니까? GO에서 단위 테스트를 어떻게 작성합니까? Mar 21, 2025 pm 06:34 PM

이 기사는 GO에서 단위 테스트 작성, 모범 사례, 조롱 기술 및 효율적인 테스트 관리를위한 도구를 다루는 것에 대해 논의합니다.

GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? GO에서 플로팅 포인트 번호 작업에 어떤 라이브러리가 사용됩니까? Apr 02, 2025 pm 02:06 PM

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

GO에서 테이블 구동 테스트를 어떻게 사용합니까? GO에서 테이블 구동 테스트를 어떻게 사용합니까? Mar 21, 2025 pm 06:35 PM

이 기사는 테스트 케이스 테이블을 사용하여 여러 입력 및 결과로 기능을 테스트하는 방법 인 GO에서 테이블 중심 테스트를 사용하는 것에 대해 설명합니다. 가독성 향상, 중복 감소, 확장 성, 일관성 및 A와 같은 이점을 강조합니다.

Go의 반사 패키지의 목적을 설명하십시오. 언제 반사를 사용 하시겠습니까? 성능의 영향은 무엇입니까? Go의 반사 패키지의 목적을 설명하십시오. 언제 반사를 사용 하시겠습니까? 성능의 영향은 무엇입니까? Mar 25, 2025 am 11:17 AM

이 기사는 코드의 런타임 조작, 직렬화, 일반 프로그래밍에 유리한 런타임 조작에 사용되는 GO의 반사 패키지에 대해 설명합니다. 실행 속도가 느리고 메모리 사용이 높아짐, 신중한 사용 및 최고와 같은 성능 비용을 경고합니다.

GO.MOD 파일에 종속성을 어떻게 지정합니까? GO.MOD 파일에 종속성을 어떻게 지정합니까? Mar 27, 2025 pm 07:14 PM

이 기사에서는 GO.MOD를 통해 GO 모듈 종속성 관리, 사양, 업데이트 및 충돌 해상도를 포함합니다. 시맨틱 버전 작성 및 정기 업데이트와 같은 모범 사례를 강조합니다.

Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Go 's Crawler Colly의 큐 스레드의 문제는 무엇입니까? Apr 02, 2025 pm 02:09 PM

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

See all articles