def validate(self): """Validate email id and check POP3/IMAP and SMTP connections is enabled.""" if self.email_id: validate_email_address(self.email_id, True) if frappe.local.flags.in_patch or frappe.local.flags.in_test: return if not frappe.local.flags.in_install and not frappe.local.flags.in_patch: try: if self.use_imap: if self.use_ssl: test = imaplib.IMAP4_SSL(self.email_server, port=get_port(self)) else: test = imaplib.IMAP4(self.email_server, port=get_port(self)) else: if self.use_ssl: test = poplib.POP3_SSL(self.email_server, port=get_port(self)) else: test = poplib.POP3(self.email_server, port=get_port(self)) except Exception: frappe.throw(_("Incoming email account not correct")) return None finally: try: if self.use_imap: test.logout() else: test.quit() except Exception: pass try: if self.use_ssl_for_outgoing: print(self.smtp_port) if not self.smtp_port: self.smtp_port = 465 sess = smtplib.SMTP_SSL((self.smtp_server or "").encode('utf-8'), cint(self.smtp_port) or None) else: if self.use_tls and not self.smtp_port: self.smtp_port = 587 sess = smtplib.SMTP(cstr(self.smtp_server or ""), cint(self.smtp_port) or None) sess.quit() except Exception as e: frappe.throw(_("Outgoing email account not correct")) return None return
def get_incoming_server(self, in_receive=False, email_sync_rule="UNSEEN"): """Returns logged in POP3/IMAP connection object.""" if frappe.cache().get_value("workers:no-internet") == True: return None args = frappe._dict({ "email_account": self.name, "host": self.email_server, "use_ssl": self.use_ssl, "username": getattr(self, "login_id", None) or self.email_id, "use_imap": self.use_imap, "email_sync_rule": email_sync_rule, "uid_validity": self.uidvalidity, "incoming_port": get_port(self), "initial_sync_count": self.initial_sync_count or 100 }) if self.password: args.password = self.get_password() if not args.get("host"): frappe.throw(_("{0} is required").format("Email Server")) email_server = EmailServer(frappe._dict(args)) self.check_email_server_connection(email_server, in_receive) if not in_receive and self.use_imap: email_server.imap.logout() # reset failed attempts count self.set_failed_attempts_count(0) return email_server
def setup_incoming_email_port_in_email_accounts(): email_accounts = frappe.db.get_all("Email Account", ['incoming_port', 'use_imap', 'use_ssl', 'name', 'enable_incoming']) for account in email_accounts: if account.enable_incoming and not account.incoming_port: incoming_port = get_port(account) frappe.db.set_value("Email Account", account.name, 'incoming_port', incoming_port, update_modified=False)
def setup_incoming_email_port_in_email_domains(): email_domains = frappe.db.get_all("Email Domain", ['incoming_port', 'use_imap', 'use_ssl', 'name']) for domain in email_domains: if not domain.incoming_port: incoming_port = get_port(domain) frappe.db.set_value("Email Domain", domain.name, 'incoming_port', incoming_port, update_modified=False) #update incoming email port in all frappe.db.sql('''update `tabEmail Account` set incoming_port=%s where domain = %s''', (domain.incoming_port, domain.name))
def setup_incoming_email_port_in_email_accounts(): email_accounts = frappe.db.get_all( "Email Account", ["incoming_port", "use_imap", "use_ssl", "name", "enable_incoming"]) for account in email_accounts: if account.enable_incoming and not account.incoming_port: incoming_port = get_port(account) frappe.db.set_value("Email Account", account.name, "incoming_port", incoming_port, update_modified=False)
def setup_incoming_email_port_in_email_domains(): email_domains = frappe.db.get_all( "Email Domain", ["incoming_port", "use_imap", "use_ssl", "name"]) for domain in email_domains: if not domain.incoming_port: incoming_port = get_port(domain) frappe.db.set_value("Email Domain", domain.name, "incoming_port", incoming_port, update_modified=False) # update incoming email port in all frappe.db.sql( """update `tabEmail Account` set incoming_port=%s where domain = %s""", (domain.incoming_port, domain.name), )
def get_incoming_server(self, in_receive=False, email_sync_rule="UNSEEN"): """Returns logged in POP3/IMAP connection object.""" if frappe.cache().get_value("workers:no-internet") == True: return None args = frappe._dict({ "email_account": self.name, "host": self.email_server, "use_ssl": self.use_ssl, "username": getattr(self, "login_id", None) or self.email_id, "use_imap": self.use_imap, "email_sync_rule": email_sync_rule, "uid_validity": self.uidvalidity, "incoming_port": get_port(self), "initial_sync_count": self.initial_sync_count or 100 }) if self.password: args.password = self.get_password() if not args.get("host"): frappe.throw(_("{0} is required").format("Email Server")) email_server = EmailServer(frappe._dict(args)) try: email_server.connect() except (error_proto, imaplib.IMAP4.error) as e: message = e.message.lower().replace(" ", "") if in_receive and any( map( lambda t: t in message, [ 'authenticationfail', 'loginviayourwebbrowser', #abbreviated to work with both failure and failed 'loginfailed', 'err[auth]', 'errtemporaryerror' ])): #temporary error to deal with godaddy # if called via self.receive and it leads to authentication error, disable incoming # and send email to system manager self.handle_incoming_connect_error(description=_( 'Authentication failed while receiving emails from Email Account {0}. Message from server: {1}' ).format(self.name, e.message)) return None else: frappe.throw(e.message) except socket.error: if in_receive: # timeout while connecting, see receive.py connect method description = frappe.message_log.pop( ) if frappe.message_log else "Socket Error" if test_internet(): self.db_set("no_failed", self.no_failed + 1) if self.no_failed > 2: self.handle_incoming_connect_error( description=description) else: frappe.cache().set_value("workers:no-internet", True) return None else: raise if not in_receive: if self.use_imap: email_server.imap.logout() # reset failed attempts count self.set_failed_attempts_count(0) return email_server
def validate(self): """Validate email id and check POP3/IMAP and SMTP connections is enabled.""" logger = frappe.logger() if self.email_id: validate_email_address(self.email_id, True) if frappe.local.flags.in_patch or frappe.local.flags.in_test: return if not frappe.local.flags.in_install and not frappe.local.flags.in_patch: try: if self.use_imap: logger.info('Checking incoming IMAP email server {host}:{port} ssl={ssl}...'.format( host=self.email_server, port=get_port(self), ssl=self.use_ssl)) if self.use_ssl: test = imaplib.IMAP4_SSL(self.email_server, port=get_port(self)) else: test = imaplib.IMAP4(self.email_server, port=get_port(self)) else: logger.info('Checking incoming POP3 email server {host}:{port} ssl={ssl}...'.format( host=self.email_server, port=get_port(self), ssl=self.use_ssl)) if self.use_ssl: test = poplib.POP3_SSL(self.email_server, port=get_port(self)) else: test = poplib.POP3(self.email_server, port=get_port(self)) except Exception as e: logger.warn('Incoming email account "{host}" not correct'.format(host=self.email_server), exc_info=e) frappe.throw(title=_("Incoming email account not correct"), msg='Error connecting IMAP/POP3 "{host}": {e}'.format(host=self.email_server, e=e)) finally: try: if self.use_imap: test.logout() else: test.quit() except Exception: pass try: if self.get('use_ssl_for_outgoing'): if not self.get('smtp_port'): self.smtp_port = 465 logger.info('Checking outgoing SMTPS email server {host}:{port}...'.format( host=self.smtp_server, port=self.smtp_port)) sess = smtplib.SMTP_SSL((self.smtp_server or "").encode('utf-8'), cint(self.smtp_port) or None) else: if self.use_tls and not self.smtp_port: self.smtp_port = 587 logger.info('Checking outgoing SMTP email server {host}:{port} STARTTLS={tls}...'.format( host=self.smtp_server, port=self.get('smtp_port'), tls=self.use_tls)) sess = smtplib.SMTP(cstr(self.smtp_server or ""), cint(self.smtp_port) or None) sess.quit() except Exception as e: logger.warn('Outgoing email account "{host}" not correct'.format(host=self.smtp_server), exc_info=e) frappe.throw(title=_("Outgoing email account not correct"), msg='Error connecting SMTP "{host}": {e}'.format(host=self.smtp_server, e=e))