質問するログイン新規登録

質問編集履歴

4

2018/05/03 10:02

投稿

s-hara
s-hara

スコア52

title CHANGED
File without changes
body CHANGED
File without changes

3

問題内容を修正

2018/05/03 10:02

投稿

s-hara
s-hara

スコア52

title CHANGED
File without changes
body CHANGED
@@ -1,44 +1,183 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- djangoにて社内のsmtpサーバを指定してメール送信したい。
3
+ djangoにて社内のsmtpサーバを指定してWEBからパスワードリセットメール送信できない。
4
+ 以下、長文となりますが、実装した機能の要点(コード)と、問題点をまとめました。
4
5
 
5
- ### 該当のソースコード
6
+ ■djangoシェル上でメル送信テ
7
+
6
8
  ```
7
- python manage.py shell
9
+ setting.pyの設定
8
- from django.core.mail import send_mail
9
10
 
11
+ EMAIL_HOST = '<社内のSMTPサーバ名を指定>'
12
+ EMAIL_PORT = '25'
13
+ EMAIL_HOST_USER = ''
14
+ EMAIL_HOST_PASSWORD = ''
15
+ EMAIL_USE_TLS = False
16
+ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
17
+ ```
18
+
19
+ ■python manage.py shellで以下を実行。
20
+
21
+ ```
22
+ In [1]: from django.core.mail import send_mail
23
+
10
- send_mail(
24
+ In [2]: send_mail(
11
- 'Subject here',
25
+ ...: 'Subject here_mailhub',
12
- 'Here is the message.',
26
+ ...: 'Here is the message.',
13
- 'from@example.com',
27
+ ...: 'fromアドレスを指定',
14
- ['to@example.com'],
28
+ ...: ['toアドレスを指定'],
29
+ ...: )
30
+ Out[2]: 1
31
+ ```
32
+
33
+ ⇒問題なくメール送信される(OK)
34
+
35
+ ■パスワードリセット用機能を実装し、WEBからパスワードリセット用メールを送信するとメールが配信されない。
36
+
15
- fail_silently=False,
37
+ ※setting.pyは上記と同じ内容。
38
+
39
+ ※パスワードリセットは以下の構成(要点だけ記載)
40
+
41
+ ```
42
+ ●url.py
43
+ path('password_reset/', views.PasswordReset.as_view(), name='password_reset'),
44
+ path('password_reset/done/', views.PasswordResetDone.as_view(), name='password_reset_done'),
45
+ path('reset/<uidb64>/<token>/', views.PasswordResetConfirm.as_view(), name='password_reset_confirm'),
46
+ path('reset/done/', views.PasswordResetComplete.as_view(), name='password_reset_complete'),
47
+ ```
48
+
49
+ ```
50
+ ●views.py
51
+
52
+ from .forms import (MyPasswordResetForm, MySetPasswordForm)
53
+
54
+ from django.contrib.auth.views import (PasswordChangeDoneView,
55
+ PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
16
56
  )
57
+ from django.urls import reverse_lazy
58
+
59
+ class PasswordReset(PasswordResetView):
60
+ """パスワード変更用URLの送付ページ"""
61
+ subject_template_name = 'accounts/subject.txt'
62
+ email_template_name = 'accounts/message.txt'
63
+ template_name = 'accounts/password_reset_form.html'
64
+ form_class = MyPasswordResetForm
65
+ success_url = reverse_lazy('password_reset_done')
66
+
67
+
68
+ class PasswordResetDone(PasswordResetDoneView):
69
+ """パスワード変更用URLを送りましたページ"""
70
+ template_name = 'accounts/password_reset_done.html'
71
+
17
72
  ```
73
+ ```
74
+ ●forms.py
18
75
 
19
- ### 試したこと
76
+ from django import forms
77
+ from django.contrib.auth.models import User
78
+ from django.contrib.auth.forms import PasswordChangeForm, PasswordResetForm, SetPasswordForm
20
79
 
80
+
81
+ class MyPasswordResetForm(PasswordResetForm):
82
+ """パスワード忘れたときのフォーム"""
83
+
21
- とりあえずコマンドレベルで動作を確認するために、上記のコードを実行したが
84
+ def __init__(self, *args, **kwargs):
85
+ super().__init__(*args, **kwargs)
86
+ for field in self.fields.values():
87
+ field.widget.attrs['class'] = 'form-control'
88
+
89
+
90
+ class MySetPasswordForm(SetPasswordForm):
91
+ """パスワード再設定用フォーム(パスワード忘れて再設定)"""
92
+
22
- 特にエラーは発生しないがtoで指定したアドレス宛にメールが送信されない。
93
+ def __init__(self, *args, **kwargs):
23
- setting.pyには以下の設定を実施済み。
94
+ super().__init__(*args, **kwargs)
95
+ for field in self.fields.values():
96
+ field.widget.attrs['class'] = 'form-control'
97
+
98
+ class PasswordResetConfirm(PasswordResetConfirmView):
99
+ """新パスワード入力ページ"""
100
+ form_class = MySetPasswordForm
101
+ success_url = reverse_lazy('password_reset_complete')
102
+ template_name = 'accounts/password_reset_confirm.html'
103
+
104
+
105
+ class PasswordResetComplete(PasswordResetCompleteView):
106
+ """新パスワード設定しましたページ"""
107
+ template_name = 'accounts/password_reset_complete.html'
24
108
  ```
25
- # settings.py
26
- EMAIL_HOST = '<社内のsmtpサーバ名を指定>'
27
- EMAIL_PORT = 25
28
- EMAIL_HOST_USER = ''
29
- EMAIL_HOST_PASSWORD = ''
30
- EMAIL_USE_TLS = False
31
109
  ```
32
- 社内のsmtpサーバは認証なしで利用できるのでUSER,PASSWORDのパラメータは空
33
- で指定しています。
34
- 普通のバッチファイルなどでメール送信する際は、smtpサーバ名とポート25番
35
- を指定するだけで利用できる環境になっています。
110
+ ●password_reset_form.html
36
- ファイアウォール的に25ポートが遮断されているということもありません。
37
- メールが送信できない原因としてほかにどのようなことがか投あげられるでしょうか?
38
111
 
39
112
 
113
+ <form action="" method="POST">
114
+ {{ form.non_field_errors }}
115
+ {% for field in form %}
116
+ <div class="form-group">
117
+ <label for="{{ field.id_for_label }}">{{ field.label_tag }}</label>
118
+ {{ field }}
119
+ {{ field.errors }}
120
+ </div>
121
+ {% endfor %}
122
+ {% csrf_token %}
123
+ <button type="submit" class="btn btn-primary btn-lg">送信</button>
124
+ </form>
125
+ ```
126
+ ```
127
+ ●password_reset_done.html
40
128
 
129
+ <p>
130
+ パスワード再設定用のメールを送信しました。<br>
131
+ メールに記載されているリンクから再設定を行ってください。
132
+ </p>
133
+ ```
134
+ ```
135
+ ●message.txt
136
+ {{ user.username }} 様
137
+
138
+ 下記URLよりサイトにアクセスの上、パスワードの再設定を行ってください。
139
+
140
+ 再設定用URL
141
+ {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uid token %}
142
+
143
+ テストです。
144
+ ```
145
+ ```
146
+ ●subject.txt
41
147
 
148
+ パスワードの再登録
42
149
 
150
+ ```
151
+ ----------------------------------------------------------------------------
152
+ <その他に試したこと>
153
+ setting.pyで以下の通りコンソールモードにしてからパスワードリセットを実行
154
+
155
+ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
156
+
157
+ 結果:コンソールに以下のようにパスワードリセット用のURLが表示される(OK)
158
+ ```
159
+ Message-ID: <152515770692.2608.2202147284301657819@<PC名>
160
+
161
+ xxxxx 様
162
+
163
+ 下記URLよりサイトにアクセスの上、パスワードの再設定を行ってください。
164
+
165
+ 再設定用URL
166
+ http://127.0.0.1:8000/accounts/reset/Mg/4vt-61b46d5e192e0d5ee144/
167
+
168
+ xxxxxx
169
+ ```
170
+
171
+ 上記URLにアクセスすると問題なくパスワード変更ができるので、問題個所は
172
+ WEBページから社内SMTPサーバを使ったスワードリセットをお知らせするメール送信部分に問題がありそう。
173
+ 但し、python managep.py shell上でsend_mailメソッドを使って社内SMTPサーバを指定してメール送信した場合は問題なくメール送信できる。
174
+
175
+ 上記状況から、何が原因として考えられますでしょうか。
176
+
177
+ 以上、よろしくお願いいたします。
178
+
179
+
180
+
181
+
43
182
  ### 補足情報(FW/ツールのバージョンなど)
44
183
  django 2.0

2

誤字修正

2018/05/01 07:46

投稿

s-hara
s-hara

スコア52

title CHANGED
File without changes
body CHANGED
@@ -34,7 +34,7 @@
34
34
  普通のバッチファイルなどでメール送信する際は、smtpサーバ名とポート25番
35
35
  を指定するだけで利用できる環境になっています。
36
36
  ファイアウォール的に25ポートが遮断されているということもありません。
37
- メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
37
+ メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
38
38
 
39
39
 
40
40
 

1

説明追加

2018/04/29 19:41

投稿

s-hara
s-hara

スコア52

title CHANGED
File without changes
body CHANGED
@@ -34,9 +34,11 @@
34
34
  普通のバッチファイルなどでメール送信する際は、smtpサーバ名とポート25番
35
35
  を指定するだけで利用できる環境になっています。
36
36
  ファイアウォール的に25ポートが遮断されているということもありません。
37
+ メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
37
38
 
38
39
 
39
40
 
40
41
 
42
+
41
43
  ### 補足情報(FW/ツールのバージョンなど)
42
44
  django 2.0