HaskellでSESを使って添付ファイル付メールを送る
SESでのメール送信に関連するライブラリの紹介記事です。
SESで添付ファイル付メールを送るにはSendRawEmailアクションを使用する。この時メールのフォーマットを組み立てる必要が有るため、自力で全部やるのは厳しい。
次のライブラリを使用した。
- amazonka-ses, amazonka
- 包括的なAWSのSDK。その内のSESに対するアクション。
- mime-mail
- MIMEを扱うためのライブラリ。これを使い
SendRawEmail
に送るメールのデータを作成する。
- MIMEを扱うためのライブラリ。これを使い
- heterocephalus
- 型安全なテンプレートエンジン。本題からはそれるが、メール本文の作成に使用。
mime-mail
Mail 型の値を組み立てて、renderMailでByteStringを作成(renderMail'
でboundaryランダム生成)。
Mail
の組み立てに幾つかの便利関数が用意されている。
{-# LANGUAGE OverloadedStrings #-}
import Network.Mail.Mime
import Data.ByteString.Lazy (toStrict)
sample body = do
mail <- addAttachment "text/plain" "/path/to/file.txt" $ simpleMail' "to@example.com" "from@example.com" "title" body
msg <- renderMail' mail
-- ...
amazonka-ses
APIへのリクエストに必要な環境を設定して、sendRawEmailにメール内容のbytesを渡す。
Discover ではデフォルトの環境変数(AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
)の読み込み、それがなければiamのprofile読み込みを行ってくれる。
import Control.Lens
import Control.Monad.Trans.AWS
import Network.AWS.SES
import Control.Monad
import Data.ByteString.Lazy (toStrict)
import System.IO
sample = do
-- ...
lgr <- newLogger Debug stdout
env <- newEnv Discover <&> set envLogger lgr
runResourceT . runAWST env . within region $ do
void $ send $ sendRawEmail (rawMessage (toStrict msg))
region = Oregon
heterocephalus
多分メールは長いのでテキストファイル作って、compileTextFileに渡す。
{-# LANGUAGE TemplateHaskell #-}
import Text.Heterocephalus (compileTextFile)
renderBody name = $(compileTextFile "sample.txt")
sample.txt
hello #{name}
sample $ renderBody "nakaji-dayo"