寫在前面:
本人從去年開始負責公司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] 互相學習.