mailbox.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from flask import Blueprint, render_template, request, flash
  2. from flask_login import login_required, current_user
  3. from flask_wtf import FlaskForm
  4. from wtforms import DateField, SelectField, SubmitField
  5. from wtforms.validators import DataRequired
  6. from time import strftime, strptime, mktime, localtime
  7. from typing import List
  8. from mailbox.email import Mail
  9. from .page import get_page, get_max_page
  10. from .logger import Logger
  11. mailbox = Blueprint("mailbox", __name__)
  12. class ToMailboxForm(FlaskForm):
  13. date = DateField("发信时间", description="信件发送时间", validators=[DataRequired("必须选择时间")])
  14. select = SelectField("文件夹", description="INBOX或其他文件夹", validators=[DataRequired("必须选择文件夹")])
  15. submit = SubmitField("查询")
  16. def __init__(self, select: list):
  17. super(ToMailboxForm, self).__init__()
  18. try:
  19. del select[select.index("INBOX")]
  20. select = ["INBOX"] + select
  21. except ValueError:
  22. pass
  23. self.select.choices = select
  24. self.select.coerce = str
  25. self.select.default = "INBOX"
  26. def __load_mailbox_page(mail_list, page, to_mail=None, date=None, select=None, next_date=None, last_date=None):
  27. if not to_mail:
  28. to_mail = ToMailboxForm(current_user.get_inbox_list())
  29. max_page = get_max_page(len(mail_list), 10)
  30. page_list = get_page("mailbox.mail_list_page", page, max_page, date=date, select=select)
  31. page_mail_list: List[Mail] = mail_list[(page - 1) * 10: page * 10]
  32. return render_template("mailbox/mailbox.html",
  33. to_mail=to_mail,
  34. date=date,
  35. select=select,
  36. page_list=page_list,
  37. page=page,
  38. mail_list=page_mail_list,
  39. max_page=max_page,
  40. empty=(len(page_mail_list) == 0),
  41. next_date=next_date,
  42. last_date=last_date)
  43. @mailbox.route("/")
  44. @login_required
  45. def mail_list_page():
  46. date = request.args.get("date", None, type=str)
  47. select = request.args.get("select", "INBOX", type=str)
  48. page = request.args.get("page", 1, type=int)
  49. if date:
  50. date_obj = strptime(date, "%Y-%m-%d")
  51. mail_list, download = current_user.get_mail(select, strftime('%d-%b-%Y', date_obj))
  52. if mail_list is None and not download:
  53. flash("旧任务未完成,正在下载邮件,请稍后")
  54. mail_list = []
  55. elif download:
  56. flash("启动新任务下载邮件,请稍后")
  57. mail_list = []
  58. next_date = strftime("%Y-%m-%d", localtime(mktime(date_obj) + 24 * 60 * 60))
  59. last_date = strftime("%Y-%m-%d", localtime(mktime(date_obj) - 24 * 60 * 60))
  60. else:
  61. mail_list = []
  62. next_date = None
  63. last_date = None
  64. Logger.print_load_page_log("mail list")
  65. return __load_mailbox_page(mail_list,
  66. page,
  67. date=date,
  68. select=select,
  69. next_date=next_date,
  70. last_date=last_date)