Golang email not proper format on the body with template

45 Views Asked by At

Got this code to send-email with template in Go, so that in the future it's easy to just modify the template if needed more variables and presentable for others to see.

package main

import (
    "bytes"
    "strings"
    "text/template"
    "net/smtp"
    "log"
)

type Email_struct struct {
    Status      string
    App         string
    Project     string
    TargetEnv   string
    AppVersion  string
    Url string
}

func SendmaiL(emailTo string, e Email_struct) bool {    
    from := "[email protected]"
    to := []string{
        emailTo,
    }

    var tmplFile = "email.tmpl"
    tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)
    if err != nil {
        panic(err)
    }
    var tpl bytes.Buffer
    if err := tmpl.Execute(&tpl, e); err != nil {
        panic(err)
    }
    message := tpl.Bytes()
    log.Print(string(message[:])) // print

    // Sending email.
    errs := smtp.SendMail("mail.domain.com:25", nil, from, to, message) 
    if errs != nil {
        log.Println(errs)
        return false
    }
    return true
}

func main() {
    // nl := "\r"

    em := Email_struct{}
    em.Status = "Synced"
    app := "pipeline-gitops-notification-sit"
    em.App = app
    // em.Project = app + nl
    em.Project = app
    GitopsFolder := "gitops/sit"
    extractTargetEnv := strings.Split(GitopsFolder, "/") 
    // em.TargetEnv = extractTargetEnv[1] + nl
    em.TargetEnv = extractTargetEnv[1] 
    mes := "Manifest-63db30e: qa-0.0.110 by [email protected]"
    extractVersion1 := strings.Split(mes, "-")
    extractVersion2 := strings.Split(extractVersion1[2], ".")
    extractVersion3 := strings.Split(extractVersion2[2], " ")
    // em.AppVersion = extractVersion2[0]+"."+extractVersion2[1]+"."+extractVersion3[0]  + nl
    em.AppVersion = extractVersion2[0]+"."+extractVersion2[1]+"."+extractVersion3[0] 
    RepoUrl := "https://cd.toronto.ca:6443/devops/pipeline/gitops-notification.git"
    em.Url = RepoUrl

    success := SendmaiL("[email protected]", em) 
    if success {
        log.Println("Email SUCCESS to sent!")
    } else {
        log.Println("Email FAILED to send!")
    }

}

With a template file email.tmpl,

Subject: [{{ .Status }}] app {{ .App }} has been synced by argoCD

Project: {{ .Project }}
Target : {{ .TargetEnv }}
Version: {{ .AppVersion }}
URL: {{ .Url }}

Best regards,
Devops Team

The desired email body should be (no issue with subject),

Project: PPPPPPPPPPPPPPPPP
Target : TTTTTTTTTTTTTTTTT
Version: VVVVVVVVVVVVVVVVV
URL: UUUUUUUUUUUUUUUUUUUU

Best regards,
Devops Team

But it's going to a straight line,

Project: PPPPPPPPPPPPPPPPP Target : TTTTTTTTTTTTTTTTT Version: VVVVVVVVVVVVVVVVV URL: UUUUUUUUUUUUUUUUUUUU

Best regards,
Devops Team

If I enable nl := "\r" or nl := "\n" or even with both. The output would be,

Project: PPPPPPPPPPPPPPPPP

Target : TTTTTTTTTTTTTTTTT

Version: VVVVVVVVVVVVVVVVV

URL: UUUUUUUUUUUUUUUUUUUU

Best regards,
Devops Team

This is not presentable.

Please help.

Thanks, Ric

2

There are 2 best solutions below

1
Ricky V. On

Solution is to put the template body with one line,

Subject: [{{ .Status }}] app {{ .App }} has been synced by argoCD

{{ .BodyLines }}

Best regards,
Devops Team
0
Ricky V. On

Actually the above is working fine, just on my actual the Target is "Target Env" but when I put it as "Target-Env" then it works like fine without a straight line.