ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Golang에서 SMTP 로 mail 보내기 (gmail)
    Golang 2022. 9. 4. 18:24

    App 사용을 위한 계정 생성하기

     기존에는 google 로그인 시 사용하던 id / pwd로 mail을 보낼 수 있었지만 보안 정책이 변경되어 app 계정을 따로 생성해야 한다.

    보안 탭으로 들어가기
    앱 비밀번호 생성하기
    앱 비밀번호 생성하기

    이제 smtp 계정을 설정할 때 내 mail주소와 화면에 나온 app 비밀번호를 사용하면 된다.

    code 작성

    package gomail
     
    import (
     "bytes"
     "encoding/json"
     "errors"
     "fmt"
     "html/template"
     "io/ioutil"
     "log"
     "net/smtp"
     "os"
     "path/filepath"
    )
     
    func SendEmailSMTP(to []string, data interface{}, template string) (bool, error) {
     type credential struct {
       ID       string `json:"id"`
       Password string `json:"password"`
     }
     pwd, _ := os.Getwd()
     b, err := ioutil.ReadFile(pwd + "/credentials.json")
     if err != nil {
       return false, errors.New("credentials.json file is not exist")
     }
     account := credential{}
     err = json.Unmarshal(b, &account)
     if err != nil {
       return false, errors.New("credentials.json file is not valid")
     }
     emailAuth := smtp.PlainAuth("", account.ID, account.Password, "smtp.gmail.com")
     
     emailBody, err := parseTemplate(template, data)
     if err != nil {
       log.Println(err.Error())
       return false, errors.New("unable to parse email template")
     }
     subject := "Subject: Test email from Go!\n"
     mime := "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\n\n"
     msg := []byte(subject + mime + "\n" + emailBody)
     
     if err := smtp.SendMail("smtp.gmail.com:587", emailAuth, "cavea@cavea.kr", to, msg); err != nil {
       return false, err
     }
     return true, nil
    }
     
    func parseTemplate(templateFileName string, data interface{}) (string, error) {
     templatePath, err := filepath.Abs(fmt.Sprintf("email_templates/%s", templateFileName))
     if err != nil {
       return "", errors.New("invalid template name")
     }
     t, err := template.ParseFiles(templatePath)
     if err != nil {
       return "", err
     }
     buf := new(bytes.Buffer)
     if err = t.Execute(buf, data); err != nil {
       return "", err
     }
     body := buf.String()
     return body, nil
    }

    댓글

Designed by Tistory.