AWS SDK for Golangでカスタムメトリクスを元にメール開封率などをトラッキングする

AWS SDK for Golangでカスタムメトリクスを元にメール開封率などをトラッキングする

SN

11/20 23:24

GoでAWSのSESから配信しているメールの開封率や本文のリンククリック率を、

Cloud Watchでモニタリングできるようにするやり方を解説します。

一昔前はトラッキング用の画像を本文に設置してトラッキングするみたいな手法を

使っているケースが多かったらしいですが、最近になってAWSの備え付けの機能を

使ってできるようになりました。

ただAWSから提供されているGoのSDKのドキュメントに

詳しいやり方が書いていなくてすごい苦戦したので

具体的にやり方を書いていきます。


事前準備

開封率データを取得するために、SESトラッキングデータの出力先の設定を設定する必要があります。

SESのConfigration Setsでトラッキング用の設定を新規作成してゴニョゴニョ設定すると

できるんですが、詳しい説明は

https://dev.classmethod.jp/cloud/aws/amazon-ses-open-click-tracking/

を参考に進めてもらえるとわかりやすいと思います。


AWS SDKでメールを配信する&開封率チェック

前述のリンクの記事に書いてあるように、開封率を取得するためには

メールのヘッダーに

X-SES-MESSAGE-TAGSと

X-SES-CONFIGURATION-SETSを設定する必要があります。

具体的にどう実装すれば良いのかが、公式Docsにちゃんと書いてないのですが

SendEmailInputのConfigurationSetNameにオプションで渡すことで

送信じに上手い具合にヘッダーに情報を指定してくれます。

以下にサンプルコードを置いておきます。

AWSの認証情報は各自用意してください。

package main

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ses"
"github.com/pkg/errors"
)

type SESConfig struct {
AccessKeyID string `validate:"required"`
SecretKey string `validate:"required"`
Region string `validate:"required"`
}

type SendEmailParams struct {
From string
To string
Title string
Body string
}

type SendEmailResult struct {
MessageID string
}

type ISESGateway interface {
SendEmail(p *SendEmailParams) (*SendEmailResult, error)
}

type SESGateWay struct {
*SESConfig
}

func NewSESGateway(config *SESConfig) *SESGateWay {
return &SESGateWay{config}
}

func (g *SESGateWay) SendEmail(p *SendEmailParams) (*SendEmailResult, error) {
sess, err := session.NewSession(
&aws.Config{
Region: aws.String(g.Region),
Credentials: credentials.NewStaticCredentials(g.AccessKeyID, g.SecretKey, ""),
},
)

if err != nil {
return nil, err
}

svc := ses.New(sess)

input := &ses.SendEmailInput{
Destination: &ses.Destination{
ToAddresses: []*string{
aws.String(p.To),
},
},
Message: &ses.Message{
Body: &ses.Body{
Html: &ses.Content{
Charset: aws.String("UTF-8"),
Data: aws.String(p.Body),
},
},
Subject: &ses.Content{
Charset: aws.String("UTF-8"),
Data: aws.String(p.Title),
},
},
Source: aws.String(p.From),
ConfigurationSetName: aws.String("YOUR_CONF_NAME"),
}

out, err := svc.SendEmail(input)
if err != nil {
return nil, errors.WithStack(err)
}
return &SendEmailResult{MessageID: *out.MessageId}, nil
}


func main() {
config := &SESConfig{"AccessKeyID", "SecretKey", "Region"}
sesGW := NewSESGateway(config)

sendEmailParams := &SendEmailParams{
"from_email@sample.email",
"to_email@sample.email",
"タイトルが入る",
"本文が入る",
}
rs, err := sesGW. SendEmail(sendEmailParams)
if err != nil {
panic(err)
}
fmt.Println(rs)
}


実際に送信してみて、記事の通りトラッキングの設定をした方はCloud Watchにて

カスタムメトリクスを作成するとトラッキング情報が見れるはずです。

おしまい。

PR:デジカフェ

Qiita - AWSタグが付けられた新着投稿

【Node.js】postで受け取った画像をS3へアップロードする

SN

12/17 17:59



はじめに

おはこんばんにちは@kaoryuuuです。

今回はnodeで実装したAPIでPOSTされた画像をS3へアップロードする方法を紹介していこうと思います。


今回やること

base64エンコードされた画像を受け取り...

お名前.COMのDDNSをLambdaを使って更新する

SN

12/17 15:36



理由目的

自宅サーバのDDNS更新をAWSを使って行う。

普通に更新すれば良いじゃないと言われるが、以下の理由が。


お名前.COMの更新ソフトはWindowsのみ
家で主に動いているサーバはNASのLinux(Synology ...

CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい

CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい

SN

12/17 15:06

Yper株式会社 でエンジニアをやっています。

個人情報とかも扱うのでセキュリティを固めていて、CircleCIのお便利さとバッティングしたときのメモです。


やりたいこと

EC2にCircleCIからSSHしてなんかしら...

AWSome Day 2018 Tokyo メモ

SN

12/17 15:00



AWSome Day 2018 Tokyo メモ


オープニングセッション:はじめての AWS ~初級者から中級者への道筋。クラウドアーキテクチャの理解を深める~

亀田 治伸


アマゾン ウェブ サービス ジャパン株式会社 マー...

JAWS-UG 初心者支部#15 AWS re:Invent 2018 re:Cap !! メモ

SN

12/17 14:51



JAWS-UG 初心者支部#15 AWS re:Invent 2018 re:Cap !! メモ


19:10-19:30 「(仮)初めてのre:invent ~若造目線の楽しみ方~」 Yu Otsubo


re:Inventとは

AWS主催の年次ユーザカンファレンス

今年で7回...

AWS Serverless Expressでlambdaの障害が起きて困った話

AWS Serverless Expressでlambdaの障害が起きて困った話

SN

12/17 14:04



はじめに

これはServerless2 Advent Calendarの13日目の記事です。

ただ、この記事を書いている今日はもう17日です。。。

この記事を書こう(ホントは別の話を書く予定だった)としていた当日に障害だっ...

AWS EC2 �設定手順忘備録

SN

12/17 11:16



AWS EC2 設定


準備


EC2 VPC+InternetGWの中につくる



ホスト名の設定:リモートログイン


sshでログイン ssh -i ***.pem ec2-usr@xxx.xxx.xxx.xxx (パブリックIPでログイン)
ホスト名を設定する(1) sudo...

AWSとDockerを使用したOmiseGo / ewallet環境構築

AWSとDockerを使用したOmiseGo / ewallet環境構築

SN

12/17 10:30



【本文】

この記事は Blockchain Advent Calendar 2018 の15日目の記事です。

空いていたので、急遽ねじ込みました!

OmiseGoのewalletをAWS上でdockerイメージを使って簡単に構築する手順について共有...

SSMパラメータストアのパラメータ値だけに閲覧制限をかける

SSMパラメータストアのパラメータ値だけに閲覧制限をかける

SN

12/17 10:19

SSMのパラメータストアを使うにあたり、特別な権限をもったユーザ以外にパラメータの値(Key-ValueでいうValueの方)を見せたくないケースがありませんか?

その際、パラメータストアへの全ての読み取り権限を遮...

AWS ML University の Deep Learning についてのコンテンツを訳してみた

AWS ML University の Deep Learning についてのコンテンツを訳してみた

SN

12/17 10:13



はじめに

この記事は株式会社ナレッジコミュニケーションが運営する Amazon AI by ナレコム Advent Calendar 2018 の17日目の記事になります。

Amazon.comのエンジニアが人工知能に関する技術を学ぶ際に利用...

AWSのBig Data and Analyticsのレポート

SN

12/17 10:06

 2018年12月7日にAWSのBig Data and Analyticsに参加しましたので、その内容をアウトプットしたいと思います。


今後のビッグデータはデータレイクが必要になる


発端となった出来事

 PentahoのCTOであるJam...

カオスエンジニアリングを体感せよ ~ChaosLambda編~

カオスエンジニアリングを体感せよ ~ChaosLambda編~

SN

12/17 08:00



カオスエンジニアリングとは



NetflixではChaos Monkey、Gorilla、Kongなどのツールを構築することで、様々なシステム、ゾーン、さらにはリージョン全体がダウンした時に、サービスが存続可能であるように継...

SSMで オンプレミスの windows PC(サーバでない) のアプリ一覧取得

SN

12/17 07:00

AWS を使って社内PCのソフトウェア管理(SAM)に書いたように、なんと、SSMが、通常のPCでも使えます。Mac や、Linux Desktop でも、つかえるようです。

SSMは、エージェントアプリケーションです。対象となるシ...

ハイブリッドクラウドについて思うところ

ハイブリッドクラウドについて思うところ

SN

12/17 07:00



はじめに

この記事は リクルートライフスタイルアドベントカレンダー2018 の17日目です。

ホットペッパービューティーでエンジニアをしています。shaseです。

現在開発中のプロジェクトが、大人の事情に...

【AWS】米国リージョンからSimple Notification Service(SNS)を利用してSMSを送ってみる

【AWS】米国リージョンからSimple Notification Service(SNS)を利用してSMSを送ってみる

SN

12/17 02:09

こちらで書いた記事 を試行錯誤する過程で、可能性の一つとして、海外のSMSが受信できる必要があるかもしれないと思い、そのプランを追加購入したのですが、結果としてアクティベートには必要ありませんでした。
...

AWS X-RayをRailsに導入しようとしてつまづいた話と解決した話

AWS X-RayをRailsに導入しようとしてつまづいた話と解決した話

SN

12/17 01:21

この記事はHamee Advent Calendar 2018 17日目の記事です。


AWS X-Rayって何?

AWS公式の説明によると


AWS X-Ray はアプリケーションが処理するリクエストに関するデータを収集するサービスです。データを表...

AWSでIAMユーザーを作成した

AWSでIAMユーザーを作成した

SN

12/16 23:47



概要

AWSでIAMユーザーを作成した際のメモです。


IAMユーザーとは

AWSにアクセスする権限を人やサーバに付与するためのもの。


IAMユーザー使う理由

AWSのアカウント作成時に発行されるユーザーはroot権...

[メモ]VPCのIPアドレスに対して作成出来るサブネットの範囲

SN

12/16 22:55

AWSで作成したVPCの中に複数のサブネットを作成出来ます。

たまにサブネットを作成しようとしてVPCの範囲外で作成しようとしてしまったり、よく理由がわからず作成出来ない、みたいなのがあったので、VPCと作成...

AWS Lambda でPHP動かして DynamoDBを操作する

SN

12/16 22:31



はじめに

この記事は、駆け出しエンジニアのための Advent Calendar 2018の15日目の記事です


re:Invent2018

先日ラスベガスで開催された、AWS re:Invent2018にて、

AWS Lambdaに、Custom Runtimeという...

【小ネタ】CloudWatch参照中にセッションが切れてしまったら【AWS】

【小ネタ】CloudWatch参照中にセッションが切れてしまったら【AWS】

SN

12/16 22:01



はじめに

性能評価や不具合原因の調査・分析等の際に、CloudWatchMetrics・CloudWatchLogsなどを駆使して、複数メトリクスを組み合わせ・並べて見ながら調べていく、といったことはままあると思います。

...

PR:Amazonプライムビデオ

Qiita

Qiita - 人気の投稿

Qiita - AWSタグが付けられた新着投稿

Qiita - Gitタグが付けられた新着投稿

Qiita - Linuxタグが付けられた新着投稿

Qiita - MySQLタグが付けられた新着投稿

Qiita - nginxタグが付けられた新着投稿

Qiita - Dockerタグが付けられた新着投稿

Qiita - Pythonタグが付けられた新着投稿

Qiita - Rubyタグが付けられた新着投稿

Qiita - PHPタグが付けられた新着投稿

Qiita - Javaタグが付けられた新着投稿

Qiita - JavaScriptタグが付けられた新着投稿