def send_project_update_email_to_users(project): doc = frappe.get_doc('Project', project) if is_holiday_today(doc.holiday_list) or not doc.users: return project_update = frappe.get_doc({ "doctype" : "Project Update", "project" : project, "sent": 0, "date": today(), "time": nowtime(), "naming_series": "UPDATE-.project.-.YY.MM.DD.-", }).insert() subject = "For project %s, update your status" % (project) incoming_email_account = frappe.db.get_value('Email Account', dict(enable_incoming=1, default_incoming=1), 'email_id') frappe.sendmail(recipients=get_users_email(doc), message=doc.message, subject=_(subject), reference_doctype=project_update.doctype, reference_name=project_update.name, reply_to=incoming_email_account )
def notify_unreplied(): """Sends email notifications if there are unreplied Communications and `notify_if_unreplied` is set as true.""" for email_account in frappe.get_all("Email Account", "name", filters={"enable_incoming": 1, "notify_if_unreplied": 1}): email_account = frappe.get_doc("Email Account", email_account.name) if email_account.append_to: # get open communications younger than x mins, for given doctype for comm in frappe.get_all("Communication", "name", filters={ "sent_or_received": "Received", "reference_doctype": email_account.append_to, "unread_notification_sent": 0, "creation": ("<", datetime.now() - timedelta(seconds = (email_account.unreplied_for_mins or 30) * 60)), "creation": (">", datetime.now() - timedelta(seconds = (email_account.unreplied_for_mins or 30) * 60 * 3)) }): comm = frappe.get_doc("Communication", comm.name) if frappe.db.get_value(comm.reference_doctype, comm.reference_name, "status")=="Open": # if status is still open frappe.sendmail(recipients=email_account.get_unreplied_notification_emails(), content=comm.content, subject=comm.subject, doctype= comm.reference_doctype, name=comm.reference_name, bulk=True) # update flag comm.db_set("unread_notification_sent", 1)
def send_email(self): """ Sends the link to backup file located at erpnext/backups """ from frappe.email import get_system_managers recipient_list = get_system_managers() db_backup_url = get_url(os.path.join('backups', os.path.basename(self.backup_path_db))) files_backup_url = get_url(os.path.join('backups', os.path.basename(self.backup_path_files))) msg = """Hello, Your backups are ready to be downloaded. 1. [Click here to download the database backup](%(db_backup_url)s) 2. [Click here to download the files backup](%(files_backup_url)s) This link will be valid for 24 hours. A new backup will be available for download only after 24 hours.""" % { "db_backup_url": db_backup_url, "files_backup_url": files_backup_url } datetime_str = datetime.fromtimestamp(os.stat(self.backup_path_db).st_ctime) subject = datetime_str.strftime("%d/%m/%Y %H:%M:%S") + """ - Backup ready to be downloaded""" frappe.sendmail(recipients=recipient_list, msg=msg, subject=subject) return recipient_list
def message_braudcast_send(data): """ this will return recipents details """ dts=json.loads(data) from frappe.model.db_query import DatabaseQuery qry="select user from __Auth where user='******'username'])+"' and password=password('"+cstr(dts['userpass'])+"') " valid=frappe.db.sql(qry) msg='' if not valid: return { "status":"401", "message":"User name or Password is incorrect" } if dts['sms']: from erpnext.setup.doctype.sms_settings.sms_settings import send_sms rc_list=frappe.db.sql("select phone_1 from tabMember where phone_1 is not null and email_id in ('%s') limit 3" %(dts['recipents'].replace(",","','")),as_list=1) if rc_list: send_sms([ x[0] for x in rc_list ], cstr(dts['message'])) msg+= "SMS " rc_list=dts['recipents'].split(',') if dts['push']: data={} data['Message']=dts['message'] gcm = GCM('AIzaSyBIc4LYCnUU9wFV_pBoFHHzLoGm_xHl-5k') res=frappe.db.sql("select device_id from tabUser where name in ('%s')" % "','".join(map(str,rc_list)),as_list=1) if res: res = gcm.json_request(registration_ids=res, data=data,collapse_key='uptoyou', delay_while_idle=True, time_to_live=3600) msg+= "Push notification" if dts['email']: frappe.sendmail(recipients=dts['recipents'], sender='*****@*****.**', content=dts['message'], subject='Broadcast Message') msg+=" Email" return msg +" sent Successfully"
def validate_duplicate(doc,method): if doc.get("__islocal"): res=frappe.db.sql("select name from `tabGroup Churches` where church_group='%s' and church_group_code='%s' and zone='%s'"%(doc.church_group,doc.church_group_code,doc.zone)) if res: frappe.throw(_("Another Group Church '{0}' With Group Church Name '{1}' and Church Group Code '{2}' exist in Zone '{3}'..!").format(res[0][0],doc.church_group,doc.church_group_code,doc.zone)) notify_msg = """Dear User,\n\n Group Church is created with name '%s' for zone '%s'. \n\nRegards,\n\n Love World Synergy"""%(doc.church_group,doc.zone) notify = frappe.db.sql("""select value from `tabSingles` where doctype='Notification Settings' and field='on_creation_of_a_new_cell_pcf_church'""",as_list=1) if notify: if "Email" in notify[0][0]: if doc.contact_email_id: frappe.sendmail(recipients=doc.contact_email_id, content=notify_msg, subject='Group Church Creation Notification') if "SMS" in notify[0][0]: if doc.contact_phone_no: send_sms(doc.contact_phone_no, notify_msg) if "Push Notification" in notify[0][0]: data={} data['Message']=notify_msg gcm = GCM('AIzaSyBIc4LYCnUU9wFV_pBoFHHzLoGm_xHl-5k') res1=frappe.db.sql("select device_id from tabUser where name ='%s'" %(doc.contact_email_id),as_list=1) frappe.errprint(res1) if res1: res1 = gcm.json_request(registration_ids=res1, data=data,collapse_key='uptoyou', delay_while_idle=True, time_to_live=3600) ofc = frappe.new_doc("Offices") ofc.office_id = doc.name ofc.office_name = doc.church_group ofc.office_code = doc.church_group_code ofc.insert()
def test_threading_by_message_id(self): frappe.db.sql("""delete from tabCommunication""") frappe.db.sql("""delete from `tabEmail Queue`""") # reference document for testing event = frappe.get_doc(dict(doctype='Event', subject='test-message')).insert() # send a mail against this frappe.sendmail(recipients='*****@*****.**', subject='test message for threading', message='testing', reference_doctype=event.doctype, reference_name=event.name) last_mail = frappe.get_doc('Email Queue', dict(reference_name=event.name)) # get test mail with message-id as in-reply-to with open(os.path.join(os.path.dirname(__file__), "test_mails", "reply-4.raw"), "r") as f: test_mails = [f.read().replace('{{ message_id }}', last_mail.message_id)] # pull the mail email_account = frappe.get_doc("Email Account", "_Test Email Account 1") email_account.receive(test_mails=test_mails) comm_list = frappe.get_all("Communication", filters={"sender":"*****@*****.**"}, fields=["name", "reference_doctype", "reference_name"]) # check if threaded correctly self.assertEqual(comm_list[0].reference_doctype, event.doctype) self.assertEqual(comm_list[0].reference_name, event.name)
def _send_gstin_reminder(party_type, party, default_email_id=None, sent_to=None): '''Send GST Reminder email''' email_id = frappe.db.get_value('Contact', get_default_contact(party_type, party), 'email_id') if not email_id: # get email from address email_id = default_email_id if not email_id: frappe.throw('Email not found in default contact', exc=EmailMissing) if sent_to and email_id in sent_to: return frappe.sendmail( subject='Please update your GSTIN', recipients=email_id, message=''' <p>Hello,</p> <p>Please help us send you GST Ready Invoices.</p> <p> <a href="{0}?party={1}"> Click here to update your GSTIN Number in our system </a> </p> <p style="color: #aaa; font-size: 11px; margin-top: 30px;"> Get your GST Ready ERP system at <a href="https://erpnext.com">https://erpnext.com</a> <br> ERPNext is a free and open source ERP system. </p> '''.format(os.path.join(get_url(), '/regional/india/update-gstin'), party) ) return email_id
def test_expose(self): from frappe.utils.verified_command import verify_request frappe.sendmail(recipients=['*****@*****.**'], cc=['*****@*****.**'], sender="*****@*****.**", reference_doctype='User', reference_name="Administrator", subject='Testing Email Queue', message='This is mail is queued!', unsubscribe_message="Unsubscribe", now=True) email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1) self.assertEqual(len(email_queue), 1) queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient` where status='Sent'""", as_dict=1)] self.assertTrue('*****@*****.**' in queue_recipients) self.assertTrue('*****@*****.**' in queue_recipients) message = frappe.db.sql("""select message from `tabEmail Queue` where status='Sent'""", as_dict=1)[0].message self.assertTrue('<!--recipient-->' in message) email_obj = email.message_from_string(frappe.safe_decode(frappe.flags.sent_mail)) for part in email_obj.walk(): content = part.get_payload(decode=True) if content: frappe.local.flags.signed_query_string = re.search('(?<=/api/method/frappe.email.queue.unsubscribe\?).*(?=\n)', content.decode()).group(0) self.assertTrue(verify_request()) break
def send_birthday_reminders(): """Send Employee birthday reminders if no 'Stop Birthday Reminders' is not set.""" if int(frappe.db.get_single_value("HR Settings", "stop_birthday_reminders") or 0): return birthdays = get_employees_who_are_born_today() if birthdays: employee_list = frappe.get_all('Employee', fields=['name','employee_name'], filters={'status': 'Active', 'company': birthdays[0]['company'] } ) employee_emails = get_employee_emails(employee_list) birthday_names = [name["employee_name"] for name in birthdays] birthday_emails = [email["user_id"] or email["personal_email"] or email["company_email"] for email in birthdays] birthdays.append({'company_email': '','employee_name': '','personal_email': '','user_id': ''}) for e in birthdays: if e['company_email'] or e['personal_email'] or e['user_id']: if len(birthday_names) == 1: continue recipients = e['company_email'] or e['personal_email'] or e['user_id'] else: recipients = list(set(employee_emails) - set(birthday_emails)) frappe.sendmail(recipients=recipients, subject=_("Birthday Reminder"), message=get_birthday_reminder_message(e, birthday_names), header=['Birthday Reminder', 'green'], )
def daily(): users = frappe.db.sql("""select email, name from tabUser where name in (select parent from tabUserRole where role='Accounts Manager')""", as_dict=1) today = nowdate() end = add_days(today, 3) sales_invoices = frappe.db.sql("""select name from `tabSales Invoice` where (date(due_date) between date(%(start)s) and date(%(end)s)) and outstanding_amount > 0 and docstatus=1""", { "start": today, "end": end, }, as_dict=1) if sales_invoices: subject = "Outstanding sales invoices due %s" % today message = "<p>Please review and follow up with the customers on the outstanding sales invoices below:</p><ul>" from frappe.utils import get_link_to_form for si in sales_invoices: message += "<li>" + get_link_to_form("Sales Invoice", si.name, si.name) + "</li>" message += "</ul><p><b>Note:</b> The list above contains the invoices that are either overdue or have its due date within the next 3 business days</p>" frappe.sendmail(recipients=[u.email for u in users], subject=subject, message=message, reply_to=EMAIL_SENDER, bulk=True) formatted_si = ", ".join(si.name for si in sales_invoices) for u in [u.name for u in users]: todo_doc = frappe.get_doc({ "doctype": "ToDo", "owner": u, "description": subject + ": " + formatted_si, "priority": "Medium", "status": "Open", "role": "Accounts Manager", "date": nowdate(), "assigned_by": frappe.session.user, }) todo_doc.insert(ignore_permissions=True)
def validate_duplicate(doc,method): if doc.get("__islocal"): res=frappe.db.sql("select name from `tabZones` where (zone_name='%s' or zone_code='%s') and region='%s'"%(doc.zone_name,doc.zone_code,doc.region)) frappe.errprint(res) if res: frappe.throw(_("Zone '{0}' already created with same Zone Name '{1}' or Zone Code '{2}' for Region '{3}'..!").format(res[0][0],doc.zone_name,doc.zone_code,doc.region)) notify_msg = """Dear User,\n Region is created with name '%s' for region '%s' \n \n Regards,\n Love World Synergy"""%(doc.zone_name,doc.region) notify = frappe.db.sql("""select value from `tabSingles` where doctype='Notification Settings' and field='on_creation_of_a_new_cell_pcf_church'""",as_list=1) if "Email" in notify[0][0]: if doc.contact_email_id: frappe.sendmail(recipients=doc.contact_email_id, content=notify_msg, subject='Region Creation Notification') if "SMS" in notify[0][0]: if doc.contact_phone_no: send_sms(doc.contact_phone_no, notify_msg) if "Push Notification" in notify[0][0]: data={} data['Message']=notify_msg gcm = GCM('AIzaSyBIc4LYCnUU9wFV_pBoFHHzLoGm_xHl-5k') res1=frappe.db.sql("select device_id from tabUser where name ='%s'" %(doc.contact_email_id),as_list=1) frappe.errprint(res1) if res1: res1 = gcm.json_request(registration_ids=res1, data=data,collapse_key='uptoyou', delay_while_idle=True, time_to_live=3600)
def send_notification(new_rv): """Notify concerned persons about recurring document generation""" frappe.sendmail(new_rv.notification_email_address, subject= _("New {0}: #{1}").format(new_rv.doctype, new_rv.name), message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name), attachments = [frappe.attach_print(new_rv.doctype, new_rv.name, file_name=new_rv.name, print_format=new_rv.recurring_print_format)])
def send_notifications(doc,method): if(doc.employee): msg = """Task {0} is assigned to you, In Time log {1} to {2}, Please complete within Time """.format(doc.task,doc.from_time,doc.to_time) email=frappe.db.get_value("Employee",{"name":doc.employee},"user_id") frappe.sendmail(email, subject=_("Task allocation notification"), content=msg, bulk=True)
def assignmember(memberid,ftv): frappe.db.sql("""update `tabFirst Timer` set ftv_owner='%s' where name='%s' """ % (memberid,ftv)) # recipients='*****@*****.**' member=frappe.db.sql("select member_name,email_id,phone_1 from `tabMember` where name='%s'"%(memberid)) member_ph = frappe.db.sql("select phone_1 from `tabMember` where name='%s'"%(memberid)) ftvdetails=frappe.db.sql("select ftv_name,email_id,task_description,due_date,phone_1 from `tabFirst Timer` where name='%s'"%(ftv)) ftv_ph = frappe.db.sql("select phone_1 from `tabMember` where name='%s'"%(ftv)) msg_member="""Hello %s,\n The First Timer '%s' name: '%s' Email ID: '%s' is assigned to you for follow up.\n Regards,\n Verve """%(member[0][0],ftv,ftvdetails[0][0],ftvdetails[0][1]) msg_ftv="""Hello %s,\n The Member '%s' name: '%s' Email ID: '%s' is assigned to you for follow up.\n Regards, \n Verve """%(ftvdetails[0][0],memberid,member[0][0],member[0][1]) desc="""Member '%s' is assigned to First Timer '%s' for followup."""%(memberid,ftv) task=frappe.get_doc({ "doctype": "Task", "subject": "Assign For followup", "expected_start_date":nowdate(), "expected_start_date":add_days(nowdate(),2), "status": "Open", "project": "", "description":desc }).insert(ignore_permissions=True) if frappe.db.exists("User", ftvdetails[0][1]): frappe.share.add("Task", task.name, ftvdetails[0][1], write=0) if frappe.db.exists("User", member[0][1]): frappe.share.add("Task", task.name, member[0][1], write=1) notify = frappe.db.sql("""select value from `tabSingles` where doctype='Notification Settings' and field='assign_for_followup'""",as_list=1) if "Email" in notify[0][0]: if member: frappe.sendmail(recipients=member[0][1], content=msg_member, subject='Assign For FollowUp Notification') if ftvdetails: frappe.sendmail(recipients=ftvdetails[0][1], content=msg_ftv, subject='Assign For FollowUp Notification') if "SMS" in notify[0][0]: if member_ph: send_sms(member_ph[0], msg_member) if ftv_ph: send_sms(ftv_ph[0], msg_ftv) if "Push Notification" in notify[0][0]: data={} data['Message']=msg_member gcm = GCM('AIzaSyBIc4LYCnUU9wFV_pBoFHHzLoGm_xHl-5k') res=frappe.db.sql("select device_id from tabUser where name ='%s'" %(member[0][1]),as_list=1) frappe.errprint(res) if res: res = gcm.json_request(registration_ids=res, data=data,collapse_key='uptoyou', delay_while_idle=True, time_to_live=3600) # receiver_list=[] # receiver_list.append(member[0][2]) # frappe.errprint(['rev[0]',receiver_list[0]]) # if receiver_list[0] : # frappe.errprint(receiver_list[0]) # send_sms(receiver_list, cstr(msg_member)) # frappe.sendmail(recipients=member[0][1], sender='*****@*****.**', content=msg_member, subject='Assign for follow up') # frappe.sendmail(recipients=ftvdetails[0][1], sender='*****@*****.**', content=msg_ftv, subject='Assign for follow up') return "Done"
def send_login_mail(self, subject, template, add_args): """send mail with login details""" from frappe.utils.user import get_user_fullname from frappe.utils import get_url mail_titles = frappe.get_hooks().get("login_mail_title", []) title = frappe.db.get_default('company') or (mail_titles and mail_titles[0]) or "" full_name = get_user_fullname(frappe.session['user']) if full_name == "Guest": full_name = "Administrator" args = { 'first_name': self.first_name or self.last_name or "user", 'user': self.name, 'title': title, 'login_url': get_url(), 'user_fullname': full_name } args.update(add_args) sender = frappe.session.user not in STANDARD_USERS and frappe.session.user or None frappe.sendmail(recipients=self.email, sender=sender, subject=subject, message=frappe.get_template(template).render(args), as_bulk=self.flags.delay_emails)
def test_sendmail(self): frappe.flags.sent_mail = None frappe.sendmail(sender="*****@*****.**", recipients="*****@*****.**", content="test mail 001", subject="test-mail-001") sent_mail = email.message_from_string(frappe.flags.sent_mail) self.assertTrue("test-mail-001" in sent_mail.get("Subject"))
def send_email(success, service_name, error_status=None): if success: if frappe.db.get_value("Dropbox Settings", None, "send_email_for_successful_backup") == '0': return subject = "Backup Upload Successful" message ="""<h3>Backup Uploaded Successfully</h3><p>Hi there, this is just to inform you that your backup was successfully uploaded to your %s account. So relax!</p> """ % service_name else: subject = "[Warning] Backup Upload Failed" message ="""<h3>Backup Upload Failed</h3><p>Oops, your automated backup to %s failed.</p> <p>Error message: <br> <pre><code>%s</code></pre> </p> <p>Please contact your system manager for more information.</p> """ % (service_name, error_status) if not frappe.db: frappe.connect() recipients = split_emails(frappe.db.get_value("Dropbox Settings", None, "send_notifications_to")) frappe.sendmail(recipients=recipients, subject=subject, message=message)
def send_email_notification(mr_list): """ Notify user about auto creation of indent""" email_list = frappe.db.sql_list( """select distinct r.parent from tabUserRole r, tabUser p where p.name = r.parent and p.enabled = 1 and p.docstatus < 2 and r.role in ('Purchase Manager','Stock Manager') and p.name not in ('Administrator', 'All', 'Guest')""" ) msg = """<h3>Following Material Requests has been raised automatically \ based on item reorder level:</h3>""" for mr in mr_list: msg += ( "<p><b><u>" + mr.name + """</u></b></p><table class='table table-bordered'><tr> <th>Item Code</th><th>Warehouse</th><th>Qty</th><th>UOM</th></tr>""" ) for item in mr.get("items"): msg += ( "<tr><td>" + item.item_code + "</td><td>" + item.warehouse + "</td><td>" + cstr(item.qty) + "</td><td>" + cstr(item.uom) + "</td></tr>" ) msg += "</table>" frappe.sendmail(recipients=email_list, subject="Auto Material Request Generation Notification", message=msg)
def create_project_update(project): data = [] date_today = datetime.date.today() time_now = frappe.utils.now_datetime().strftime('%H:%M:%S') for projects in project: project_update_dict = { "doctype" : "Project Update", "project" : projects[0], "date": date_today, "time": time_now, "naming_series": "UPDATE-.project.-.YY.MM.DD.-" } project_update = frappe.get_doc(project_update_dict) project_update.insert() #you can edit your local_host local_host = "http://localhost:8003" project_update_url = "<a class = 'btn btn-primary' href=%s target='_blank'>" % (local_host +"/desk#Form/Project%20Update/" + (project_update.name)) + ("CREATE PROJECT UPDATE" + "</a>") data.append(project_update_url) email = frappe.db.sql("""SELECT user from `tabProject User` WHERE parent = %s;""", project[0]) for emails in email: frappe.sendmail( recipients=emails, subject=frappe._(projects[0]), header=[frappe._("Please Update your Project Status"), 'blue'], message= project_update_url ) return data
def weekly_digest(): new_jobs = frappe.db.sql("""select job_title, page_name, job_detail, company_name from `tabFrappe Job` where datediff(curdate(), creation) < 7""", as_dict=True) if not new_jobs: return recipients = frappe.db.sql_list("""select distinct owner from `tabFrappe Partner` where name != 'Administrator'""") template = """ <h3>New Jobs Listed on Frappe.io</h3> <table style="width: 100%" cellspacing="0" border="1px" cellpadding="2px"> <tbody> {% for j in jobs %} <tr> <td style="width: 50%"> <a href="https://frappe.io/community/jobs/{{ j.page_name }}"> {{ j.job_title }}</a> <br><span style="color: #888">{{ j.company_name }}</span> </td> <td> {{ j.job_detail[:300] }}{{ "..." if j.job_detail|length > 300 else "" }} </td> </tr> {% endfor %} </tbody> </table> """ print frappe.render_template(template, {"jobs": new_jobs}) frappe.sendmail(recipients = recipients, subject="New Jobs This Week on Frappe.io", message = frappe.render_template(template, {"jobs": new_jobs}), bulk=True)
def send_message(subject="Website Query", message="", sender=""): if not message: frappe.response["message"] = 'Please write something' return 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_value("Contact Us Settings", None, "forward_to_email") if forward_to_email: frappe.sendmail(recipients=forward_to_email, sender=sender, content=message, subject=subject) # add to to-do ? frappe.get_doc(dict( doctype = 'Communication', sender=sender, subject= _('New Message from Website Contact Page'), sent_or_received='Received', content=message, status='Open', )).insert(ignore_permissions=True) return "okay"
def _notify(doc, print_html=None, print_format=None, attachments=None, recipients=None, cc=None): prepare_to_notify(doc, print_html, print_format, attachments) if doc.outgoing_email_account.send_unsubscribe_message: unsubscribe_message = _("Leave this conversation") else: unsubscribe_message = "" frappe.sendmail( recipients=(recipients or []), cc=(cc or []), expose_recipients="header", sender=doc.sender, reply_to=doc.incoming_email_account, subject=doc.subject, content=doc.content, reference_doctype=doc.reference_doctype, reference_name=doc.reference_name, attachments=doc.attachments, message_id=doc.message_id, unsubscribe_message=unsubscribe_message, delayed=True, communication=doc.name, read_receipt=doc.read_receipt, is_notification=True if doc.sent_or_received =="Received" else False )
def process(data): dts=[x for x in data[1:-1].split(',')] for item in dts: itm=item.replace('"','').strip() qry="select first_name,ifnull(last_name,'') from tabUser where name='"+itm+"'" result=frappe.db.sql(qry) import requests import xmltodict ,json req1 = requests.get('http://88.198.52.49:5080/openmeetings/services/UserService/getSession') #frappe.errprint(req1.text) frappe.errprint(req1.text.split('ax23:session_id>')[1][:-2]) req2="http://88.198.52.49:5080/openmeetings/services/UserService/loginUser?SID="+req1.text.split('ax23:session_id>')[1][:-2]+"&username="******"&userpass="******"http://88.198.52.49:5080/openmeetings/services/UserService/loginUser?SID="+req1.text.split('ax23:session_id>')[1][:-2]+"&username=pcfleader1&userpass=pcfleader1" #frappe.errprint(req2) res2=requests.get(req2) frappe.errprint(res2.text) req3="http://88.198.52.49:5080/openmeetings/services/UserService/setUserObjectAndGenerateRoomHashByURLAndRecFlag?SID="+req1.text.split('ax23:session_id>')[1][:-2]+"&username="******"&firstname="+result[0][0]+"&lastname="+result[0][1]+"&profilePictureUrl=http://www.fnordware.com/superpng/pnggrad16rgb.png&[email protected]&externalUserId=1&externalUserType=kadamgn&room_id=1&becomeModeratorAsInt=1&showAudioVideoTestAsInt=1&allowRecording=1" frappe.errprint(req3) res3=requests.get(req3) frappe.errprint(res3.text) hashid=res3.text.split('ns:return>')[1][:-2] url="http://88.198.52.49:5080/openmeetings/?secureHash="+hashid frappe.get_doc({ "doctype": "ToDo", "description": url, "owner":itm }).insert(ignore_permissions=True) frappe.sendmail(recipients=itm+',[email protected]', content=url, subject='Audio meeting url') return "done"
def create_site(site): site = frappe.get_doc("Site", site) cmd = ["bench", "new-site", "--db-name", site.name, "--mariadb-root-username", "root", "--mariadb-root-password", 'frappe', "--admin-password", "logic", "--install-app", "erpnext", site.title] p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, cwd="/home/frappe/frappe-bench") out,err = p.communicate() if not err: """Create an orientation meeting when a new User is added""" lead = frappe.get_doc({ "doctype": "Lead", "lead_name": site.title, "email_id": site.email, "status": "Lead" }) # the System Manager might not have permission to create a Meeting lead.flags.ignore_permissions = True lead.insert() frappe.sendmail( recipients = [site.email], sender="*****@*****.**", subject="Your ERP Account", message = "Dear Customer, your account has been create and accessible from: http://%s:8000" % (site.title), reference_doctype=site.doctype, reference_name=site.name )
def send_feedback_request(reference_doctype, reference_name, trigger="Manual", details=None, is_manual=False): """ send feedback alert """ if is_feedback_request_already_sent(reference_doctype, reference_name, is_manual=is_manual): frappe.msgprint(_("Feedback Request is already sent to user")) return None details = json.loads(details) if details else \ get_feedback_request_details(reference_doctype, reference_name, trigger=trigger) if not details: return None feedback_request, url = get_feedback_request_url(reference_doctype, reference_name, details.get("recipients"), trigger) feedback_msg = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url }) # appending feedback url to message body message = "{message}{feedback_msg}".format( message=details.get("message"), feedback_msg=feedback_msg ) details.update({ "message": message, "header": [details.get('subject'), 'blue'] }) if details: frappe.sendmail(**details) frappe.db.set_value("Feedback Request", feedback_request, "is_sent", 1)
def send_login_mail(self, subject, template, add_args, now=None): """send mail with login details""" from frappe.utils.user import get_user_fullname from frappe.utils import get_url mail_titles = frappe.get_hooks().get("login_mail_title", []) title = frappe.db.get_default('company') or (mail_titles and mail_titles[0]) or "" full_name = get_user_fullname(frappe.session['user']) if full_name == "Guest": full_name = "Administrator" args = { 'first_name': self.first_name or self.last_name or "user", 'user': self.name, 'title': title, 'login_url': get_url(), 'user_fullname': full_name } args.update(add_args) sender = frappe.session.user not in STANDARD_USERS and get_formatted_email(frappe.session.user) or None frappe.sendmail(recipients=self.email, sender=sender, subject=subject, template=template, args=args, header=[subject, "green"], delayed=(not now) if now!=None else self.flags.delay_emails, retry=3)
def notify_mentions(doc): if doc.communication_type != "Comment": return if doc.reference_doctype and doc.reference_name and doc.content and doc.comment_type=="Comment": mentions = extract_mentions(doc.content) if not mentions: return sender_fullname = get_fullname(frappe.session.user) parent_doc_label = "{0} {1}".format(_(doc.reference_doctype), doc.reference_name) subject = _("{0} mentioned you in a comment in {1}").format(sender_fullname, parent_doc_label) message = frappe.get_template("templates/emails/mentioned_in_comment.html").render({ "sender_fullname": sender_fullname, "comment": doc, "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label) }) recipients = [frappe.db.get_value("User", {"enabled": 1, "username": username, "user_type": "System User"}) for username in mentions] frappe.sendmail( recipients=recipients, sender=frappe.session.user, subject=subject, message=message, bulk=True )
def send(self): if self.filter_meta and not self.filters: frappe.throw(_("Please set filters value in Report Filter table.")) data = self.get_report_content() if not data: return attachments = None message = '<p>{0}</p>'.format(_('{0} generated on {1}')\ .format(frappe.bold(self.name), frappe.utils.format_datetime(frappe.utils.now_datetime()))) if self.description: message += '<hr>' + self.description if self.format=='HTML': message += '<hr>' + data else: attachments = [{ 'fname': self.get_file_name(), 'fcontent': data }] message += '<hr><p style="font-size: 10px;"> Edit Auto Email Report Settings: {0}</p>'.format(frappe.utils.get_link_to_form('Auto Email Report', self.name)) frappe.sendmail( recipients = self.email_to.split(), subject = self.name, message = message, attachments = attachments )
def send_login_mail(self, subject, template, add_args, now=None): """send mail with login details""" from frappe.utils.user import get_user_fullname from frappe.utils import get_url mail_titles = frappe.get_hooks().get("login_mail_title", []) title = frappe.db.get_default("company") or (mail_titles and mail_titles[0]) or "" full_name = get_user_fullname(frappe.session["user"]) if full_name == "Guest": full_name = "Administrator" args = { "first_name": self.first_name or self.last_name or "user", "user": self.name, "title": title, "login_url": get_url(), "user_fullname": full_name, } args.update(add_args) sender = frappe.session.user not in STANDARD_USERS and get_formatted_email(frappe.session.user) or None frappe.sendmail( recipients=self.email, sender=sender, subject=subject, message=frappe.get_template(template).render(args), delayed=(not now) if now != None else self.flags.delay_emails, )
def send(self): if self.filter_meta and not self.filters: frappe.throw(_("Please set filters value in Report Filter table.")) data = self.get_report_content() if not data: return attachments = None if self.format == "HTML": message = data else: message = self.get_html_table() if not self.format=='HTML': attachments = [{ 'fname': self.get_file_name(), 'fcontent': data }] frappe.sendmail( recipients = self.email_to.split(), subject = self.name, message = message, attachments = attachments, reference_doctype = self.doctype, reference_name = self.name )
def send_email(success, service_name, error_status=None): if success: subject = "Backup Upload Successful" message ="""<h3>Backup Uploaded Successfully</h3><p>Hi there, this is just to inform you that your backup was successfully uploaded to your %s account. So relax!</p> """ % service_name else: subject = "[Warning] Backup Upload Failed" message ="""<h3>Backup Upload Failed</h3><p>Oops, your automated backup to %s failed.</p> <p>Error message: %s</p> <p>Please contact your system manager for more information.</p> """ % (service_name, error_status) if not frappe.db: frappe.connect() recipients = frappe.db.get_value("Backup Manager", None, "send_notifications_to").split(",") frappe.sendmail(recipients=recipients, subject=subject, message=message)
def send_auto_reply(self, communication, email): """Send auto reply if set.""" if self.enable_auto_reply: set_incoming_outgoing_accounts(communication) if self.send_unsubscribe_message: unsubscribe_message = _("Leave this conversation") else: unsubscribe_message = "" frappe.sendmail(recipients = [email.from_email], sender = self.email_id, reply_to = communication.incoming_email_account, subject = _("Re: ") + communication.subject, content = render_template(self.auto_reply_message or "", communication.as_dict()) or \ frappe.get_template("templates/emails/auto_reply.html").render(communication.as_dict()), reference_doctype = communication.reference_doctype, reference_name = communication.reference_name, in_reply_to = email.mail.get("Message-Id"), # send back the Message-Id as In-Reply-To unsubscribe_message = unsubscribe_message)
def email_salary_slip(self): receiver = frappe.db.get_value("Employee", self.employee, "company_email") or \ frappe.db.get_value("Employee", self.employee, "personal_email") if receiver: subj = 'Salary Slip - from {0} to {1}, fiscal year {2}'.format( self.start_date, self.end_date, self.fiscal_year) frappe.sendmail([receiver], subject=subj, message=_("Please see attachment"), attachments=[ frappe.attach_print(self.doctype, self.name, file_name=self.name) ], reference_doctype=self.doctype, reference_name=self.name) else: msgprint( _("{0}: Employee email not found, hence email not sent"). format(self.employee_name))
def send_birthday_reminders(): """Send Employee birthday reminders if no 'Stop Birthday Reminders' is not set.""" if int(frappe.db.get_single_value("HR Settings", "stop_birthday_reminders") or 0): return from frappe.utils.user import get_enabled_system_users users = None birthdays = get_employees_who_are_born_today() if birthdays: if not users: users = [u.email_id or u.name for u in get_enabled_system_users()] for e in birthdays: frappe.sendmail(recipients=filter(lambda u: u not in (e.company_email, e.personal_email), users), subject=_("Birthday Reminder for {0}").format(e.employee_name), message=_("""Today is {0}'s birthday!""").format(e.employee_name), reply_to=e.company_email or e.personal_email, bulk=True)
def send(self): # send email only to enabled users valid_users = [ p[0] for p in frappe.db.sql("""select name from `tabUser` where enabled=1""") ] recipients = filter(lambda r: r in valid_users, self.recipient_list.split("\n")) common_msg = self.get_common_content() if recipients: for user_id in recipients: msg_for_this_receipient = self.get_msg_html(self.get_user_specific_content(user_id) + \ common_msg) if msg_for_this_receipient: frappe.sendmail(recipients=user_id, subject="{frequency} Digest".format( frequency=self.frequency), message=msg_for_this_receipient, bulk=True)
def _notify(contact, txt, subject=None): from frappe.utils import get_fullname, get_url try: if not isinstance(contact, list): contact = [ frappe.db.get_value("User", contact, "email") or contact ] frappe.sendmail(\ recipients=contact, sender= frappe.db.get_value("User", frappe.session.user, "email"), subject=subject or "New Message from " + get_fullname(frappe.session.user), message=frappe.get_template("templates/emails/new_message.html").render({ "from": get_fullname(frappe.session.user), "message": txt, "link": get_url() }), bulk=True) except frappe.OutgoingEmailError: pass
def send_invitation_emails(meeting): meeting = frappe.get_doc("Meeting", meeting) meeting.check_permission("email") if meeting.status == "Planned": frappe.sendmail( recipients=[d.attendee for d in meeting.attendees], sender=frappe.session.user, subject=meeting.title, message=meeting.invitation_message, reference_doctype=meeting.doctype, reference_name=meeting.name ) meeting.status = "Invitation Sent" meeting.save() frappe.msgprint(_("Invitation Sent")) else: frappe.msgprint(_("Meeting status must be 'Planned'"))
def send_event_digest(): today = nowdate() for user in get_enabled_system_users(): events = get_events(today, today, user.name, for_reminder=True) if events: text = "" frappe.set_user_lang(user.name, user.language) text = "<h3>" + frappe._("Events In Today's Calendar") + "</h3>" for e in events: if e.all_day: e.starts_on = "All Day" text += "<h4>%(starts_on)s: %(subject)s</h4><p>%(description)s</p>" % e text += '<p style="color: #888; font-size: 80%; margin-top: 20px; padding-top: 10px; border-top: 1px solid #eee;">'\ + frappe._("Daily Event Digest is sent for Calendar Events where reminders are set.")+'</p>' frappe.sendmail(recipients=user.email, subject=frappe._("Upcoming Events for Today"), content=text)
def send_welcome_email(self): url = get_url("/project/?name={0}".format(self.name)) messages = ( _("You have been invited to collaborate on the project: {0}"). format(self.name), url, _("Join"), ) content = """ <p>{0}.</p> <p><a href="{1}">{2}</a></p> """ for user in self.users: if user.welcome_email_sent == 0: frappe.sendmail(user.user, subject=_("Project Collaboration Invitation"), content=content.format(*messages)) user.welcome_email_sent = 1
def send_email_notification(mr_list): """ Notify user about auto creation of indent""" email_list = frappe.db.sql_list("""select distinct r.parent from tabUserRole r, tabUser p where p.name = r.parent and p.enabled = 1 and p.docstatus < 2 and r.role in ('Purchase Manager','Material Manager') and p.name not in ('Administrator', 'All', 'Guest')""") msg="""<h3>Following Material Requests has been raised automatically \ based on item reorder level:</h3>""" for mr in mr_list: msg += "<p><b><u>" + mr.name + """</u></b></p><table class='table table-bordered'><tr> <th>Item Code</th><th>Warehouse</th><th>Qty</th><th>UOM</th></tr>""" for item in mr.get("items"): msg += "<tr><td>" + item.item_code + "</td><td>" + item.warehouse + "</td><td>" + \ cstr(item.qty) + "</td><td>" + cstr(item.uom) + "</td></tr>" msg += "</table>" frappe.sendmail(recipients=email_list, subject='Auto Material Request Generation Notification', message = msg)
def send_event_digest(): today = nowdate() for user in get_enabled_system_users(): events = get_events(today, today, user.name, for_reminder=True) if events: frappe.set_user_lang(user.name, user.language) for e in events: e.starts_on = format_datetime(e.starts_on, 'hh:mm a') if e.all_day: e.starts_on = "All Day" frappe.sendmail( recipients=user.email, subject=frappe._("Upcoming Events for Today"), template="upcoming_events", args={ 'events': events, }, header=[frappe._("Events in Today's Calendar"), 'blue'])
def _notify(self, print_html=None, print_format=None, attachments=None, recipients=None, cc=None): self.prepare_to_notify(print_html, print_format, attachments) frappe.sendmail( recipients=(recipients or []) + (cc or []), show_as_cc=(cc or []), expose_recipients=True, sender=self.sender, reply_to=self.incoming_email_account, subject=self.subject, content=self.content, reference_doctype=self.reference_doctype, reference_name=self.reference_name, attachments=self.attachments, message_id=self.name, unsubscribe_message=_("Leave this conversation"), bulk=True )
def send_email(success, service_name, error_status=None): if success: subject = "Backup Upload Successful" message = """<h3>Backup Uploaded Successfully for %s </h3><p>Hi there, this is just to inform you that your backup was successfully uploaded to your Amazon S3 bucket. So relax!</p> """ \ % frappe.db.get_value("Amazon S3 Settings", None, "company_name") else: subject = "[Warning] Backup Upload Failed" message = """<h3>Backup Upload Failed for %s </h3><p>Oops, your automated backup to Amazon S3 failed. </p> <p>Error message: %s</p> <p>Please contact your system manager for more information.</p>""" % (frappe.db.get_value( "Amazon S3 Settings", None, "company_name"), error_status) if not frappe.db: frappe.connect() recipients = split_emails( frappe.db.get_value("Amazon S3 Settings", None, "notification_email")) frappe.sendmail(recipients=recipients, subject=subject, message=message)
def notify_leave_Manager(doc,method): if (not doc.previous_doc) or (doc.previous_doc and \ doc.status == "Open" and doc.previous_doc.leave_approver != doc.leave_approver): manager_list=frappe.db.sql("select cc_name from tabCC where parent = '%s'"%(doc.employee), as_list=1) subj=_("New Leave Application") messages = ("New leave Application:{0} from Employee:{1} From:{2} To:{3}").format(doc.name,doc.employee_name,doc.from_date,doc.to_date) if manager_list: for email_id in manager_list: frappe.sendmail(email_id[0],subject=subj,message=messages) frappe.sendmail(doc.leave_approver,subject=subj,message=messages) # def notify_leave_approv(doc,method): # if (not doc.previous_doc) or (doc.previous_doc and \ # doc.status == "Open" and doc.previous_doc.leave_approver != doc.leave_approver): # manager_list=frappe.db.sql("select leave_approver from `tabLeave Application` where employee_name = '%s'"%(doc.employee), as_list=1) # if manager_list: # for email_id in manager_list: # subj=_("New Leave Application") # messages = ("New leave Application:{0} from Employee:{1} From:{2} To:{3}").format(doc.name,doc.employee_name,doc.from_date,doc.to_date) # frappe.sendmail(email_id[0],subject=subj,message=messages)
def send_weekly_report(): from_date = str(date.today() - relativedelta(weeks=1)) to_date = add_days(today(), -1) custom_filter = {'from_date': from_date, 'to_date': to_date} report = frappe.get_doc('Report', "Client Weekly Report") columns, data = report.get_data( limit=500 or 500, filters=custom_filter, as_dict=True) html = frappe.render_template( 'frappe/templates/includes/print_table.html', {'columns': columns, 'data': data}) msg = "Kindly find the attached Client Weekly Report From " + \ formatdate(from_date) + " To " + formatdate(to_date) frappe.sendmail( recipients=['*****@*****.**' # '*****@*****.**', # '*****@*****.**' ], subject='Client Weekly Report Upto - ' + formatdate(add_days(today(), -1)), message=msg + html )
def weekly_digest(): new_jobs = frappe.db.sql( """select job_title, page_name, job_detail, company_name from `tabFrappe Job` where datediff(curdate(), creation) < 7""", as_dict=True) if not new_jobs: return recipients = frappe.db.sql_list( """select distinct owner from `tabFrappe Partner` where name != 'Administrator'""") template = """ <h3>New Jobs Listed on Frappe.io</h3> <table style="width: 100%" cellspacing="0" border="1px" cellpadding="2px"> <tbody> {% for j in jobs %} <tr> <td style="width: 50%"> <a href="https://frappe.io/community/jobs/{{ j.page_name }}"> {{ j.job_title }}</a> <br><span style="color: #888">{{ j.company_name }}</span> </td> <td> {{ j.job_detail[:300] }}{{ "..." if j.job_detail|length > 300 else "" }} </td> </tr> {% endfor %} </tbody> </table> """ print frappe.render_template(template, {"jobs": new_jobs}) frappe.sendmail(recipients=recipients, subject="New Jobs This Week on Frappe.io", message=frappe.render_template(template, {"jobs": new_jobs}), bulk=True)
def send_daily_feedback_reminder(): reminder_settings = frappe.db.get_value( "HR Settings", "HR Settings", [ "send_interview_feedback_reminder", "feedback_reminder_notification_template" ], as_dict=True, ) if not reminder_settings.send_interview_feedback_reminder: return interview_feedback_template = frappe.get_doc( "Email Template", reminder_settings.feedback_reminder_notification_template) interviews = frappe.get_all("Interview", filters={ "status": ["in", ["Under Review", "Pending"]], "docstatus": ["!=", 2] }) for entry in interviews: recipients = get_recipients(entry.name, for_feedback=1) doc = frappe.get_doc("Interview", entry.name) context = doc.as_dict() message = frappe.render_template(interview_feedback_template.response, context) if len(recipients): frappe.sendmail( recipients=recipients, subject=interview_feedback_template.subject, message=message, reference_doctype="Interview", reference_name=entry.name, )
def send_site_details_email(): domain = frappe.form_dict.get('domain') admin_pass = frappe.form_dict.get('admin_pass') company = frappe.get_value("Site", dict(domain=domain), ["company_name", "company_email", "name"], as_dict=1) # Send them a welcome email msg = """<div dir="rtl"><br><h4> أهلا بكم مجددا في نماء.. </h4><br></div><div dir="rtl"><h5> يسعدنا أن نبلغكم بأن موقعكم الخاص بنظام نماء المحاسبي جاهز الآن للإستخدام.. <br> للدخول إلي موقعكم.. يرجى الضغط على الرابط التالي: </h5></div><div dir="rtl"><h3> {domain} <br></h3></div><div dir="rtl"> بيانات الدخول:<br> </div><div dir="rtl"><h4> اسم المستخدم: <b>Administrator</b><br> </h4></div><div dir="rtl"><h4> كلمة المرور: <b>{admin_pass}</b><br> </h4></div> <div dir="rtl"><h5> <br>نتمنى لكم محاسبة أكثر دقة مع نماء<br> <br></h5></div><div dir="ltr"><h4> فريق عمل نماء </h4> </div>""".format(domain=domain, admin_pass=admin_pass) frappe.sendmail(message=msg, recipients=[company.company_email], subject="تفعيل حسابك في نماء", sender="*****@*****.**", delayed=False, as_markdown=True) site = frappe.get_doc("Site", company.name) site.status = "Active" site.save(ignore_permissions=1)
def notify_party(filters, report, html=None): filters = frappe._dict(json.loads(filters)) report = frappe._dict(json.loads(report)) attachments = [ frappe.attach_print(report.doctype, report.report_name, html=html) ] party = frappe.db.get_value(filters.party_type, filters.party, "email_id") if not party: frappe.throw( _("Email id is not mentioned in the {0} master for {1}.").format( filters.party_type, frappe.bold(filters.party))) #soa_template = soa template stand for statement of account template soa_template = frappe.db.get_single_value( "Accounts Settings", "statement_of_account_email_template") if soa_template: email_template = frappe.get_doc("Email Template", soa_template) message = frappe.render_template( email_template.response, { "party": filters.party, "from_date": filters.from_date, "to_date": filters.to_date }) subject = email_template.subject else: subject = report.report_name, message = ( _("Statement of Account of {0} {1} for period {2} to {3}").format( filters.party_type, frappe.bold(filters.party), frappe.bold(filters.from_date), frappe.bold(filters.to_date))) frappe.sendmail(recipients=[party], subject=subject, message=message, attachments=attachments, reference_doctype=report.doctype, reference_name=report.report_name) return party
def subscribe(email, email_group=_("Website")): """API endpoint to subscribe an email to a particular email group. Triggers a confirmation email. """ # build subscription confirmation URL api_endpoint = frappe.utils.get_url( "/api/method/frappe.email.doctype.newsletter.newsletter.confirm_subscription" ) signed_params = get_signed_params({"email": email, "email_group": email_group}) confirm_subscription_url = f"{api_endpoint}?{signed_params}" # fetch custom template if available email_confirmation_template = frappe.db.get_value( "Email Group", email_group, "confirmation_email_template" ) # build email and send if email_confirmation_template: args = {"email": email, "confirmation_url": confirm_subscription_url, "email_group": email_group} email_template = frappe.get_doc("Email Template", email_confirmation_template) email_subject = email_template.subject content = frappe.render_template(email_template.response, args) else: email_subject = _("Confirm Your Email") translatable_content = ( _("Thank you for your interest in subscribing to our updates"), _("Please verify your Email Address"), confirm_subscription_url, _("Click here to verify"), ) content = """ <p>{0}. {1}.</p> <p><a href="{2}">{3}</a></p> """.format(*translatable_content) frappe.sendmail( email, subject=email_subject, content=content, now=True, )
def validate_duplicate(doc, method): if doc.get("__islocal"): res = frappe.db.sql( "select name from `tabGroup Churches` where church_group='%s' and church_group_code='%s' and zone='%s'" % (doc.church_group, doc.church_group_code, doc.zone)) if res: frappe.throw( _("Another Group Church '{0}' With Group Church Name '{1}' and Church Group Code '{2}' exist in Zone '{3}'..!" ).format(res[0][0], doc.church_group, doc.church_group_code, doc.zone)) notify_msg = """Dear User,\n\n Group Church is created with name '%s' for zone '%s'. \n\nRegards,\n\n Love World Synergy""" % ( doc.church_group, doc.zone) notify = frappe.db.sql( """select value from `tabSingles` where doctype='Notification Settings' and field='on_creation_of_a_new_cell_pcf_church'""", as_list=1) if notify: if "Email" in notify[0][0]: if doc.contact_email_id: frappe.sendmail( recipients=doc.contact_email_id, content=notify_msg, subject='Group Church Creation Notification') if "SMS" in notify[0][0]: if doc.contact_phone_no: send_sms(doc.contact_phone_no, notify_msg) if "Push Notification" in notify[0][0]: data = {} data['Message'] = notify_msg gcm = GCM('AIzaSyBIc4LYCnUU9wFV_pBoFHHzLoGm_xHl-5k') res1 = frappe.db.sql( "select device_id from tabUser where name ='%s'" % (doc.contact_email_id), as_list=1) frappe.errprint(res1) if res1: res1 = gcm.json_request(registration_ids=res1, data=data, collapse_key='uptoyou', delay_while_idle=True, time_to_live=3600)
def send_email(name, email, phone, is_guest, vendor_list): vendor_offer_doc = frappe.get_single('Vendor Carousel and Email template') raw_subject = vendor_offer_doc.subject or '' raw_email = vendor_offer_doc.email or '' if is_guest == True: is_guest = 'No, user is a guest' else: is_guest = 'Yes, user is an existing member' raw_vendor_list = json.loads(vendor_list) count = 0 for vendor in raw_vendor_list: subject = raw_subject.replace('{sender_name}', name or "").replace( '{sender_email}', email or "").replace('{sender_phone}', phone or "").replace( '{sender_is_guest}', is_guest or "").replace('{vendor_name}', vendor or "") email = raw_email.replace('{sender_name}', name or "").replace( '{sender_email}', email or "").replace('{sender_phone}', phone or "").replace( '{sender_is_guest}', is_guest or "").replace('{vendor_name}', vendor or "") vendor_email = frappe.db.sql( """select contact_email_for_offers from `tabSupplier` where name=%s""", vendor, as_dict=1) outgoing_email_id = frappe.get_doc("Email Account", {"default_outgoing": "1"}) if outgoing_email_id: recipients = split_emails( frappe.db.get_value("Supplier", filters={"name": vendor}, fieldname="contact_email_for_offers")) frappe.sendmail(recipients=recipients, message=email, subject=subject) recipients = None subject = None email = None count = count + 1 return count
def _notify(self, print_html=None, print_format=None, attachments=None, recipients=None, except_recipient=False): self.prepare_to_notify(print_html, print_format, attachments) if not recipients: recipients = self.get_recipients(except_recipient=except_recipient) frappe.sendmail(recipients=recipients, sender=self.sender, reply_to=self.incoming_email_account, subject=self.subject, content=self.content, reference_doctype=self.reference_doctype, reference_name=self.reference_name, attachments=self.attachments, message_id=self.name, unsubscribe_message=_("Leave this conversation"), bulk=True)
def send_token_via_email(tmp_id,token=None): import pyotp user = frappe.cache().get(tmp_id + '_user') count = token or frappe.cache().get(tmp_id + '_token') if ((not user) or (user == 'None') or (not count)): return False user_email = frappe.db.get_value('User',user, 'email') if not user_email: return False otpsecret = frappe.cache().get(tmp_id + '_otp_secret') hotp = pyotp.HOTP(otpsecret) frappe.sendmail( recipients=user_email, sender=None, subject='Verification Code', message='<p>Your verification code is {0}</p>'.format(hotp.at(int(count))), delayed=False, retry=3) return True
def send(self): if self.filter_meta and not self.filters: frappe.throw(_("Please set filters value in Report Filter table.")) data = self.get_report_content() if not data: return attachments = None if self.format == "HTML": message = data else: message = self.get_html_table() if not self.format == 'HTML': attachments = [{'fname': self.get_file_name(), 'fcontent': data}] frappe.sendmail(recipients=self.email_to.split(), subject=self.name, message=message, attachments=attachments)
def notify_user(doc, method): site = frappe.get_doc("Site", doc.name) #site.check_permission("email") if site.status == "Pending Approval": site.email_verification_code = id_generator() frappe.sendmail( recipients=[site.email], sender='*****@*****.**', subject="Validate your account", message= "Please validate your email, click on this link: https://intego.rw/api/method/saas.api.verify_account?name=%s&code=%s" % (site.name, site.email_verification_code), reference_doctype=site.doctype, reference_name=site.name) site.status = "Email Sent" site.save(ignore_permissions=True) frappe.db.commit() #frappe.msgprint(_("Confirmation emails sent")) else: frappe.msgprint(_("Site Status must be 'Pending Approval'"))
def send_invitation_emails(meeting): """ Send an invitation email whenever the 'send email' button is clicked in the form """ meeting = frappe.get_doc("Meeting", meeting) meeting.check_permission("email") if meeting.status == "Planned": frappe.sendmail(recipients=[x.attendee for x in meeting.attendees], sender=frappe.session.user, subject=meeting.title, message=meeting.invitation_message, reference_doctype=meeting.doctype, reference_name=meeting.name # as_bulk=True ) meeting.status = "Invitation Sent" meeting.save() frappe.msgprint(_("Invitation Sent")) else: frappe.msgprint(_("Meeting Status must be planned"))
def send_notification(new_rv, subscription_doc, print_format='Standard'): """Notify concerned persons about recurring document generation""" print_format = print_format subject = subscription_doc.subject or '' message = subscription_doc.message or '' if not subscription_doc.subject: subject = _("New {0}: #{1}").format(new_rv.doctype, new_rv.name) elif "{" in subscription_doc.subject: subject = frappe.render_template(subscription_doc.subject, {'doc': new_rv}) if not subscription_doc.message: message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name) elif "{" in subscription_doc.message: message = frappe.render_template(subscription_doc.message, {'doc': new_rv}) attachments = [frappe.attach_print(new_rv.doctype, new_rv.name, file_name=new_rv.name, print_format=print_format)] frappe.sendmail(subscription_doc.recipients, subject=subject, message=message, attachments=attachments)
def notify_error_to_user(self, error_log): recipients = list(get_system_managers(only_name=True)) recipients.append(self.owner) subject = _("Auto Repeat Document Creation Failed") form_link = frappe.utils.get_link_to_form(self.reference_doctype, self.reference_document) auto_repeat_failed_for = _('Auto Repeat failed for {0}').format(form_link) error_log_link = frappe.utils.get_link_to_form('Error Log', error_log.name) error_log_message = _('Check the Error Log for more information: {0}').format(error_log_link) frappe.sendmail( recipients=recipients, subject=subject, template="auto_repeat_fail", args={ 'auto_repeat_failed_for': auto_repeat_failed_for, 'error_log_message': error_log_message }, header=[subject, 'red'] )
def send_daily_linewise_report(): custom_filter = {'date': add_days(today(), -1)} report = frappe.get_doc('Report', "Linewise Count") columns, data = report.get_data( limit=100, filters=custom_filter, as_dict=True) spreadsheet_data = get_spreadsheet_data(columns, data) xlsx_file = make_xlsx(spreadsheet_data, "Attendance") data = xlsx_file.getvalue() attachments = [{ 'fname': add_days(today(), -1) + '.xlsx', 'fcontent': data }] frappe.sendmail( recipients=['*****@*****.**', '*****@*****.**', '*****@*****.**'], subject='Employee Attendance Report - ' + formatdate(add_days(today(), -1)), message='Kindly find the attached Excel Sheet of Linewise Count Report of' + formatdate( add_days(today(), -1)), attachments=attachments )