서버 세팅 및 GIT

SES in Golang

GenieLove! 2022. 9. 24. 12:11
728x90
반응형

GO GET

사용할 라이브러리

go get github.com/aws/aws-sdk-go-v2/aws
go get github.com/aws/aws-sdk-go-v2/credentials
go get github.com/aws/aws-sdk-go-v2/service/ses
go get github.com/aws/aws-sdk-go-v2/service/ses/types

Session 연결

var key string = "KEY"
var secretKey string = "SECRET_KEY"

type Ses struct {
	SesClient *ses.Client
}

func CreateSES() *Ses {
	var SES *Ses
	SES.SesClient = ses.New(ses.Options{
		Region:      "ap-northeast-2",
		Credentials: credentials.NewStaticCredentialsProvider(key, secretKey, ""),
	})

	return SES
}

Template

- EmailTemplate : 이메일 본문을 미리 저장하여 메일 전송 시 {{tagname}}만 변경해서 메일을 보낼 수 있다.

- tag : 변경 가능한 값으로 대체 변수이며, {{}} 를 이용해서 지정한다. tag는 무제한

- 계정당 최대 10,000개 이메일 템플릿 생성해서 사용할 수 있다.

- SendBulkTemplatedEmail을 통해선 모든 받는 사용자를 포함하여 최대 50명에게 보낼 수 있다.

 

Create Template

func (s *Ses) CreateTemplate(templateName, htmlPart, subjectPart, textPart string) error {
	_, err := s.SesClient.CreateTemplate(
		context.TODO(),
		&ses.CreateTemplateInput{Template: &types.Template{
			TemplateName: aws.String(templateName),// 템플릿 이름을 지정한다. 템플릿 이름으로 기존 템플릿을 찾는다. -> 
			HtmlPart:     aws.String(htmlPart), // 메일 본문으로 html형식
			SubjectPart:  aws.String(subjectPart), //메일 제목
			TextPart:     aws.String(textPart), // text 형식의 메일 본문
		}})

	return err
}

Get Template

func (s *Ses) GetTemplate(templateName string) (*types.Template, error) {
	output, err := s.SesClient.GetTemplate(
		context.TODO(),
		&ses.GetTemplateInput{
			TemplateName: aws.String(templateName), // 가져올 템플릿 이름
		},
	)

	return output.Template, err
}

Delete Template

- 템플릿은 수정이 안 된다. -> Delete 후 Create , 이미 있는 템플릿 이름으로 Create 진행 시 이미 존재한다는 에러 발생

func (s *Ses) DeleteTemplate(templateName string) error {
	_, err := s.SesClient.DeleteTemplate(
		context.TODO(),
		&ses.DeleteTemplateInput{
			TemplateName: aws.String(templateName),
		},
	)
	return err
}

 

Send mail

단일 대상에 메일 전송 with Template

func (s *Ses)SendTemplatedEmail(senderAddress, templateName string, receiverAddress []string, bccAddress []string, ccAddress []string, templateData map[string]any) error{
	dataByte, err := json.Marshal(templateData)
	if err != nil {
		return err
	}
	_, err = s.SesClient.SendTemplatedEmail(
		context.TODO(),
		&ses.SendTemplatedEmailInput{
			Source:       aws.String(senderAddress),
			Template:     aws.String(templateName),
			Destination: &types.Destination{
				ToAddresses:  receiverAddress, //받는 사람 메일 주소
				BccAddresses: bccAddress,
				CcAddresses:  ccAddress,
			},
			TemplateData: aws.String(string(dataByte)), // 템플릿에 저장된 tag를 매칭 시켜줄 값으로, json 문자열 {tagname: value}
		},
	)

	return err
}

여러 대상에 메일 전송 with Template

func (s *Ses) SendBulkTemplatedEmail(senderAddress, templateName string, destinations []types.BulkEmailDestination) {

	s.SesClient.SendBulkTemplatedEmail(
		context.TODO(),
		&ses.SendBulkTemplatedEmailInput{
			Source:       aws.String(senderAddress),
			Template:     aws.String(templateName),
			Destinations: destinations,
		},
	)
}

func SetDestination(receiverAddress []string, bccAddress []string, ccAddress []string, templateData map[string]any) (destination types.BulkEmailDestination, err error) {
	dataByte, err := json.Marshal(templateData)
	if err != nil {
		return
	}
	
	//하나의 destination에 묶인 address들은 같은 emailTemplate의 replacementTemplateData를 가지게 된다 -> 같은 내용의 메일을 받는다.
	destination = types.BulkEmailDestination{
		Destination: &types.Destination{
			ToAddresses:  receiverAddress, //받는 사람 메일 주소
			BccAddresses: bccAddress,
			CcAddresses:  ccAddress,
		},
		ReplacementTemplateData: aws.String(string(dataByte)),//대체 태그 (ex) {{tagname}}) 를 매칭 시켜줄 수 있는 데이터를 넣는다 ex) "{ \"name\":\"Alejandro\", \"favoriteanimal\": \"alligator\" }"
	}

	return
}

Send Mail

func (s *Ses)SendMail (senderAddress, charset, subject, html, text string, receiverAddress []string, bccAddress []string, ccAddress []string){
	s.SesClient.SendEmail(
		context.TODO(),
		&ses.SendEmailInput{
			Source: aws.String(senderAddress),
			Destination: &types.Destination{
				ToAddresses:  receiverAddress, // 받는 사람 메일 주소
				BccAddresses: bccAddress,
				CcAddresses:  ccAddress,
			},
			Message: &types.Message{
				Subject: &types.Content{
					Charset: aws.String(charset),
					Data: aws.String(subject), // 메일 제목
				},
				Body: &types.Body{
					Html: &types.Content{ //Html 기반 본문
						Charset: aws.String(charset),
						Data: aws.String(html),
					},
					Text: &types.Content{ //Text 기반 본문
						Charset: aws.String(charset),
						Data: aws.String(text),
					},
				},
			},
		},
	)
}
728x90
반응형