Bootstrap

go如何发送邮件

 写在前面:

 本人从去年开始负责公司go项目,所以还在不断学习总结中,如果某些地方解释不对,请大佬多多批评,一定虚心接受并学习改正.

     昨天,我用java写了一个定时发送邮件的功能,因为本人目前在公司负责java和go的项目,所以,一般java实现的功能,我本人都喜欢换语言来实现一遍,一是为了比较他们的不同之处,二是防止手生,多写代码,毕竟是有好处的,下面我就将我自己写的关于go实现邮件发送功能的demo 记录下来,主要是在前两天搭建的(iris+gorm)中来写的,所以需要先搭建一个这个框架,或者直接使用main方法来测试)

一: 在models中建立一个mail的结构体

package models



type Email struct {
	FormEmail        *string           //发件人邮箱
	Password         *string           //授权码,不是密码哦
	Host             *string           // 地址
	ToEmail          *string           //收件人邮箱
	EmailData        *string           //邮件内容
	EmailTopic       *string          //主题
	EmailHeader      *string         //邮件标题头
}

二: 建立一个发送邮件的controller 

package controllers

import (
	"github.com/kataras/iris/context"
	"iris_demo/models"
	"iris_demo/service"
)

type MailController struct {
	Service service.MailService
}
func NewMailController() *MailController {
	return &MailController{Service:service.NewMailService()}
}


//发送邮件
func (m MailController)PostSendEmail(ctx context.Context) (str string ,er error){
	mail := new(models.Email)
	ctx.ReadForm(mail)
	err := m.Service.PostSendEmail(*mail)
	if err != nil {
		return  "",err
	}
	return *mail.FormEmail+"发送"+*mail.ToEmail+"的邮件发送成功",nil
}

三: 建立一个发送邮件的service,写短信发送的相关功能

package service

import (
	"iris_demo/models"
	"net/smtp"
	"strings"
)

type MailService interface {
	PostSendEmail(mail models.Email)error
}


type mailService struct {}

func NewMailService() MailService{
	return &mailService{}
}

func(m *mailService)PostSendEmail(mail models.Email)error{
	auth := smtp.PlainAuth("", *mail.FormEmail, *mail.Password, *mail.Host)
	split := strings.Split(*mail.ToEmail, ",") //此处写可以多个邮箱逗号隔开
	to := split
	emailHeader := *mail.EmailHeader
	user := *mail.FormEmail
	subject := *mail.EmailTopic
	contentType := "Content-Type: text/plain; charset=UTF-8"
	body := *mail.EmailData
	msg := []byte("To: " + strings.Join(to, ",") + "\r\nFrom: " + emailHeader +
		"<" + user + ">\r\nSubject: " + subject + "\r\n" + contentType + "\r\n\r\n" + body)
	err := smtp.SendMail("smtp.qq.com:25", auth, user, to, msg)
	if err != nil {
		return err
	}
	return nil
}

四: 在我们的路由设置的地方增加一个新的路由

package route

import (
"github.com/kataras/iris"
"github.com/kataras/iris/mvc"
"iris_demo/controllers"
)

func InitRouter(app *iris.Application) {
	bathUrl := "/api"
	mvc.New(app.Party(bathUrl +"/user")).Handle(controllers.NewUserController())
	mvc.New(app.Party(bathUrl +"/mail")).Handle(controllers.NewMailController())
}

五:postman测试

返回结果显示发送到两个邮箱成功,然后我们去邮箱看一下.可以发现两个邮箱全部成功

qq邮箱

163邮箱 

 

到此,功能全部实现了,下一节我在加一个定时任务来发送,有问题讨论请发送邮件到 [email protected] 互相学习.

 

;