Golang이 SMTP 메일 전달 기능을 구현하는 방법
Golang은 강력한 프로그래밍 언어로서 네트워크 프로그래밍 분야에서 특히 뛰어난 성능을 발휘합니다. 네트워크를 통해 통신할 때 Golang은 많은 편리한 도구와 라이브러리를 제공하며 그 중 하나가 SMTP 라이브러리입니다. 네트워크 전송 프로토콜인 SMTP 프로토콜은 이메일을 보내고 받는 데 사용되며 네트워크 통신의 중요한 부분입니다. 실제 애플리케이션에서는 수신된 이메일을 전달해야 하는 경우가 있습니다. 이 기사에서는 Golang이 SMTP 이메일 전달 기능을 구현하는 방법을 소개합니다.
- SMTP 소개
SMTP(Simple Mail Transfer Protocol)는 이메일을 보내고 받는 데 사용되는 텍스트 기반 메일 전송 프로토콜입니다. SMTP 프로토콜은 인터넷 표준 프로토콜 중 하나이며 이메일 전송의 핵심 프로토콜입니다. SMTP 프로토콜은 기본 전송 프로토콜로 TCP를 사용하고 전송 포트로 포트 25를 사용합니다.
SMTP에는 다음과 같은 기본 개념이 포함되어 있습니다.
- 메일 보낸 사람: 메일을 보내야 하는 사용자 또는 시스템입니다.
- 메일 수신자: 메일을 받아야 하는 사용자 또는 시스템입니다.
- SMTP 클라이언트: 메일 전송을 위한 애플리케이션입니다.
- SMTP 서버: 이메일 수신 및 전달을 위한 서버입니다.
SMTP 프로토콜 작업 흐름은 다음과 같습니다.
- 클라이언트가 SMTP 서버에 연결됩니다.
- 클라이언트는 통신 매개변수를 협상하기 위해 EHLO 명령을 서버에 보냅니다.
- 클라이언트는 인증 정보를 서버로 보냅니다.
- 클라이언트는 이메일 정보와 수신자 정보를 서버로 보냅니다.
- 서버는 수신자 정보를 기반으로 수신 서버를 찾아 연결합니다.
- 이메일 정보와 수신자 정보를 수신 서버로 보냅니다.
- 수신 서버는 이메일을 해당 메일함에 저장합니다.
- 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() 오류
- 이메일 전달 기능 구현
이메일 전달 기능을 구현하려면 이메일을 보낸 후 이메일 내용을 지정된 수신자에게 전달해야 합니다. 따라서 지정된 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
}
- 결론
Golang의 SMTP 라이브러리를 통해 이메일의 전송 및 전달 기능을 쉽게 구현할 수 있습니다. SMTP 이메일 전달을 구현할 때 이메일 내용의 보안을 보장하기 위해 수신자와 발신자 확인에 주의해야 합니다. 실제 애플리케이션에서 SMTP 이메일 전달 기능은 기업 내부 이메일 전달, 소셜 네트워크에서의 메시지 전달 등과 같은 다양한 시나리오에 적용될 수 있습니다.
위 내용은 Golang이 SMTP 메일 전달 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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