写在前面:
本人从去年开始负责公司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] 互相学习.