这里给大家一个集成2个插件发邮件的思路,可以根据需求灵活改变
前言
首先我们看一下这个项目得整体的目录结构如下图:
一、配置文件
1、创建yaml
在rpc服务中etc配置中新建一组关于email的相关配置的yaml
Email:
Template: template/emailtemplate.html
Host: smtp-mail.outlook.com
Username: no-reply@xxx.com
Password: xxxxxx
Port: "587"
FromEmail: no-reply@xxx.com
Protocol: smtp-mail.outlook.com
Address: http://www.xxx.ca/
二、jordan-wright发送邮件核心方法
1、发送邮件核心方法
创建路径如图所示:
package email
import (
"context"
"crypto/tls"
"git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/simbam-go-common.git/xerr"
"git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/simbam-go-email.git/rpc/internal/common/module"
"github.com/jordan-wright/email"
"github.com/zeromicro/go-zero/core/logx"
)
type (
EmailConfig struct {
Host string
Username string
Password string
Port string
Protocol string
Address string
Template string
FromEmail string
}
SendmailClient interface {
Sendmail(to []string, text []byte, subject string) error
}
)
func NewEmail(email EmailConfig) SendmailClient {
return &email
}
核心代码如下:
*这里稍微说明一点,就是当我们需要发送模板这种html需要渲染的文件时,要发送Html,如果只是文字传Text即可*
func (l *EmailConfig) Sendmail(to []string, text []byte, subject string) error {
e := email.NewEmail()
e.From = l.FromEmail
e.To = to
e.HTML = text
e.Subject = subject
addr := l.Host + ":" + l.Port
auth := module.LoginAuth(l.Username, l.Password)
tlsConfig := &tls.Config{
ServerName: l.Host,
}
err := e.SendWithStartTLS(addr, auth, tlsConfig)
if err != nil {
logx.WithContext(context.Background()).Errorf(err.Error())
return xerr.NewErrCode(xerr.EMAIL_SEND_ERROR)
}
return nil
}
三、创建template模板页面
1、html模板创建
这里截取一段模板html代码来做解释
<html>
<head></head>
<body>
<p><font color="#333333"><span style="font-size:12px">
<span style="font-family:Helvetica, sans-serif"> {{ companyName }}</span></span></font> </p>
<p><font color="#333333"><span style="font-size:12px">
<span style="font-family:Helvetica, sans-serif">Email: {{email}}</span></span><br /><span style="font-size:12px">
<span style="font-family:Helvetica, sans-serif">Address: {{address|safe}}</span></span></font> </p>
</body>
</html>
这里十分重要!!!!! 在模板中使用俩个花括号来设置为变量如:{{ 变量 }} 但是如果我们的变量里面也是含有html元素的时候这时候需要加上 safe的关键字 下面是官方说明的截图:
由于pango为 django的go版本,所以这个内容可以完全以如下文档为主 文档地址:Django 模板语言的文档地址
四、渲染 template模板
1、模板表(仅供参考)
CREATE TABLE `sys_email_template` (
`id` bigint NOT NULL AUTO_INCREMENT,
`site_id` bigint DEFAULT NULL,
`brand` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`company_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`route` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`email` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`address` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`service_type` bigint DEFAULT NULL,
`tel` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`context1` text COLLATE utf8mb4_general_ci,
`context2` text COLLATE utf8mb4_general_ci,
`is_del` datetime DEFAULT NULL,
`create_at` datetime(3) DEFAULT NULL,
`update_at` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2、渲染html
从数据库中抽取模板数据渲染html
3、调用上面发送邮件方法
将组装好的数据,根据上面方法的入参传入即可完成发送 如下图:(发送成功图片)
五、拿来即用系列(email发送demo)
上面将整体的架构思路阐述清晰后,大家根据自己的业务进行相应的调整 下面给大家直接运行可用的demo 毕竟大多数人是懒得自己写的
package main
import (
"crypto/tls"
"fmt"
"github.com/jordan-wright/email"
"gomail/module"
)
func main() {
e := email.NewEmail()
e.From = "123@xx.com"
e.To = []string{"123@xx.com"}
e.Text = []byte("Text Body is, of course, supported!")
e.Subject = "hello"
addr := "smtp-mail.outlook.com:端口"
auth := module.LoginAuth("123@xx.com", "zxxxx")
tlsConfig := &tls.Config{
ServerName: "smtp-mail.outlook.com",
}
err := e.SendWithStartTLS(addr, auth, tlsConfig)
if err != nil {
fmt.Printf(err.Error())
}
}
|