質問編集履歴

4

2018/05/03 10:02

投稿

s-hara
s-hara

スコア52

test CHANGED
File without changes
test CHANGED
File without changes

3

問題内容を修正

2018/05/03 10:02

投稿

s-hara
s-hara

スコア52

test CHANGED
File without changes
test CHANGED
@@ -2,77 +2,355 @@
2
2
 
3
3
 
4
4
 
5
- djangoにて社内のsmtpサーバを指定してメール送信したい。
6
-
7
-
8
-
9
- ### 該当のソースコード
10
-
11
- ```
12
-
13
- python manage.py shell
14
-
15
- from django.core.mail import send_mail
16
-
17
-
18
-
19
- send_mail(
20
-
21
- 'Subject here',
22
-
23
- 'Here is the message.',
24
-
25
- 'from@example.com',
26
-
27
- ['to@example.com'],
28
-
29
- fail_silently=False,
5
+ djangoにて社内のsmtpサーバを指定してWEBからパスワードリセットメール送信できない。
6
+
7
+ 以下、長文となりますが、実装した機能の要点(コード)と、問題点をまとめました。
8
+
9
+
10
+
11
+ ■djangoシェル上でメール送信テスト
12
+
13
+
14
+
15
+ ```
16
+
17
+ setting.pyの設定
18
+
19
+
20
+
21
+ EMAIL_HOST = '<社内のSMTPサーバ名を指定>'
22
+
23
+ EMAIL_PORT = '25'
24
+
25
+ EMAIL_HOST_USER = ''
26
+
27
+ EMAIL_HOST_PASSWORD = ''
28
+
29
+ EMAIL_USE_TLS = False
30
+
31
+ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
32
+
33
+ ```
34
+
35
+
36
+
37
+ ■python manage.py shellで以下を実行。
38
+
39
+
40
+
41
+ ```
42
+
43
+ In [1]: from django.core.mail import send_mail
44
+
45
+
46
+
47
+ In [2]: send_mail(
48
+
49
+ ...: 'Subject here_mailhub',
50
+
51
+ ...: 'Here is the message.',
52
+
53
+ ...: 'fromアドレスを指定',
54
+
55
+ ...: ['toアドレスを指定'],
56
+
57
+ ...: )
58
+
59
+ Out[2]: 1
60
+
61
+ ```
62
+
63
+
64
+
65
+ ⇒問題なくメール送信される(OK)
66
+
67
+
68
+
69
+ ■パスワードリセット用機能を実装し、WEBからパスワードリセット用メールを送信するとメールが配信されない。
70
+
71
+
72
+
73
+ ※setting.pyは上記と同じ内容。
74
+
75
+
76
+
77
+ ※パスワードリセットは以下の構成(要点だけ記載)
78
+
79
+
80
+
81
+ ```
82
+
83
+ ●url.py
84
+
85
+ path('password_reset/', views.PasswordReset.as_view(), name='password_reset'),
86
+
87
+ path('password_reset/done/', views.PasswordResetDone.as_view(), name='password_reset_done'),
88
+
89
+ path('reset/<uidb64>/<token>/', views.PasswordResetConfirm.as_view(), name='password_reset_confirm'),
90
+
91
+ path('reset/done/', views.PasswordResetComplete.as_view(), name='password_reset_complete'),
92
+
93
+ ```
94
+
95
+
96
+
97
+ ```
98
+
99
+ ●views.py
100
+
101
+
102
+
103
+ from .forms import (MyPasswordResetForm, MySetPasswordForm)
104
+
105
+
106
+
107
+ from django.contrib.auth.views import (PasswordChangeDoneView,
108
+
109
+ PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
30
110
 
31
111
  )
32
112
 
33
- ```
34
-
35
-
36
-
37
- ### 試したこと
38
-
39
-
40
-
41
- とりあえずコマンドレベルで動作を確認するために、上記のコードを実行したが
42
-
43
- 特にエラーは発生しないがtoで指定したアドレス宛にメールが送信されない。
44
-
45
- setting.pyには以下の設定を実施済み。
46
-
47
- ```
48
-
49
- # settings.py
50
-
51
- EMAIL_HOST = '<社内のsmtpサーバ名を指定>'
52
-
53
- EMAIL_PORT = 25
54
-
55
- EMAIL_HOST_USER = ''
56
-
57
- EMAIL_HOST_PASSWORD = ''
58
-
59
- EMAIL_USE_TLS = False
60
-
61
- ```
62
-
63
- 社内のsmtpサーバは認証なしで利用できるのでUSER,PASSWORDのパラメータは空
64
-
65
- で指定しています。
66
-
67
- 普通のバッチファイルなどでメール送信する際は、smtpサーバ名とポート25番
68
-
69
- を指定するだけで利用できる環境になっています。
70
-
71
- ファイアウォール的に25ポートが遮断されているということもありません。
72
-
73
- メールが送信できない原因としてほかにどのようなことがか投あげられるでしょうか?
74
-
75
-
113
+ from django.urls import reverse_lazy
114
+
115
+
116
+
117
+ class PasswordReset(PasswordResetView):
118
+
119
+ """パスワード変更用URLの送付ページ"""
120
+
121
+ subject_template_name = 'accounts/subject.txt'
122
+
123
+ email_template_name = 'accounts/message.txt'
124
+
125
+ template_name = 'accounts/password_reset_form.html'
126
+
127
+ form_class = MyPasswordResetForm
128
+
129
+ success_url = reverse_lazy('password_reset_done')
130
+
131
+
132
+
133
+
134
+
135
+ class PasswordResetDone(PasswordResetDoneView):
136
+
137
+ """パスワード変更用URLを送りましたページ"""
138
+
139
+ template_name = 'accounts/password_reset_done.html'
140
+
141
+
142
+
143
+ ```
144
+
145
+ ```
146
+
147
+ ●forms.py
148
+
149
+
150
+
151
+ from django import forms
152
+
153
+ from django.contrib.auth.models import User
154
+
155
+ from django.contrib.auth.forms import PasswordChangeForm, PasswordResetForm, SetPasswordForm
156
+
157
+
158
+
159
+
160
+
161
+ class MyPasswordResetForm(PasswordResetForm):
162
+
163
+ """パスワード忘れたときのフォーム"""
164
+
165
+
166
+
167
+ def __init__(self, *args, **kwargs):
168
+
169
+ super().__init__(*args, **kwargs)
170
+
171
+ for field in self.fields.values():
172
+
173
+ field.widget.attrs['class'] = 'form-control'
174
+
175
+
176
+
177
+
178
+
179
+ class MySetPasswordForm(SetPasswordForm):
180
+
181
+ """パスワード再設定用フォーム(パスワード忘れて再設定)"""
182
+
183
+
184
+
185
+ def __init__(self, *args, **kwargs):
186
+
187
+ super().__init__(*args, **kwargs)
188
+
189
+ for field in self.fields.values():
190
+
191
+ field.widget.attrs['class'] = 'form-control'
192
+
193
+
194
+
195
+ class PasswordResetConfirm(PasswordResetConfirmView):
196
+
197
+ """新パスワード入力ページ"""
198
+
199
+ form_class = MySetPasswordForm
200
+
201
+ success_url = reverse_lazy('password_reset_complete')
202
+
203
+ template_name = 'accounts/password_reset_confirm.html'
204
+
205
+
206
+
207
+
208
+
209
+ class PasswordResetComplete(PasswordResetCompleteView):
210
+
211
+ """新パスワード設定しましたページ"""
212
+
213
+ template_name = 'accounts/password_reset_complete.html'
214
+
215
+ ```
216
+
217
+ ```
218
+
219
+ ●password_reset_form.html
220
+
221
+
222
+
223
+
224
+
225
+ <form action="" method="POST">
226
+
227
+ {{ form.non_field_errors }}
228
+
229
+ {% for field in form %}
230
+
231
+ <div class="form-group">
232
+
233
+ <label for="{{ field.id_for_label }}">{{ field.label_tag }}</label>
234
+
235
+ {{ field }}
236
+
237
+ {{ field.errors }}
238
+
239
+ </div>
240
+
241
+ {% endfor %}
242
+
243
+ {% csrf_token %}
244
+
245
+ <button type="submit" class="btn btn-primary btn-lg">送信</button>
246
+
247
+ </form>
248
+
249
+ ```
250
+
251
+ ```
252
+
253
+ ●password_reset_done.html
254
+
255
+
256
+
257
+ <p>
258
+
259
+ パスワード再設定用のメールを送信しました。<br>
260
+
261
+ メールに記載されているリンクから再設定を行ってください。
262
+
263
+ </p>
264
+
265
+ ```
266
+
267
+ ```
268
+
269
+ ●message.txt
270
+
271
+ {{ user.username }} 様
272
+
273
+
274
+
275
+ 下記URLよりサイトにアクセスの上、パスワードの再設定を行ってください。
276
+
277
+
278
+
279
+ 再設定用URL
280
+
281
+ {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uid token %}
282
+
283
+
284
+
285
+ テストです。
286
+
287
+ ```
288
+
289
+ ```
290
+
291
+ ●subject.txt
292
+
293
+
294
+
295
+ パスワードの再登録
296
+
297
+
298
+
299
+ ```
300
+
301
+ ----------------------------------------------------------------------------
302
+
303
+ <その他に試したこと>
304
+
305
+ setting.pyで以下の通りコンソールモードにしてからパスワードリセットを実行
306
+
307
+
308
+
309
+ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
310
+
311
+
312
+
313
+ 結果:コンソールに以下のようにパスワードリセット用のURLが表示される(OK)
314
+
315
+ ```
316
+
317
+ Message-ID: <152515770692.2608.2202147284301657819@<PC名>
318
+
319
+
320
+
321
+ xxxxx 様
322
+
323
+
324
+
325
+ 下記URLよりサイトにアクセスの上、パスワードの再設定を行ってください。
326
+
327
+
328
+
329
+ 再設定用URL
330
+
331
+ http://127.0.0.1:8000/accounts/reset/Mg/4vt-61b46d5e192e0d5ee144/
332
+
333
+
334
+
335
+ xxxxxx
336
+
337
+ ```
338
+
339
+
340
+
341
+ 上記URLにアクセスすると問題なくパスワード変更ができるので、問題個所は
342
+
343
+ WEBページから社内SMTPサーバを使ったスワードリセットをお知らせするメール送信部分に問題がありそう。
344
+
345
+ 但し、python managep.py shell上でsend_mailメソッドを使って社内SMTPサーバを指定してメール送信した場合は問題なくメール送信できる。
346
+
347
+
348
+
349
+ 上記状況から、何が原因として考えられますでしょうか。
350
+
351
+
352
+
353
+ 以上、よろしくお願いいたします。
76
354
 
77
355
 
78
356
 

2

誤字修正

2018/05/01 07:46

投稿

s-hara
s-hara

スコア52

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  ファイアウォール的に25ポートが遮断されているということもありません。
72
72
 
73
- メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
73
+ メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
74
74
 
75
75
 
76
76
 

1

説明追加

2018/04/29 19:41

投稿

s-hara
s-hara

スコア52

test CHANGED
File without changes
test CHANGED
@@ -70,6 +70,10 @@
70
70
 
71
71
  ファイアウォール的に25ポートが遮断されているということもありません。
72
72
 
73
+ メールが送信できない原因としてほかにどのようなことがか投げられるでしょうか?
74
+
75
+
76
+
73
77
 
74
78
 
75
79