pythonでgmailを送信するサンプルプログラムの作成

＊サンプルプログラムは一番下に記載

##pythonでメール送信のプログラムを作成する際に出てきた用語のまとめ

###MIME(Multipurpose Internet Mail Extensions)
電子メールの機能を拡張して、様々な形式のデータを扱える様にした規格のこと。
ネットワーク上でやり取りする電子メールで、当初の規格では唯一記載できたのがASCⅡ英数字データのみだったが、MIMEを使うことで、漢字、画像、音声どのバイナリーデータを扱える様に考案された。
[参考記事]
https://kotobank.jp/word/MIME-8967

###SMTP(Simple Mail Transfer Protocol) サーバー
そもそもメールの送受信には２つのサーバーが必要であり、SMTPサーバーは、メール送信に必要となるサーバー。SMTPはメール送信時に利用されるプロトコルのことで、送信元となるメールソフトから送信用メールサーバーを経て、相手先の受信メールサーバーへ電子メールを転送する際に使用される。
[参考記事]
https://www.kagoya.jp/howto/rentalserver/smtpserver/

※プロトコル
コンピュータ同士の通信の際に用いられる、規格のこと。異なるメーカーのソフトウェア、ハードウェアでも共通のプロトコルに従うことによって、正しい通信を可能にしている。
[参考記事]
https://kotobank.jp/word/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB-8535

###POP(Post Office Protocol)サーバー
メールの受信に必要となるサーバー。メールサーバーに保存された電子メールを、受信者のメールソフトやPCにダウンロードする仕組みとなっている。POPはユーザーがメールサーバーから自分の自分のメールを取得する際に使用されるプロトコル。
[参考記事]
https://ja.wikipedia.org/wiki/Post_Office_Protocol

###IMAP(Interner Message Access Proctocol)サーバー
POPサーバーと同様にメールの受信に用いられるサーバーのこと。POPサーバーは、メールサーバーにあるメールをユーザーのPCにダウンロードする方式でメールを取得するが、IMAPサーバーは、メールサーバー上のメールを直接閲覧する規格を採用している。IMAPは、メールサーバー上の電子メールにアクセスし、操作するためのプロトコル。
[参考記事]
https://ja.wikipedia.org/wiki/Internet_Message_Access_Protocol

## python emailモジュールについてまとめ

###smtplibモジュール
pythonでSMTPまたはESMT(Extended SMTP)を使用するためのモジュール。インターネット上のホストにメールを送信するために用いられる。SMTPインスタンスはSMTP接続を使用する際に、ホスト名とポートを指定することで使用できる。
[参考記事]
https://docs.python.org/ja/3/library/smtplib.html

###email.mimeモジュール
メールとMIMEオブジェクトを作成するモジュール
MIMEオブジェクトには以下がある

###MIMEBase
以下のMIME用サブクラスの基底となるクラス。以下のMIMEクラスは全てMIMEBaseのサブクラスとなる。

###MIMENonMultipart
multipart形式ではないMIMEメッセージを定義するクラス。ファイル添付用のメソッドであるattach()メソッドが呼ばれた際に、その使用を防ぐことができる。

###MIMEMultipart
multipart形式のMIMEメッセージを定義するクラス。ファイル添付用のメソッド、attach()メソッドを使うことができるので、添付ファイルを持ったメールを作成するときは、ものオブジェクトを使用する。

###MIMEApplication
MIMEMessageオブジェクトのapplicatiuonタイプを扱う

###MIMEAudio
MIMENonMultipartオブジェクトのサブクラスで、音声データを扱うMIMEオブジェクトを作成する。

###MIMEImage
MIMENonMultipartオブジェクトのサブクラスで、画像データを扱うMIMEオブジェクトを作成する。

###MIMEMessage
MIMENonMultipartオブジェクトのサブクラスで、messageを扱うMIMEオブジェクトを作成する。


###MIMEText
MIMENonMultipartオブジェクトのサブクラスで、textを扱うMIMEオブジェクトを作成する。

###まとめ
attach()メソッドを使って、添付ファイル形式でのメールを送信する場合は、MIMEMultipart
オブジェクトを使用。
添付ファイルのないMIMEオブジェクトを作成する、MIMENonMultipartを用いる。


詳しい説明はリファレンスを参照。
[参考記事]
https://docs.python.org/ja/3/library/email.mime.html

##サンプルプログラム
上記を踏まえた上での　添付ファイル付きメールをgmalを使って送信するサンプルプログラム

```python

# gmailを使ったメール送信のサンプルプログラム
from smtplib import SMTP
from email.mime.text import MIMEText
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart

def sendGmailAttach():
    sender, password = "hoge@gmail.com", "hogehoge" # 送信元メールアドレスとgmailへのログイン情報 
    to = 'fuga@gmail.com'  # 送信先メールアドレス
    sub = 'メールだよ' #メール件名
    body = '画像添付してるよ'  # メール本文
    host, port = 'smtp.gmail.com', 587

    # メールヘッダー
    msg = MIMEMultipart()
    msg['Subject'] = sub
    msg['From'] = sender
    msg['To'] = to

    # メール本文
    body = MIMEText(body)
    msg.attach(body)

    # 添付ファイルの設定
    attach_file = {'name': 'sample.jpg', 'path': './sample.jpg'} # nameは添付ファイル名。pathは添付ファイルの位置を指定
    attachment = MIMEBase('image', 'png')
    file = open(attach_file['path'], 'rb+')
    attachment.set_payload(file.read())
    file.close()
    encoders.encode_base64(attachment)
    attachment.add_header("Content-Disposition", "attachment", filename=attach_file['name'])
    msg.attach(attachment)

    # gmailへ接続(SMTPサーバーとして使用)
    gmail=SMTP("smtp.gmail.com", 587)
    gmail.starttls() # SMTP通信のコマンドを暗号化し、サーバーアクセスの認証を通す
    gmail.login(sender, password)
    gmail.send_message(msg)

if __name__ == '__main__':
    sendGmailAttach()
    print('メールが送信されました')
```

###他参考記事
添付ファイルについて
http://trade-and-develop.hatenablog.com/entry/2017/03/12/145514
SMTPの認証エラーについて
https://hacknote.jp/archives/27022/
SMTPサーバーとしてGmailを使用する際の設定
→安全性の低いアプリケーションからの設定を有効にする
https://myaccount.google.com/u/2/lesssecureapps?pageId=none