Example #1
0
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
	)
Example #2
0
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)
Example #3
0
	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
Example #4
0
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()
Example #6
0
	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)
Example #7
0
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
Example #8
0
	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
Example #9
0
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)
Example #11
0
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)
Example #12
0
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)])
Example #13
0
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"
Example #15
0
	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"))
Example #17
0
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)
Example #18
0
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)
Example #19
0
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
Example #20
0
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)
Example #21
0
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"
Example #22
0
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"
Example #24
0
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
		)
Example #25
0
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)
Example #26
0
	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)
Example #27
0
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
		)
Example #28
0
	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
		)
Example #29
0
    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,
        )
Example #30
0
	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
		)
Example #31
0
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)
Example #32
0
	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)
Example #33
0
 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))
Example #34
0
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)
Example #35
0
    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)
Example #36
0
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
Example #37
0
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'"))    
Example #38
0
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)
Example #39
0
    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
Example #40
0
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)
Example #41
0
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'])
Example #42
0
	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
		)
Example #43
0
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)
				
Example #45
0
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
    )
Example #46
0
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)
Example #47
0
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,
            )
Example #48
0
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)
Example #49
0
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
Example #50
0
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)
Example #52
0
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
Example #53
0
    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)
Example #54
0
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
Example #55
0
    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)
Example #56
0
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'"))
Example #57
0
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"))
Example #58
0
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)
Example #59
0
	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']
		)
Example #60
0
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
    )