Beispiel #1
0
def flush(from_test=False):
	"""flush email queue, every time: called from scheduler"""
	smtpserver = SMTPServer()

	auto_commit = not from_test

	# additional check
	check_bulk_limit([])

	if frappe.are_emails_muted():
		msgprint(_("Emails are muted"))
		from_test = True

	frappe.db.sql("""update `tabBulk Email` set status='Expired'
		where datediff(curdate(), creation) > 3 and status='Not Sent'""", auto_commit=auto_commit)

	for i in xrange(500):
		email = frappe.db.sql("""select * from `tabBulk Email` where
			status='Not Sent' and ifnull(send_after, "2000-01-01 00:00:00") < %s
			order by priority desc, creation asc limit 1 for update""", now_datetime(), as_dict=1)
		if email:
			email = email[0]
		else:
			break

		frappe.db.sql("""update `tabBulk Email` set status='Sending' where name=%s""",
			(email["name"],), auto_commit=auto_commit)
		try:
			if not from_test:
				smtpserver.setup_email_account(email.reference_doctype)
				smtpserver.replace_sender_in_email(email)
				smtpserver.sess.sendmail(email["sender"], email["recipient"], encode(email["message"]))

			frappe.db.sql("""update `tabBulk Email` set status='Sent' where name=%s""",
				(email["name"],), auto_commit=auto_commit)

		except (smtplib.SMTPServerDisconnected,
				smtplib.SMTPConnectError,
				smtplib.SMTPHeloError,
				smtplib.SMTPAuthenticationError):

			# bad connection, retry later
			frappe.db.sql("""update `tabBulk Email` set status='Not Sent' where name=%s""",
				(email["name"],), auto_commit=auto_commit)

			# no need to attempt further
			return

		except Exception, e:
			frappe.db.sql("""update `tabBulk Email` set status='Error', error=%s
				where name=%s""", (unicode(e), email["name"]), auto_commit=auto_commit)
Beispiel #2
0
def send_one(email, smtpserver=None, auto_commit=True, now=False):
    '''Send bulk email with given smtpserver'''

    if not smtpserver:
        smtpserver = SMTPServer()

    frappe.db.sql(
        """update `tabBulk Email` set status='Sending' where name=%s""",
        (email.name, ),
        auto_commit=auto_commit)
    try:
        if auto_commit:
            smtpserver.setup_email_account(email.reference_doctype)
            smtpserver.replace_sender_in_email(email)
            smtpserver.sess.sendmail(email.sender, email.recipient,
                                     encode(email.message))

        frappe.db.sql(
            """update `tabBulk Email` set status='Sent' where name=%s""",
            (email.name, ),
            auto_commit=auto_commit)

    except (smtplib.SMTPServerDisconnected, smtplib.SMTPConnectError,
            smtplib.SMTPHeloError, smtplib.SMTPAuthenticationError):

        # bad connection, retry later
        frappe.db.sql(
            """update `tabBulk Email` set status='Not Sent' where name=%s""",
            (email.name, ),
            auto_commit=auto_commit)

        # no need to attempt further
        return

    except Exception, e:
        frappe.db.sql("""update `tabBulk Email` set status='Error', error=%s
			where name=%s""", (unicode(e), email.name),
                      auto_commit=auto_commit)
        if now:
            raise e