Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
	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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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),
            )
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
	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))