2022年8月8日月曜日

django リンククリックでユーザー登録するためのメール配信

サードパーティのアプリもあったが、なかなか組み込みが難しかった。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})

@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','ここに公開サーバドメイン']

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 件のコメント:

コメントを投稿