def delete_logs(): """delete everything that are considered logs""" delete_refused_emails() delete_old_monitoring() for t in TransactionalEmail.query.filter( TransactionalEmail.created_at < arrow.now().shift(days=-7) ): TransactionalEmail.delete(t.id) for b in Bounce.query.filter(Bounce.created_at < arrow.now().shift(days=-7)): Bounce.delete(b.id) db.session.commit()
def delete_logs(): """delete everything that are considered logs""" delete_refused_emails() delete_old_monitoring() for t in TransactionalEmail.filter( TransactionalEmail.created_at < arrow.now().shift(days=-7)): TransactionalEmail.delete(t.id) for b in Bounce.filter(Bounce.created_at < arrow.now().shift(days=-7)): Bounce.delete(b.id) Session.commit() LOG.d("Delete EmailLog older than 2 weeks") max_dt = arrow.now().shift(weeks=-2) nb_deleted = EmailLog.filter(EmailLog.created_at < max_dt).delete() Session.commit() LOG.i("Delete %s email logs", nb_deleted)
def send_email( to_email, subject, plaintext, html=None, unsubscribe_link=None, unsubscribe_via_email=False, ): to_email = sanitize_email(to_email) if NOT_SEND_EMAIL: LOG.d( "send email with subject '%s' to '%s', plaintext: %s", subject, to_email, plaintext, ) return LOG.d("send email to %s, subject %s", to_email, subject) if POSTFIX_SUBMISSION_TLS: smtp = SMTP(POSTFIX_SERVER, 587) smtp.starttls() else: smtp = SMTP(POSTFIX_SERVER, POSTFIX_PORT or 25) msg = MIMEMultipart("alternative") msg.attach(MIMEText(plaintext)) if not html: LOG.d("Use plaintext as html") html = plaintext.replace("\n", "<br>") msg.attach(MIMEText(html, "html")) msg["Subject"] = subject msg["From"] = f"{SUPPORT_NAME} <{SUPPORT_EMAIL}>" msg["To"] = to_email msg_id_header = make_msgid() msg["Message-ID"] = msg_id_header date_header = formatdate() msg["Date"] = date_header if unsubscribe_link: add_or_replace_header(msg, "List-Unsubscribe", f"<{unsubscribe_link}>") if not unsubscribe_via_email: add_or_replace_header( msg, "List-Unsubscribe-Post", "List-Unsubscribe=One-Click" ) # add DKIM email_domain = SUPPORT_EMAIL[SUPPORT_EMAIL.find("@") + 1 :] add_dkim_signature(msg, email_domain) msg_raw = to_bytes(msg) transaction = TransactionalEmail.get_by(email=to_email) if not transaction: transaction = TransactionalEmail.create(email=to_email, commit=True) # use a different envelope sender for each transactional email (aka VERP) smtp.sendmail(TRANSACTIONAL_BOUNCE_EMAIL.format(transaction.id), to_email, msg_raw)
def send_email( to_email, subject, plaintext, html=None, unsubscribe_link=None, unsubscribe_via_email=False, retries=0, # by default no retry if sending fails ignore_smtp_error=False, ): to_email = sanitize_email(to_email) if NOT_SEND_EMAIL: LOG.d( "send email with subject '%s' to '%s', plaintext: %s, html: %s", subject, to_email, plaintext, html, ) return LOG.d("send email to %s, subject '%s'", to_email, subject) if html: msg = MIMEMultipart("alternative") msg.attach(MIMEText(plaintext)) msg.attach(MIMEText(html, "html")) else: msg = EmailMessage() msg.set_payload(plaintext) msg[headers.CONTENT_TYPE] = "text/plain" msg[headers.SUBJECT] = subject msg[headers.FROM] = f"{NOREPLY} <{NOREPLY}>" msg[headers.TO] = to_email msg_id_header = make_msgid() msg[headers.MESSAGE_ID] = msg_id_header date_header = formatdate() msg[headers.DATE] = date_header if unsubscribe_link: add_or_replace_header(msg, headers.LIST_UNSUBSCRIBE, f"<{unsubscribe_link}>") if not unsubscribe_via_email: add_or_replace_header(msg, headers.LIST_UNSUBSCRIBE_POST, "List-Unsubscribe=One-Click") # add DKIM email_domain = NOREPLY[NOREPLY.find("@") + 1:] add_dkim_signature(msg, email_domain) transaction = TransactionalEmail.create(email=to_email, commit=True) # use a different envelope sender for each transactional email (aka VERP) sl_sendmail( TRANSACTIONAL_BOUNCE_EMAIL.format(transaction.id), to_email, msg, retries=retries, ignore_smtp_error=ignore_smtp_error, )