🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

966閲覧

send_mailメソッドを使って決められた時刻の数分前になったら、Gmailにデータを送信したい。

reol-777

総合スコア14

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/12/27 03:00

編集2020/12/27 03:05

前提・実現したいこと

DjangoでTodoアプリを作っています。
このアプリに通知機能を追加したいです。
具体的には、send_mailメソッドを使って決められた時刻の数分前になったら、GmailにTodoデータを送信したいです。

発生している問題・エラーメッセージ

viewとformを見てわかる通り現在時刻と自分で決める時刻それぞれのフォーマットを統一したにも関わらず、決められた時刻の一分前になってもGmailにデータが送信されません。(エラーは発生していません。)日にちで比較した場合にうまく送信されたので、メールを送るための記述は間違ってないと思います。なので時刻の比較もしくは時刻の取得方法が間違っていると思います。

該当のソースコード

view

1 nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') 2 time = datetime.datetime.strptime(nowtime,'%Y-%m-%d %H:%M') 3 todo_obj = TodoModel.objects.all() 4 for obj in todo_obj: 5 if time == (obj.duedate - datetime.timedelta(minutes=1)): 6 subject = 'タイトル:{}'.format(obj.title) 7 massege = 'メモ:{}\n期日:{}\nカテゴリ:{}\n'.format(obj.memo,obj.duedate,obj.category) 8 from_mail = [] 9 recipient = [settings.EMAIL_HOST_USER] 10 send_mail(subject, massege, from_mail, recipient) 11

model

1from django.db import models 2from django.utils import timezone 3# Create your models here. 4class Category(models.Model): 5 class Meta: 6 db_table = "category" 7 verbose_name = "カテゴリ" 8 verbose_name_plural = "カテゴリ" 9 10 category_name = models.CharField(max_length=255,unique=True,verbose_name="カテゴリの名前",null=True) 11 12 def __str__(self): 13 return self.category_name 14 15PRIORITY = (('danger','high'),('info','normal'),('success','low')) 16class TodoModel(models.Model): 17 class Meta: 18 db_table = "todomodel" 19 verbose_name = "todoモデル" 20 verbose_name_plural = "todoモデル" 21 22 title = models.CharField(max_length=100,verbose_name="タイトル") 23 memo = models.TextField(verbose_name="メモ") 24 priority = models.CharField( 25 max_length = 50, 26 choices = PRIORITY, 27 verbose_name="優先度" 28 ) 29 duedate = models.DateTimeField(verbose_name="期日",default=timezone.now) 30 category = models.ForeignKey(Category,on_delete = models.PROTECT,verbose_name="カテゴリ",null=True) 31 def __str__(self): 32 return self.title

form

1from django import forms 2from .models import TodoModel 3 4 5class TodoForm(forms.ModelForm): 6 7 8 class Meta: 9 model = TodoModel 10 fields = '__all__' 11 widgets = { 12 'duedate':forms.DateTimeInput(attrs={'placeholder':'記入例:2020-12-25 23:20'},format='%Y-%m-%d %H:%M'), 13 } 14

試したこと

・現在時刻と決めた時刻を比較する場合、コンマ何秒でも違っていたらイコールにはならないと思い、strptimeやstrftime関数を使い書式を設定しました。
・↑のようにしてもダメだったのでtime = datetime.datetime.now()で現在時刻を取得しそのまま条件式に組み込みました。
・↑のようにしてもだめだったので、viewで
nowtime = datetime.datetime.now()
time = datetime.datetime.strptime(str(nowtime),'%Y-%m-%d %H:%M:%S.%f')
:
if time == (obj.duedate - datetime.timedelta(minutes=1)):
としました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
・バージョン
Django:2.2.16
python:3.8.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そのviews.pyのコードが実行されていないからではないでしょうか?
runserverしているからといって、毎秒views.pyが実行されているわけではない(例えばあるページにアクセスしたら実行される、とか)のでcron的なもので定期的に別に作ったファイルを実行して、現在時刻がtodoの時間を過ぎていたらGmailに送信とかはできると思います。

投稿2020/12/27 11:32

ForestSeo

総合スコア2722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reol-777

2020/12/27 13:21

コード自体は間違っていないということですか?
ForestSeo

2020/12/27 23:03

from_mailが、空のリストなのが気になりますけど。
reol-777

2020/12/28 07:10

タスクスケジューラでも可能ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問