サードパーティのアプリもあったが、なかなか組み込みが難しかった。djangoのメール配信機能があるので、それを使ってみた。
ポイントは View と 環境変数
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def mail_send(request,profile_id):
if request.method == 'GET':
token=hashlib.sha256((str(profile_id)+"ここには適当な文字をsaltとして入れる").encode('utf-8')).hexdigest()
if settings.DEBUG==True: url="http://"+settings.ALLOWED_HOSTS[0]+":8000/accounts/mail_check/"+str(profile_id)+"/?token="+token
else: url="https://"+settings.ALLOWED_HOSTS[1]+"/accounts/mail_check/"+str(profile_id)+"/?token="+token #0がlocal環境、1が2つめ deploy環境 から取得する。
subject = "メール登録について"
message = "メール登録のためのリンク:"+url
from_email = settings.EMAIL_HOST_USER # 送信者
to_email=User.objects.filter(id=profile_id)[0].email
recipient_list = [to_email] # 宛先リスト
send_mail(subject, message, from_email, recipient_list)
return render(request, 'accounts/mail_send.html', {'to_email':to_email})
@permission_classes([IsAuthenticated])
def mail_send(request,profile_id):
if request.method == 'GET':
token=hashlib.sha256((str(profile_id)+"ここには適当な文字をsaltとして入れる").encode('utf-8')).hexdigest()
if settings.DEBUG==True: url="http://"+settings.ALLOWED_HOSTS[0]+":8000/accounts/mail_check/"+str(profile_id)+"/?token="+token
else: url="https://"+settings.ALLOWED_HOSTS[1]+"/accounts/mail_check/"+str(profile_id)+"/?token="+token #0がlocal環境、1が2つめ deploy環境 から取得する。
subject = "メール登録について"
message = "メール登録のためのリンク:"+url
from_email = settings.EMAIL_HOST_USER # 送信者
to_email=User.objects.filter(id=profile_id)[0].email
recipient_list = [to_email] # 宛先リスト
send_mail(subject, message, from_email, recipient_list)
return render(request, 'accounts/mail_send.html', {'to_email':to_email})
@api_view(['GET'])
def mail_check(request,profile_id):
if request.method == 'GET':
token=hashlib.sha256((str(profile_id)+"ここは適当な文字をsaltとして入れる").encode('utf-8')).hexdigest()
if token==request.GET.get("token") :
tokenflg=True
#ここで、DBのフラグ変更
cdt=get_object_or_404(User,pk=profile_id)
cdt.is_kaiin=True
cdt.save()
else :
tokenflg=False
to_email=User.objects.filter(id=profile_id)[0].email
return render(request, 'accounts/mail_check.html', {'to_email':to_email,'tokenflg':tokenflg})
***パラメータの取得方法は、request.tokenかと思ったが、そうではなく、request.GET.get("token") だった。このへんは、慣れていくしかない。
settings.py
DEBUG = os.getenv('DEBUG',True) #deploy環境ではDEBUG環境変数をFalseに
ALLOWED_HOSTS = ['localhost','ここに公開サーバドメイン']
DEBUG = os.getenv('DEBUG',True) #deploy環境ではDEBUG環境変数をFalseに
ALLOWED_HOSTS = ['localhost','ここに公開サーバドメイン']
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# 環境変数にしておけば、セキュリティも上がり、ローカルとDeploy環境の切り替え負担もない いちおう、ディフォルトはローカルにしてみた
EMAIL_HOST = os.getenv('EMAIL_HOST','smtp.gmail.com')
EMAIL_PORT = os.getenv('EMAIL_PORT',587)
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
EMAIL_USE_TLS = True
**その後、この方法だと、レンタルサーバによっては、OSから環境変数がうまく取得できないことがあることが判明、そこでdjango-environというものを使わせていただいた。これだと、うまく動作してくれた。
**さらに、追加情報
ローカルからはだいじょうぶだったが、公開先のサーバでは、djangoからのメール送信元がwebmaster@localhostとなり、エラーが発生する。
https://teratail.com/questions/255401 の情報によれば、DEFAULT_FROM_EMAIL に、送信元をきちんと設定しておくことで、解決した。いろいろ、知らない情報も、ネットでググるといいようだ。
0 件のコメント:
コメントを投稿