はじめに
boto3でメールを送る際に、CCの設定などややこしくて悩みました。
最低限の実装はできたので自身の理解とともにここに残します。
結論
これです。
# メールを送信する
def sendMail(attachFile=[]):
################################# メールの見える部分 ################################
SUBJECT = '件名'
# 送り主
Sender = 'exampleSenderAddress@abc.com'
# 宛先(カンマ区切り文字列)
To = 'exampleToAddress_1@abc.com,
exampleToAddress_2@abc.com'
Cc = 'exampleCcAddress_3@abc.com'
Bcc = 'exampleBccAddress_4@abc.com,
exampleBccAddress_5@abc.com,
exampleBccAddress_6@abc.com'
# HTML見れない人用の本文
BODY_TEXT = '本文'
# HTML見れる人用の本文
BODY_HTML = f"""\
<html>
<head></head>
<body>
<p>{BODY_TEXT}</p>
</body>
</html>
"""
###################################################################################
client = boto3.client('ses')
# 上記の見える部分をセットしてく
msg = MIMEMultipart('mixed')
msg['Subject'] = SUBJECT
msg['From'] = Sender
msg['To'] = To
msg['CC'] = Cc
msg['BCC'] = Bcc
msg_body = MIMEMultipart('alternative')
CHARSET = "utf-8"
textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET)
htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET)
msg_body.attach(textpart)
msg_body.attach(htmlpart)
msg.attach(msg_body)
# ファイルの添付
for att in attachFile:
tmp = MIMEApplication(open(att, 'rb').read())
tmp.add_header('Content-Disposition','attachment',filename=os.path.basename(att))
msg.attach(tmp)
# メッセージの送付
try:
response = client.send_raw_email(
Source='',
Destinations=[x for x in [*To.split(','),*Cc.split(','),*Bcc.split(',')] if x != ''],
RawMessage={
'Data':msg.as_string(),
},
)
except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email sent! Message ID:"),
print(response['ResponseMetadata']['RequestId'])
解説
送付先
2か所メールアドレスを設定する部分があります。(ここがわからんかった)
ここと
# 上記の見える部分をセットしてく
msg = MIMEMultipart('mixed')
msg['Subject'] = SUBJECT
msg['From'] = Sender
msg['To'] = To
msg['CC'] = Cc
msg['BCC'] = Bcc
ここのDestinations
# メッセージの送付
try:
response = client.send_raw_email(
Source='',
Destinations=[x for x in [*To.split(','),*Cc.split(','),*Bcc.split(',')] if x != ''],
RawMessage={
'Data':msg.as_string(),
},
)
1つ目は書いてある通りメールの見える部分を設定しているだけで、送付先には影響しません。
2つ目のDestinationsが実際のメールの送付先でここに書いてある人にだけ送付されます。
添付ファイル
ここで添付しています。
引数にファイルのパスのリストを渡してください。
# ファイルの添付
for att in attachFile:
tmp = MIMEApplication(open(att, 'rb').read())
tmp.add_header('Content-Disposition','attachment',filename=os.path.basename(att))
msg.attach(tmp)
ヘッダなどはお好みで変更してください。