使用GO语言编写邮件接收服务器
使用Go语言编写的邮件接收服务器,并把收到的邮件存入mysql
保存文件名smtpserver.go
package main import ( "database/sql" "errors" "io" "io/ioutil" "log" "strings" "time" "github.com/emersion/go-smtp" _ "github.com/go-sql-driver/mysql" ) // The Backend implements SMTP server methods. type Backend struct{} func (bkd *Backend) NewSession(c *smtp.Conn) (smtp.Session, error) { return &Session{ RemoteAddr: c.Conn().RemoteAddr().String(), }, nil } // A Session is returned after EHLO. type Session struct { RemoteAddr string mail_from string rcpt_to []string data []byte } func (s *Session) AuthPlain(username, password string) error { return errors.New("AuthPlain is Disabled") if username != "username" || password != "password" { return errors.New("Invalid username or password") } return nil } func (s *Session) Mail(from string, opts *smtp.MailOptions) error { //log.Println("Mail from:", from) s.mail_from = from return nil } func (s *Session) Rcpt(to string) error { //log.Println("Rcpt to:", to) s.rcpt_to = append(s.rcpt_to, to) return nil } func (s *Session) Data(r io.Reader) error { if b, err := ioutil.ReadAll(r); err != nil { return err } else { //log.Println("Data:", string(b)) s.data = append(s.data, b...) } return nil } func (s *Session) Reset() { return s.mail_from = "" s.rcpt_to = []string{} s.data = []byte{} } func (s *Session) Logout() error { // 处理邮件 if s.mail_from == "" || len(s.rcpt_to) == 0 || len(s.data) == 0 { return nil } err := s.handleMail() if err != nil { log.Println(err) return err } return nil } func main() { be := &Backend{} s := smtp.NewServer(be) s.Addr = ":25" s.Domain = "localhost" s.ReadTimeout = 10 * time.Second s.WriteTimeout = 10 * time.Second s.MaxMessageBytes = 1024 * 1024 s.MaxRecipients = 50 s.AllowInsecureAuth = true log.Println("Starting server at", s.Addr) if err := s.ListenAndServe(); err != nil { log.Fatal(err) } } // 用于处理邮件的回调函数 func (s *Session) handleMail() error { rcpt_to := strings.Join(s.rcpt_to, ",") log.Println(s.RemoteAddr, "Mail from:", s.mail_from, ", to:", rcpt_to, ", data-len:", len(s.data)) // 将邮件存储到数据库 db, err := sql.Open("mysql", "firadio_mail:firadio_mail@tcp(39.101.248.243:3306)/firadio_mail") if err != nil { return err } defer db.Close() // 准备插入语句 stmt, err := db.Prepare("INSERT INTO emails (remote_addr, mail_from, rcpt_to, data) VALUES (?, ?, ?, ?)") if err != nil { return err } defer stmt.Close() // 执行插入语句 _, err = stmt.Exec(s.RemoteAddr, s.mail_from, rcpt_to, s.data) if err != nil { return err } return nil }
本文来自博客园,作者:项希盛,转载请注明原文链接:https://www.cnblogs.com/xiangxisheng/p/17153287.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构