@@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json | |||||
from .exceptions import * | from .exceptions import * | ||||
from .utils.jinja import get_jenv, get_template, render_template | from .utils.jinja import get_jenv, get_template, render_template | ||||
__version__ = '8.0.62' | |||||
__version__ = '8.0.63' | |||||
__title__ = "Frappe Framework" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -456,10 +456,22 @@ def prepare_message(email, recipient, recipients_list): | |||||
def clear_outbox(): | def clear_outbox(): | ||||
"""Remove low priority older than 31 days in Outbox and expire mails not sent for 7 days. | """Remove low priority older than 31 days in Outbox and expire mails not sent for 7 days. | ||||
Called daily via scheduler.""" | |||||
frappe.db.sql("""delete q, r from `tabEmail Queue` as q, `tabEmail Queue Recipient` as r where q.name = r.parent and q.priority=0 and | |||||
datediff(now(), q.modified) > 31""") | |||||
frappe.db.sql("""update `tabEmail Queue` as q, `tabEmail Queue Recipient` as r set q.status='Expired', r.status='Expired' | |||||
where q.name = r.parent and datediff(curdate(), q.modified) > 7 and q.status='Not Sent' and r.status='Not Sent'""") | |||||
Called daily via scheduler. | |||||
Note: Used separate query to avoid deadlock | |||||
""" | |||||
email_queues = frappe.db.sql_list("""select name from `tabEmail Queue` | |||||
where priority=0 and datediff(now(), modified) > 31""") | |||||
if email_queues: | |||||
frappe.db.sql("""delete from `tabEmail Queue` where name in (%s)""" | |||||
% ','.join(['%s']*len(email_queues)), tuple(email_queues)) | |||||
frappe.db.sql("""delete from `tabEmail Queue Recipient` where parent in (%s)""" | |||||
% ','.join(['%s']*len(email_queues)), tuple(email_queues)) | |||||
for dt in ("Email Queue", "Email Queue Recipient"): | |||||
frappe.db.sql(""" | |||||
update `tab{0}` | |||||
set status='Expired' | |||||
where datediff(curdate(), modified) > 7 and status='Not Sent'""".format(dt)) |
@@ -174,7 +174,9 @@ class EmailServer: | |||||
email_list = [] | email_list = [] | ||||
self.check_imap_uidvalidity() | self.check_imap_uidvalidity() | ||||
self.imap.select("Inbox", readonly=True) | |||||
readonly = False if self.settings.email_sync_rule == "UNSEEN" else True | |||||
self.imap.select("Inbox", readonly=readonly) | |||||
response, message = self.imap.uid('search', None, self.settings.email_sync_rule) | response, message = self.imap.uid('search', None, self.settings.email_sync_rule) | ||||
if message[0]: | if message[0]: | ||||
email_list = message[0].split() | email_list = message[0].split() | ||||
@@ -261,14 +263,16 @@ class EmailServer: | |||||
if not cint(self.settings.use_imap): | if not cint(self.settings.use_imap): | ||||
self.pop.dele(msg_num) | self.pop.dele(msg_num) | ||||
else: | else: | ||||
# mark as seen | |||||
self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') | |||||
# mark as seen if email sync rule is UNSEEN (syncing only unseen mails) | |||||
if self.settings.email_sync_rule == "UNSEEN": | |||||
self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') | |||||
else: | else: | ||||
if not cint(self.settings.use_imap): | if not cint(self.settings.use_imap): | ||||
self.pop.dele(msg_num) | self.pop.dele(msg_num) | ||||
else: | else: | ||||
# mark as seen | |||||
self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') | |||||
# mark as seen if email sync rule is UNSEEN (syncing only unseen mails) | |||||
if self.settings.email_sync_rule == "UNSEEN": | |||||
self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') | |||||
def get_email_seen_status(self, uid, flag_string): | def get_email_seen_status(self, uid, flag_string): | ||||
""" parse the email FLAGS response """ | """ parse the email FLAGS response """ | ||||