123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- package services
- import (
- "crypto/tls"
- "eta/eta_api/models"
- "eta/eta_api/utils"
- "fmt"
- "strconv"
- "strings"
- "gopkg.in/gomail.v2"
- )
- func SendEmailToCompany() {
- // 获取收件人列表
- emailCond := " AND enabled = 1 AND status in (1,2) "
- //emailCond += ` AND email IN ('qychen@hzinsights.com','hsji@hzinsights.com') `
- //emailCond := ""
- emailPars := make([]interface{}, 0)
- emails, e := models.GetEnglishReportEmailList(emailCond, emailPars, "")
- if e != nil {
- fmt.Println("获取收件人列表失败, Err: " + e.Error())
- return
- }
- if len(emails) == 0 {
- fmt.Println("收件人列表为空")
- return
- }
- // TODO:这是HTML模板内容
- template := `<!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>Document</title>
- </head>
- <body>
- <div>
- <p>Hello,</p>
- <p></p>
- <p>We warmly welcome you to join our Oil & Shipping Market Sharing Session. The details of the meeting are as follows:</p>
- <p></p>
- <div style="font-weight: bold;">Event Details:</div>
- <ul>
- <li>Date: January 14, 2025</li>
- <li>Time: 4PM SGT/8AM GMT</li>
- </ul>
- <br/>
- <div style="font-weight: bold;">Agenda:</div>
- <p></p>
- <p>4:00-4:20pm Eyes on Sanctioned Oil -- Jackson Zhang, Oil Analyst at Horizon Insights</p>
- <p>4:20-4:40pm Near Term Drivers and Events That Drive Container Freight Rates -- Johnson Leung, Co-Founder at Linerlytica</p>
- <p>4:40-5:00pm 2025 Container Shipping Market Outlook -- Junchen Yu, Shipping Market Analyst at Nanhua Futures </p>
-
- <p style="margin-top: 50px;">
- <span>To </span>
- <span style="font-weight: bold;">RSVP</span>
- <span>, please scan the QR code on poster below or click here:</span>
- <a href="https://us06web.zoom.us/webinar/register/WN_G32A_sRYRjefbPTf-CAn_A">https://us06web.zoom.us/webinar/register/WN_G32A_sRYRjefbPTf-CAn_A</a>
- </p>
- <img style="max-width: 375px;width: 100%;" src="https://hzstatic.hzinsights.com/eta/cloud_disk/202501/20250113/BMW1oUdkKqOn0gRSHclihnBdCuuS.png" alt="">
- <p>If you have any questions, feel free to reach out to Eunice (myyu@hzinsights.com). We look forward to your participation! </p>
- <p></p>
- <p>Best regards,<br>Horizon Insights</p>
- </div>
- </body>
- </html>
- `
- // 推送信息
- sendData := make([]*EnglishReportSendEmailRequest, 0)
- for i := range emails {
- r := new(EnglishReportSendEmailRequest)
- r.EmailId = emails[i].Id
- r.Email = strings.Replace(emails[i].Email, " ", "", -1)
- r.Subject = "【Horizon Insights】Invitation to Oil & Shipping Market Update" // TODO:这是主题
- r.FromAlias = "Horizon FICC" // TODO:这是推送人(中文)
- r.HtmlBody = template
- sendData = append(sendData, r)
- }
- if len(sendData) == 0 {
- fmt.Println("无邮件可推送")
- return
- }
- // 请求阿里云接口批量推送
- aliEmail := new(AliyunEmail)
- resultList, e := aliEmail.BatchSendEmail(sendData)
- if e != nil {
- fmt.Println("批量推送失败, Err: " + e.Error())
- return
- }
- for _, r := range resultList {
- utils.FileLog.Info("email: %s, ok: %v, res: %s", r.Email, r.Ok, r.ResultData)
- if r.Ok {
- fmt.Println("发送成功")
- } else {
- fmt.Println("发送失败:" + r.ResultData)
- }
- }
- }
- type SendEmailReq struct {
- Title string `description:"标题"`
- Content string `description:"内容"`
- ToUser []string `description:"收信人邮箱"`
- }
- func SendEmail(req SendEmailReq) (success bool, err error) {
- if req.Title == "" {
- err = fmt.Errorf("邮件主题不可为空")
- return
- }
- if req.Content == "" {
- err = fmt.Errorf("邮件内容不可为空")
- return
- }
- if len(req.ToUser) <= 0 {
- err = fmt.Errorf("收信人不可为空")
- return
- }
- // 邮箱配置
- confMap, e := models.GetBusinessConf()
- if e != nil {
- err = fmt.Errorf("GetBusinessConf err: %s", e.Error())
- return
- }
- checkArr := []string{
- models.BusinessConfEmailServerHost, models.BusinessConfEmailServerPort,
- models.BusinessConfEmailSender, models.BusinessConfEmailSenderUserName,
- models.BusinessConfEmailSenderPassword,
- }
- for _, v := range checkArr {
- if confMap[v] == "" {
- err = fmt.Errorf("%s配置有误", v)
- return
- }
- }
- port, _ := strconv.Atoi(confMap[models.BusinessConfEmailServerPort])
- if port <= 0 {
- port = 587 // 默认587端口
- }
- m := gomail.NewMessage()
- m.SetHeader("From", confMap[models.BusinessConfEmailSender])
- m.SetHeader("To", req.ToUser...)
- m.SetHeader("Subject", req.Title)
- m.SetBody("text/html", req.Content)
- d := gomail.NewDialer(confMap[models.BusinessConfEmailServerHost], port, confMap[models.BusinessConfEmailSenderUserName], confMap[models.BusinessConfEmailSenderPassword])
- // 解决x509报错的问题。证书不通过。跳过证书验证
- config := &tls.Config{ServerName: confMap[models.BusinessConfEmailServerHost], InsecureSkipVerify: true}
- d.TLSConfig = config
- if e = d.DialAndSend(m); e != nil {
- err = fmt.Errorf("邮件发送失败, Err: %s", e.Error())
- return
- }
- success = true
- return
- }
|