Djangoで簡単にGmailでメールを送る


## はじめに

現在完全プライベートでmBaaS的なやつを作っていて万人向けのOSSになるんだったらアカウント等々のことも考えなければと思ってメールを送るようにしました。

## 環境

- Python 2.7.11
- Virtualenv
- Django 1.9.1
- OSX 10.11.6

PyAPNsがPython2.xにしか対応していないのでどこぞの小学生に叩かれるの承知でPython2を使って実装しました。Python3.xでもそのまま使えると思うので気が向いたらどうぞ

未だにDjango 1.10に対応できていない私です。許してください

## 準備

Virtualenvで仮想環境が整っている

```bash
$ pip install django==1.9.1
$ django-admin.py startproject sampleproject
$ django-admin.py startapp send_mail
```

## ソースコード

とりあえず `settings.py` をこんな感じに設定

```python:sampleproject/settings.py
# coding: utf-8
・・・
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'send_mail', # 追加
]
・・・
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
・・・
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your.address@gmail.com'
EMAIL_HOST_PASSWORD = 'passowrd'
EMAIL_PORT = 587
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
```

```python:sampleproject/urls.py
# coding: utf-8

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('send_mail.urls', namespace = 'send_mail')),
]
```

自分的にアプリごとにルーティングはしたいのでこんな感じに。

```send_mail/views.py
# coding: utf-8

from django.core.mail import EmailMessage
from django.http import HttpResponse

def index(request):
   EmailMessage(u'件名', u'本文', to = ['hoge@example.com', 'foo@example.com']).send()
   return HttpResponse('Send your register email')
```

`send_mail` 直下に `urls.py` を作成

```send_mail/urls.py
from django.conf.urls import url
from accounts import views

urlpatterns = [
    url(r'^$', views.index, name = 'index'),
]
```

ソースコード自体はこんな感じ。これで

```bash
$ python manage.py migrate
$ python manage.py runserver
```

をして、 `http://127.0.0.1:8000`

にアクセスすると本当だったらできるんだが、GoogleのAuthenticateの仕様上ちょっとややこしいことになっておらせられる

## Google側の設定

![スクリーンショット_2016-10-01_午前2_51_07.png](https://qiita-image-store.s3.amazonaws.com/0/97280/fe094c29-05a4-a2d7-5295-e84a9c79c092.png "スクリーンショット_2016-10-01_午前2_51_07.png")

1. まずは使用するアカウントでログインをしておこう！
2. アカウントという青いボタンを押す
3. 以下のようなページになるので __ログインとセキュリティ__ をクリック
![スクリーンショット_2016-10-01_午前2_53_06.png](https://qiita-image-store.s3.amazonaws.com/0/97280/ad7c5ec9-a562-8378-fc31-314f07a310db.png "スクリーンショット_2016-10-01_午前2_53_06.png")
4. 下の方にいくと __安全性の低いアプリの許可__ という項目があるので、デフォルトでオフになっている場合はオンにしておく。以下の画像のようになると使用できるようになる
![スクリーンショット 2016-10-01 午前2.54.24.png](https://qiita-image-store.s3.amazonaws.com/0/97280/6e57340c-9735-a003-c105-8825f14035e7.png "スクリーンショット 2016-10-01 午前2.54.24.png")

## 実際にやってみよう

私の場合はログインパスワードを忘れた人のためにメールを送りつけたかったのでこんな感じのメール内容になっています。

![スクリーンショット 2016-10-01 午前2.57.19.png](https://qiita-image-store.s3.amazonaws.com/0/97280/c747a0c6-5727-a29a-1372-f405fe1177f1.png "スクリーンショット 2016-10-01 午前2.57.19.png")

Twitterのツイートをスクショを撮ってそのまま貼り付けるという暴挙

## おまけ

パスワードリセットのためランダムに文字列を作成する

```python:Python2.x系
import random, string

print(''.join([random.choice(string.letters + string.digits) for i in xrange(10)]))
```

```python:Python3.x系
import random, string

print(''.join([random.choice(string.ascii_letters + string.digits) for i in range(10)]))
```

とっても簡単ですね！