0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Django でメールを送信する

Last updated at Posted at 2018-12-29

Django で yahoo のメールサーバーを使ってメールを送信するサンプルです。

A) プロジェクト proj01
アプリ mail_send
を用意。
http://127.0.0.1:8000/mail_send/ にアクセスしてメッセージが出るようにします。

django-admin startproject proj01
cd proj01
python manage.py startapp mail_send
python manage.py migrate

proj01/settings.py の編集
proj01/urls.py の編集
mail_send/urls.py の作成
mail_send/views.py の編集

B) 自作のモジュールを mail_send/lib/ に入れます。

mkdir lib

次の mail['password'] は変更して下さい。

mail_send/lib/mail_yahoo.py
# -*- coding: utf-8 -*-
#
#	mail_yahoo.py
#
#						Dec/28/2018
# --------------------------------------------------------------------
import	sys
import	email
from email.mime.text import MIMEText
from email.utils import formatdate
# --------------------------------------------------------------------
from mail_send.lib.send_mail import send_mail_proc
# --------------------------------------------------------------------
def mail_yahoo_proc(mail_from,mail_to,subject,content):
	mail = {}
	mail['server'] = 'smtp.mail.yahoo.co.jp'
	mail['port'] = 587
	mail['usr'] = mail_from
	mail['password'] = '***secret***'
	mail['from'] = mail_from
	mail['to'] = mail_to

	message = MIMEText (
		content,
		'plain',
		)

	message['Subject'] = subject
	message['From'] = mail_from
	message['To'] = mail_to
	message['Date'] = formatdate()
#
	send_mail_proc(mail,message)
#
# --------------------------------------------------------------------
mail_send/lib/send_mail.py
# -*- coding: utf-8 -*-
#
#	send_mail.py
#
#						May/20/2017
# --------------------------------------------------------------------
import	sys
import	socket
import	smtplib
import	email
from email.mime.text import MIMEText
from email.utils import formatdate
# --------------------------------------------------------------------
# [6]:
def send_mail_proc (mail,message):
	if (mail['port'] == 465):
		try:
			send_ssl (mail,message)
		except Exception as ee:
			sys.stderr.write ("*** error *** send_ssl ***\n")
			sys.stderr.write (str (ee) + "\n")
	elif (0 <= mail['server'].find ('plala.or.jp')):
		try:
			send_plain (mail,message)
		except Exception as ee:
			sys.stderr.write ("*** error *** send_plain ***\n")
			sys.stderr.write (str (ee) + "\n")
	else:
		send_mail_proc_s2 (mail,message)
#
# --------------------------------------------------------------------
# [6-2]:
def send_ssl (mail,message):
	ss = smtplib.SMTP_SSL (mail['server'],mail['port'])
	ss.ehlo ()
#	ss.starttls ()
	ss.ehlo ()
	ss.login (mail['usr'],mail['password'])
	ss.sendmail (
		mail['from'],
		[mail['to']],
		message.as_string (),
		)
	ss.close ()
#
# --------------------------------------------------------------------
# [6-4]:
def send_starttls (mail,message):
	ss = smtplib.SMTP (mail['server'],mail['port'])
	ss.ehlo ()
	ss.starttls ()
	ss.ehlo ()
	ss.login (mail['usr'],mail['password'])
	ss.sendmail (
		mail['from'],
		[mail['to']],
		message.as_string (),
		)
	ss.close ()
#
# --------------------------------------------------------------------
# [6-2]:
def send_mail_proc_s2 (mail,message):
	try:
		send_starttls (mail,message)
	except Exception as ee:
		sys.stderr.write ("*** error *** send_starttls ***\n")
		sys.stderr.write (str (ee) + "\n")
		try:
			send_plain (mail,message)
		except Exception as ee:
			sys.stderr.write ("*** error *** send_plain ***\n")
			sys.stderr.write (str (ee) + "\n")
			sys.stderr.write ("*** error *** send_plain ***\n")
			try:
				send_simple (mail,message)
			except Exception as ee:
				sys.stderr.write ("*** error *** send_simple ***\n")
				sys.stderr.write (str (ee) + "\n")
#
# --------------------------------------------------------------------
# [6-6]:
def send_plain (mail,message):
	sys.stderr.write ("*** send_plain *** start ***\n")
	ss = smtplib.SMTP (mail['server'],mail['port'])
	ss.ehlo ()
#	ss.starttls ()
#	ss.ehlo ()
	sys.stderr.write ("*** send_plain *** bbb ***\n")
	ss.login (mail['usr'],mail['password'])
	sys.stderr.write ("*** send_plain *** ccc ***\n")
	ss.sendmail (
		mail['from'],
		[mail['to']],
		message.as_string (),
		)
	ss.close ()
#
# --------------------------------------------------------------------
# [6-8]:
def send_simple (mail,message):
	sys.stderr.write ("*** send_simple *** start ***\n")
	ss = smtplib.SMTP (mail['server'],mail['port'])
#
	ss.sendmail (
		mail['from'],
		[mail['to']],
		message.as_string (),
		)

	ss.close ()
#
	sys.stderr.write ("*** send_simple *** end ***\n")
# --------------------------------------------------------------------

C) mail_send/views.py の修正

次の mail_from と mail_to は変更して下さい。

mail_send/views.py
# --------------------------------------------------------------------
import	sys
import	socket
#
from mail_send.lib.send_mail import send_mail_proc
from mail_send.lib.mail_yahoo import mail_yahoo_proc

from django.shortcuts import render

from django.http import HttpResponse

# --------------------------------------------------------------------
def index(request):
    mail_proc01()
    str_out = "Good Afternoon<p />"
    str_out += "こんにちは<p />"
    return HttpResponse(str_out)

# --------------------------------------------------------------------
def mail_proc01():
    sys.stderr.write("*** 開始 ***\n")

    mail_from = 'aaabbb@yahoo.co.jp'
    mail_to = 'ccc@example.com'

    sys.stderr.write("to:" + mail_to + "\n")

    subject = 'Hello on Dec/28/2018 PM 17:00'

    content = 'こんにちは。\n'
    content += ' ' + socket.gethostname()

    mail_yahoo_proc(mail_from,mail_to,subject,content)

    sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------

D) 開発サーバーを起動

python manage.py runserver

E) ブラウザーで http://127.0.0.1:8000/mail_send/ にアクセス

すぐにメールが送られます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?