From 67de2a34ac94b9fa6199c2525ac97b66549e47f0 Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 21 Mar 2023 20:09:59 +0530 Subject: [PATCH 1/4] fix: contact us email reply --- frappe/templates/includes/contact.js | 5 +--- frappe/www/contact.py | 43 +++++++--------------------- 2 files changed, 11 insertions(+), 37 deletions(-) diff --git a/frappe/templates/includes/contact.js b/frappe/templates/includes/contact.js index fb0b73ff80..51dc5dc322 100644 --- a/frappe/templates/includes/contact.js +++ b/frappe/templates/includes/contact.js @@ -28,11 +28,8 @@ frappe.ready(function() { sender: email, message: message, callback: function(r) { - if(r.message==="okay") { + if (!r.exc) { frappe.msgprint('{{ _("Thank you for your message") }}'); - } else { - frappe.msgprint('{{ _("There were errors") }}'); - console.log(r.exc); } $(':input').val(''); } diff --git a/frappe/www/contact.py b/frappe/www/contact.py index cf26539ff4..15d639be97 100644 --- a/frappe/www/contact.py +++ b/frappe/www/contact.py @@ -3,7 +3,7 @@ import frappe from frappe import _ -from frappe.utils import now +from frappe.rate_limiter import rate_limit sitemap = 1 @@ -22,38 +22,17 @@ def get_context(context): return out -max_communications_per_hour = 1000 - - @frappe.whitelist(allow_guest=True) -def send_message(subject="Website Query", message="", sender=""): - if not message: - frappe.response["message"] = "Please write something" - return +@rate_limit(limit=1000, seconds=60 * 60, methods=["POST"]) +def send_message(sender, message, subject="Website Query"): + if forward_to_email := frappe.db.get_single_value("Contact Us Settings", "forward_to_email"): + frappe.sendmail(recipients=forward_to_email, reply_to=sender, content=message, subject=subject) - if not sender: - frappe.response["message"] = "Email Address Required" - return - - # guest method, cap max writes per hour - if ( - frappe.db.sql( - """select count(*) from `tabCommunication` - where `sent_or_received`="Received" - and TIMEDIFF(%s, modified) < '01:00:00'""", - now(), - )[0][0] - > max_communications_per_hour - ): - frappe.response[ - "message" - ] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later" - return - - # send email - forward_to_email = frappe.db.get_single_value("Contact Us Settings", "forward_to_email") - if forward_to_email: - frappe.sendmail(recipients=forward_to_email, sender=sender, content=message, subject=subject) + frappe.sendmail( + recipients=sender, + content="Thank you for reaching out to us. We will get back to you at the earliest.", + subject="We've received your query!", + ) # add to to-do ? frappe.get_doc( @@ -66,5 +45,3 @@ def send_message(subject="Website Query", message="", sender=""): status="Open", ) ).insert(ignore_permissions=True) - - return "okay" From 1cb5bfe8755da0a653c6846e407e0374c19ba1f9 Mon Sep 17 00:00:00 2001 From: phot0n Date: Mon, 3 Apr 2023 01:28:56 +0530 Subject: [PATCH 2/4] fix: remove methods arg from tate_limit decorator * feat(minor): send a copy of message to the sender/contactee * feat: validate sender email address for contact us page --- frappe/www/contact.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frappe/www/contact.py b/frappe/www/contact.py index 15d639be97..b27685dfcb 100644 --- a/frappe/www/contact.py +++ b/frappe/www/contact.py @@ -4,6 +4,7 @@ import frappe from frappe import _ from frappe.rate_limiter import rate_limit +from frappe.utils import validate_email_address sitemap = 1 @@ -23,14 +24,15 @@ def get_context(context): @frappe.whitelist(allow_guest=True) -@rate_limit(limit=1000, seconds=60 * 60, methods=["POST"]) +@rate_limit(limit=1000, seconds=60 * 60) def send_message(sender, message, subject="Website Query"): + sender = validate_email_address(sender, throw=True) if forward_to_email := frappe.db.get_single_value("Contact Us Settings", "forward_to_email"): frappe.sendmail(recipients=forward_to_email, reply_to=sender, content=message, subject=subject) frappe.sendmail( recipients=sender, - content="Thank you for reaching out to us. We will get back to you at the earliest.", + content=f"
Thank you for reaching out to us. We will get back to you at the earliest.\n\n\nYour query:\n\n{message}
", subject="We've received your query!", ) From 0e4909b28b31c6bec85c48cda3972a973f3b7cb4 Mon Sep 17 00:00:00 2001 From: phot0n Date: Mon, 3 Apr 2023 02:31:03 +0530 Subject: [PATCH 3/4] refactor: remove frappe.send_message js util --- frappe/templates/includes/contact.js | 18 ++++++++++-------- frappe/website/js/website.js | 9 --------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/frappe/templates/includes/contact.js b/frappe/templates/includes/contact.js index 51dc5dc322..7074e54061 100644 --- a/frappe/templates/includes/contact.js +++ b/frappe/templates/includes/contact.js @@ -23,20 +23,22 @@ frappe.ready(function() { } $("#contact-alert").toggle(false); - frappe.send_message({ - subject: $('[name="subject"]').val(), - sender: email, - message: message, + frappe.call({ + type: "POST", + method: "frappe.www.contact.send_message", + args: { + subject: $('[name="subject"]').val(), + sender: email, + message: message, + }, callback: function(r) { if (!r.exc) { frappe.msgprint('{{ _("Thank you for your message") }}'); } $(':input').val(''); - } - }, this); - return false; + }, + }); }); - }); var msgprint = function(txt) { diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js index afe18d38ec..595234173f 100644 --- a/frappe/website/js/website.js +++ b/frappe/website/js/website.js @@ -213,15 +213,6 @@ $.extend(frappe, { ) .appendTo(document.body); }, - send_message: function (opts, btn) { - return frappe.call({ - type: "POST", - method: "frappe.www.contact.send_message", - btn: btn, - args: opts, - callback: opts.callback, - }); - }, has_permission: function (doctype, docname, perm_type, callback) { return frappe.call({ type: "GET", From cbe0ce37d3f344012db9f7502699ccd1786ad53d Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 4 Apr 2023 12:59:00 +0530 Subject: [PATCH 4/4] fix: suppress outgoing email error for contact-us page --- frappe/www/contact.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/frappe/www/contact.py b/frappe/www/contact.py index b27685dfcb..98aafdef49 100644 --- a/frappe/www/contact.py +++ b/frappe/www/contact.py @@ -1,6 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +from contextlib import suppress + import frappe from frappe import _ from frappe.rate_limiter import rate_limit @@ -27,14 +29,19 @@ def get_context(context): @rate_limit(limit=1000, seconds=60 * 60) def send_message(sender, message, subject="Website Query"): sender = validate_email_address(sender, throw=True) - if forward_to_email := frappe.db.get_single_value("Contact Us Settings", "forward_to_email"): - frappe.sendmail(recipients=forward_to_email, reply_to=sender, content=message, subject=subject) - frappe.sendmail( - recipients=sender, - content=f"
Thank you for reaching out to us. We will get back to you at the earliest.\n\n\nYour query:\n\n{message}
", - subject="We've received your query!", - ) + with suppress(frappe.OutgoingEmailError): + if forward_to_email := frappe.db.get_single_value("Contact Us Settings", "forward_to_email"): + frappe.sendmail(recipients=forward_to_email, reply_to=sender, content=message, subject=subject) + + frappe.sendmail( + recipients=sender, + content=f"
Thank you for reaching out to us. We will get back to you at the earliest.\n\n\nYour query:\n\n{message}
", + subject="We've received your query!", + ) + + # for clearing outgoing email error message + frappe.clear_last_message() # add to to-do ? frappe.get_doc(