pythonで送信する画像つきのhtmlメール

## 環境
* python3.6
* gmail

## 機能
* pythonでhtmlメールを送信する
* htmlメール内でローカル画像を使用する

## 1. 設定とコーディング1
gmailのアプリ設定

googleにログイン後、[次のURL](https://myaccount.google.com/security)に遷移する

下記の画像の画面に遷移するので、2段階認証プロセスをONにして、
アプリパスワードを作成してください。
アプリパスワードはどこかにメモをしておいて下さい。

![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192308/d1d0456e-81c3-aabb-9dff-4c22ca6790fc.png)


## 2. 設定とコーディング2


```
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
from email.mime.image import MIMEImage


class Mail:
    def __init__(self):
        setting_ini_dict = read_text_ini('setting_mail.ini')
        mail_dict = setting_ini_dict['mail']
        self.mail_address = mail_dict['address']
        self.mail_type = mail_dict['type']
        self.mail_password = mail_dict['password']
        self.api_url = '{ボタンを押したときに実行したい、URL}'

    def send_mail(self, to_addr, msg):
        smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
        smtpobj.ehlo()
        smtpobj.starttls()
        smtpobj.ehlo()
        smtpobj.login(self.mail_address, self.mail_password)
        smtpobj.sendmail(self.mail_address, to_addr, msg.as_string())
        smtpobj.close()

    def create_mail(self, to_address, subject, body_msg, uuid):
        api_url = self.api_url + f'?auth_key={uuid}'
        body_msg = body_msg.replace('@mail_api@', api_url)
        msg = MIMEMultipart('alternative')
        msg.attach(MIMEText(body_msg, 'html'))
        with open('qiita_logo.png', 'rb') as img:
            logo_img = MIMEImage(img.read())
            logo_img.add_header('Content-ID', '<logo_image>')

        with open('mail_icon.png', 'rb') as img:
            mail_img = MIMEImage(img.read())
            mail_img.add_header('Content-ID', '<mail_image>')
        msg.attach(logo_img)
        msg.attach(mail_img)

        msg['Subject'] = subject
        msg['From'] = self.mail_address
        msg['To'] = to_address
        msg['Date'] = formatdate()
        return msg

def read_text(file_path):
    s = ""
    with open(file_path, encoding="utf-8") as f:
        s = f.read()
        # print(s)
    return s

def read_text_ini(file_path):
    """
    iniファイルからの読み込み
    Args:
        file_path: ファイルまでのパス+ファイル名

    Returns:
        ini_dic: iniファイル記載の辞書式文字列
    """
    import configparser
    ini_dict = configparser.ConfigParser()
    ini_dict.read(file_path, 'UTF-8')
    return ini_dict


mail = Mail()
to_address = '{送信したいメールアドレス}'
subject = 'メールのタイトル'
body_msg = read_text('mail_format.html')
uuid = 'testetesfsdf'
msg = mail.create_mail(to_address, subject, body_msg, uuid)
mail.send_mail(to_address, msg)


```

mail_format.html

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>メール認証画面</title>
</head>
<body>
<img style="width: 100px;"
     src="cid:logo_image">
<div style="background-color: #d9d9d9; width: 80%; margin: 2% 5% 10% 0; padding: 30px;">
    <p style="text-align: center;"><img style="width: 50px;" src="cid:mail_image"></p>
    <h2 style="padding-left: 4%">メールアドレスを確認してください</h2>
    <hr style="border:0; border-top:dashed; width: 96%;">
    <p style="padding-left: 4%">こちらのボタンをクリックしてメールアドレスの確認を行ってください。<br>ご協力いただきありがとうございます。</p>
    <p style="text-align: center">
        <a style="position: relative;
  display: inline-block;
  padding: 0.25em 0.5em;
  text-decoration: none;
  color: #FFF;
  background: #03A9F4;/*色*/
  border: solid 1px #0f9ada;/*線色*/
  border-radius: 4px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.2);
  text-shadow: 0 1px 0 rgba(0,0,0,0.2);" href="@mail_api@">メールを確認する</a>
    </p>
    <hr style="border:0; border-top:dashed; width: 96%;">
    <p style="padding-left: 4%">不要な点がございましたら、サポートまでお問い合わせください。</p>
</div>
<div style="text-align: center">
    <p>このメールには返信できません。 <br>
        qiita.com Ltd. Qiita <br>
        <a href="https://qiita.com">qiita.com</a> <br>
        <a href="#">プライバシーポリシー</a>
    </p>

</div>

</body>
</html>
```

setting_mail.ini

```
# setting_mail.ini

[mail]
type = gmail
address = {先程設定したgmailアドレス}
password = {先程保存したパスワード}
```

qiita_logo.png

![qiita-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192308/90b89872-d251-3aba-8a43-13cf15b98e72.png)


mail_icon.png
![mail_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192308/0f06a4cb-7079-14c3-0a35-716b93a2d805.png)


送信されるメール

![qiita_mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192308/1b12f0f3-b23b-c00c-626d-4e327c7d2784.png)

## まとめ

pythonとgmailを用いてhtmlメールを送信できました。
htmlにローカルの画像を入れて送信する方法でbase64で送ったりするなど、
いまでは、実行できない方法などでの記載もあったので、簡単にまとめました！