Beispiel #1
0
def get_message_iterator(pop3_connection: POP3_SSL, username: str) -> Iterator[Tuple[EmailMessageDto, Callable]]:
    mails: list
    _, mails, _ = pop3_connection.list()
    mailbox_config, _ = MailboxConfig.objects.get_or_create(username=username)

    # Check only the last 500 emails
    # Since we don't delete emails from these mailboxes the total number can be very high over a perio
    # and increases the processing time.
    # The mails is a list of message number and size - message number is an increasing value so the
    # latest emails will always be at the end.
    mail_message_ids = [get_message_id(pop3_connection, m.decode(settings.DEFAULT_ENCODING)) for m in mails[-500:]]

    # these are mailbox message ids we've seen before
    read_messages = get_read_messages(mailbox_config)
    logging.info(f"Number of messages READ/UNPROCESSABLE in {mailbox_config.username} are {len(read_messages)}")

    for message_id, message_num in mail_message_ids:
        # only return messages we haven't seen before
        if message_id is not None and message_id not in read_messages:
            read_status, _ = MailReadStatus.objects.get_or_create(
                message_id=message_id, message_num=message_num, mailbox=mailbox_config
            )

            def mark_status(status):
                """
                :param status: A choice from `MailReadStatuses.choices`
                """
                logging.info(
                    f"Marking message_id {message_id} with message_num {message_num} from {read_status.mailbox.username} as {status}"
                )
                read_status.status = status
                read_status.save()

            try:
                m = pop3_connection.retr(message_num)
                logging.info(
                    f"Retrieved message_id {message_id} with message_num {message_num} from {read_status.mailbox.username}"
                )
            except error_proto as err:
                logging.error(
                    f"Unable to RETR message num {message_num} with Message-ID {message_id} in {mailbox_config}: {err}",
                    exc_info=True,
                )
                continue

            try:
                mail_message = to_mail_message_dto(m)
            except ValueError as ve:
                logging.error(
                    f"Unable to convert message num {message_id} with Message-Id {message_id} to DTO in {mailbox_config}: {ve}",
                    exc_info=True,
                )
                mark_status(MailReadStatuses.UNPROCESSABLE)
                continue

            yield mail_message, mark_status
Beispiel #2
0
def read_last_message(pop3_connection: POP3_SSL) -> EmailMessageDto:
    _, mails, _ = pop3_connection.list()
    message_id, message_num = get_message_id(pop3_connection, mails[-1])

    try:
        message = pop3_connection.retr(message_num)
    except error_proto as err:
        raise Exception(f"Unable to RETR message num {message_num} with Message-ID {message_id}",) from err

    return to_mail_message_dto(message)
Beispiel #3
0
def connect_to_mailbox():
    if __debug__ and socket.gethostname() == 'JEREMCLA-LUBUNTU':
        mailbox = POP3_SSL("lpul-pop.ad.selinc.com")
        mailbox.user("emailbot")
        mailbox.pass_("C0llectit!")
    else:
        mailbox = POP3_SSL("my.inbox.com")
        mailbox.user("emailbot")
        mailbox.pass_("dvJ-uCphEc")

    return mailbox
Beispiel #4
0
 def check(self, account):
     ssl = account.get_property("ssl", "false")
     default_port = 995 if ssl else 110
     port = self.get_port_or_default(account, default_port)
     if ssl:
         pop = POP3_SSL(self.get_hostname(account), port)
     else:
         pop = POP3(self.get_hostname(account), port, 7.0)
     try :
         username = self.get_username(account)
         for i in range(0, 3):
             password = self.get_password(account, default_port, i > 0)
             if password == None or password == "":
                 raise Exception(_("Authentication cancelled"))
             try :
                 pop.user(username)
                 pop.pass_(password)            
                 self.save_password(account, password, default_port)            
                 return pop.stat()
             except Exception as e:
                 logger.debug("Error while checking", exc_info = e)
                 try :
                     pop.apop(username, password)            
                     self.save_password(account, password, default_port)            
                     return pop.stat()
                 except Exception as e2:
                     logger.debug("Error while checking", exc_info = e2)
     finally :
         pop.quit()
     return (0, 0)
Beispiel #5
0
def pop3(host, user, password):
    tests = [POP3(host), POP3_SSL(host)]
    for test in tests:
        test.set_debuglevel(1)
        test.user(user)
        test.pass_(password)
        test.quit()
Beispiel #6
0
    def update_attachments_from_email(self, str_email_subject, str_email_tgtdate, dirpath_output_attachment, date_in_fn):
        # 下载指定邮件中的所有附件到指定文件夹中(文件名、格式均不变),如果文件夹不存在,则新建文件夹
        # 从邮件中下载数据
        addr_pop3_server = 'pop.exmail.qq.com'
        server_pop3 = POP3_SSL(addr_pop3_server, 995)
        server_pop3.user(self.email_from_addr)
        server_pop3.pass_(self.email_pwd)
        resp, mails, octets = server_pop3.list()
        index = len(mails)  # 若有30封邮件,第30封邮件为最新的邮件
        mark_tgtmail_exist = 0
        for i in range(index, 0, -1):  # 倒叙遍历邮件
            resp, lines, octets = server_pop3.retr(i)
            msg_content = b'\r\n'.join(lines).decode('utf-8')
            msg = Parser().parsestr(msg_content)
            subject = self.decode_str(msg.get('Subject')).strip()
            str_date_in_msg = self.decode_str(msg.get('date')).strip()
            list_str_date_in_msg_split = str_date_in_msg.split()
            str_date_in_msg = ' '.join(list_str_date_in_msg_split[:4])
            try:
                dt_email_recvdate = datetime.strptime(str_date_in_msg, '%a, %d %b %Y')
            except ValueError:
                dt_email_recvdate = datetime.strptime(str_date_in_msg.split()[0], '%Y-%m-%d')

            str_email_recvdate = dt_email_recvdate.strftime('%Y%m%d')
            if subject == str_email_subject and str_email_recvdate == str_email_tgtdate:
                self.get_attachment(msg, dirpath_output_attachment, date_in_fn)
                mark_tgtmail_exist = 1
                break
        if not mark_tgtmail_exist:
            print(f'Warning: {str_email_subject} not found.')
        server_pop3.quit()
        print('The attachment from email download finished.')
Beispiel #7
0
 def getEmail(self):
     try:
         pop_server = POP3_SSL(host=self.pop_host, port=self.pop_port)
         pop_server.user(self.mail_user)
         pop_server.pass_(self.mail_pass)
         resp, items, octets = pop_server.list()
         self.dbg("Trovate " + str(len(items)) + " emails")
         for i in items:
             id, size = i.split(' ')
             resp, text, octets = pop_server.retr(id)
             raw_text = "\n".join(text)
             mail = email.message_from_string(raw_text)
             rto = mail['Return-Path']
             if (self.valuableEmail(mail)):
                 # check the existence of the email
                 digest = hashlib.sha256(raw_text).hexdigest()
                 already_processed = self.mdb.isMailProcessed(digest)
                 if (already_processed == False):
                     self.mdb.addProcessedMail(digest)
                     for part in mail.walk():
                         if (part.get_content_type() == 'text/csv'):
                             name = part.get_filename()
                             cod, ext = name.split('.')
                             data = part.get_payload(decode=True)
                             csv_file = StringIO.StringIO(data)
                             t = (rto, cod, csv_file)
                             self.appendMail(mail['Subject'], t)
             if (self.delFlag == True):
                 pop_server.dele(id)
         pop_server.quit()
     except Exception as e:
         print "FAILED :" + str(e)
         exit(1)
Beispiel #8
0
def recevie_mail():
    try:
        # 实例化pop服务器
        recevie_server = POP3_SSL(
            pop_server)  # 开启SSL认证的邮箱服务器使用 POP3_SSL, 未开启的使用POP3
        recevie_server.set_debuglevel(1)
        recevie_server.user(user)  # user 向服务器传递用户名,同pass_ 方法一样,通过则会导致状态转变
        recevie_server.pass_(
            password)  # 通过认证,会返回“+OK ready”, 未通过会引发 poplib.error_proto异常
        # recevie_server.stat()                    # 请求服务器返回关于邮箱的统计资料,二元元祖(邮件总数,总字节数)
        # recevie_server.list()                    # 返回邮件信息,三元元组,(返回状态,消息列表,消息的大小),消息列表是二元元组组成的列表(邮件索引,邮件字节数),如果指定参数,会返回指定邮件的信息
        # recevie_server.dele(num)                 # 将指定邮件标记为删除,quit()函数执行时真正删除
        # recevie_server.rset()                    # 重置所有标记为删除的邮件,用于撤销dele命令

        # 获取最后一封邮件
        # 调用retr函数收取指定的邮件, 返回一个三元元组,(服务器响应,消息的所有行,消息的字节数),该邮件设置为已读
        rsp, msg, siz = recevie_server.retr(recevie_server.stat()[0])
        sep = msg.index(b'')  # RFC 2822  要求消息头和正文之间需要用空行隔开,所以遇到空行,说明后面的是正文
        print("rsp: ", rsp)  # 服务器返回信息“b'+OK'”
        print("siz: ", siz)  # 消息的字节数
        recevie_body = msg[sep + 1:]
        print(recevie_body)
    except Exception as err:
        print(err)
    finally:
        recevie_server.quit()  # 退出
 def connect(self):
     if self.source_id and self.source_id.id:
         self.ensure_one()
         if self.source_id.type == 'imap':
             if self.source_id.is_ssl:
                 connection = IMAP4_SSL(self.source_id.server,
                                        int(self.source_id.port))
             else:
                 connection = IMAP4(self.source_id.server,
                                    int(self.source_id.port))
             connection.login(self.user, self.password)
         elif self.type == 'pop':
             if self.source_id.is_ssl:
                 connection = POP3_SSL(self.source_id.server,
                                       int(self.source_id.port))
             else:
                 connection = POP3(self.source_id.server,
                                   int(self.source_id.port))
             # TODO: use this to remove only unread messages
             # connection.user("recent:"+server.user)
             connection.user(self.user)
             connection.pass_(self.password)
         # Add timeout on socket
         connection.sock.settimeout(MAIL_TIMEOUT)
         return connection
     return super(vieterp_fetchmail_server, self).connect()
Beispiel #10
0
    def _receive_from_ca(self):
        # pop_host = "pop.gmail.com"
        # pop_port = 995
        # pop_user = "******"
        # pop_password = "******"

        pop_host = "pop.gmail.com"
        pop_port = 995
        pop_user = "******"
        pop_password = "******"

        signed = {}
        timeout = time.time() + 60 * 5
        pop = None
        while not signed.has_key(self.e_invoice_file_name):
            try:
                pop = POP3_SSL(pop_host, pop_port)
                pop.user(pop_user)
                pop.pass_(pop_password)
                pop.sock.settimeout(MAIL_TIMEOUT)
                messages = [
                    pop.retr(i) for i in range(1,
                                               len(pop.list()[1]) + 1)
                ]
                messages = ["\n".join(mssg[1]) for mssg in messages]
                messages = [
                    email.message_from_string(mssg) for mssg in messages
                ]
                for message in messages:
                    for part in message.walk():
                        if part.get_content_maintype() == 'multipart':
                            continue

                        if part.get('Content-Disposition') is None:
                            print("no content dispo")
                            continue

                        filename = part.get_filename()
                        file_data = part.get_payload(decode=1)
                        signed[filename] = file_data
            except Exception as e:
                msg = _(
                    "General failure when trying to fetch mail from %s server\n%s: %s"
                ) % (pop_host, e.__class__.__name__, unicode(e))
                _logger.warning(msg)
                raise UserError(_("Mail Fetch Failed") + msg)
            finally:
                if pop is not None:
                    pop.quit()
            if time.time() > timeout:
                break
            time.sleep(5)
        if not signed.has_key(self.e_invoice_file_name):
            raise UserError(
                _("Timeout receiving signed xml for ") +
                self.e_invoice_file_name)
        self._process_signed_xml(signed)
Beispiel #11
0
 def connect(self):
     if self.pop3_ssl:
         self.conn = POP3_SSL(self.pop3_host, int(self.pop3_port))
     else:
         self.conn = POP3(self.pop3_host, int(self.pop3_port))
     #TODO: use this to remove only unread messages
     #conn.user("recent:"+server.user)
     self.conn.user(self.pop3_user)
     self.conn.pass_(self.pop3_pass)
     return self.conn
Beispiel #12
0
def pop3s(exit):
    try:
        p = POP3_SSL(args.hostname)
        p.user(p_file.get('e_user'))
        p.pass_(p_file.get('e_pass'))
        p.quit()
        print(f'OK: POP3s login successful')
        return OK
    except:
        print(f'WARNING: POP3s service was not authorized')
        return CRITICAL
Beispiel #13
0
def read_last_three_emails(pop3connection: POP3_SSL) -> list:
    _, mails, _ = pop3connection.list()

    reversed_mails = list(reversed(mails))
    last_three_mails = reversed_mails[:3]

    message_ids = [get_message_id(pop3connection, line.decode(settings.DEFAULT_ENCODING)) for line in last_three_mails]

    emails = []
    for message_id, message_num in message_ids:
        try:
            emails.append(pop3connection.retr(message_num))
        except error_proto as err:
            raise Exception(f"Unable to RETR message num {message_num} with Message-ID {message_id}",) from err

    email_message_dtos = []
    for email in emails:
        email_message_dtos.append(to_mail_message_dto(email))

    return email_message_dtos
Beispiel #14
0
    def receive(self, index=None):
        # Body to be returned
        body = "NO"

        # Login the admin email
        server = POP3_SSL('pop.gmail.com')
        server.user(self.__admin_addr)
        server.pass_(self.__pass)
        
        # Get the latest mail
        if index is None:
            latest_mail_index = server.stat()[0]
        else:
            latest_mail_index = index
        #print latest_mail_index
        latest_mail = server.retr(latest_mail_index)[1]
        text = join(latest_mail, '\n') # Make email content a string
        messages = message_from_string(text) # Make text string a Message object
        #server.quit() # Quit the server

        # Vertify email addresses from senders
        if self.to_addr_caroline in messages['From'] or self.to_addr_junli in messages['From'] or self.to_addr_louise in messages['From']:
            # If messages object is multipart
            if messages.is_multipart():
                for payload in messages.get_payload():
                    body = payload.get_payload()
                    #print 'multipart'
                    #print body
            else: # If not a multipart
                for msg in messages.walk():
                    if msg.get_content_type():
                        # if everyting is fine 
                        # the body is the pin from emails
                        body = msg.get_payload(decode=True)
                        #print 'Not multipart'
                        #print body
        body = str(body).strip()
        re = compile('[0-9]{4}?')
        if re.match(body):
            return body
        else:
            return 'NO'
        # Format the body
        # the email body should be something like
        # <div xx="xx">...body content...</div>
        # Format the body content to get the content
        """re = compile('(<div[\s]{0,1}[^>]*>)([0-9]{4}?)(</div>)')
        obj = re.match(body)
        if obj is not None:
            return obj.group(2)
        else:
            return "NO"
        """
        """
Beispiel #15
0
def test_pop(username, host, password, msg_id):
    print("\n     POP3 testing")
    connector = POP3_SSL(host)
    try:
        connector.user(username)
        connector.pass_(password)
        print("OK - POP3 connectivity (port 995)")
    except:
        print("FAILED - Couldn't connect to server")
    if len(connector.list()[1]) > 0:
        print("OK - INBOX not empty")
    else:
        print("--- - No messages in INBOX")
Beispiel #16
0
    def pop_recv_mail(self):
        pop = random.choice(self.pop)
        print 'POP', pop, self.recipient
        if self.pop_ssl:
            pop = POP3_SSL(pop, self.pop_port)
        else:
            pop = MyPOP3(pop, self.pop_port)

        if self.pop_start_tls:
            pop.starttls()

        result = pop.user(self.recipient[0])
        if not result.startswith('+OK'):
            raise Exception('POP user login failed: ' + str(result))

        result = pop.pass_(self.recipient[1])
        if not result.startswith('+OK'):
            raise Exception('POP pass login failed: ' + str(result))

        result = pop.list()
        if not result[0].startswith('+OK'):
            raise Exception('POP list failed: ' + str(result))

        for msg_nro in result[1]:
            msg_nro = msg_nro.split()[0]
            msg = pop.retr(msg_nro)
            if not result[0].startswith('+OK'):
                raise Exception('POP retr failed: ' + str(result))

            msg = '\r\n'.join(msg[1])
            msg = email.message_from_string(msg)

            if msg['subject'] in self.pop_subjects:
                self.pop_subjects.remove(msg['subject'])
                self.received += 1
                self.pop_recvd += 1

        #XXX: report this. It's a bug of poplib. It should close the 
        #socket in object destruction.
        pop.quit()

	if len(self.subjects) == 0:
		return True

        return False
    def button_confirm_login(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        for server in self.browse(cr, uid, ids, context=context):
            logger.notifyChannel(
                'imap', netsvc.LOG_INFO,
                'fetchmail start checking for new emails on %s' %
                (server.name))
            context.update({
                'server_id': server.id,
                'server_type': server.type
            })
            try:
                if server.type == 'imap':
                    imap_server = None
                    if server.is_ssl:
                        imap_server = IMAP4_SSL(server.server,
                                                int(server.port))
                    else:
                        imap_server = IMAP4(server.server, int(server.port))

                    imap_server.login(server.user, server.password)
                    ret_server = imap_server

                elif server.type == 'pop':
                    pop_server = None
                    logger.notifyChannel('imap', netsvc.LOG_INFO,
                                         'pop %s' % (int(server.port)))
                    if server.is_ssl:
                        pop_server = POP3_SSL(server.server, int(server.port))
                    else:
                        pop_server = POP3(server.server, int(server.port))
                    #TODO: use this to remove only unread messages
                    #pop_server.user("recent:"+server.user)
                    pop_server.user(server.user)
                    pop_server.pass_(server.password)
                    ret_server = pop_server

                self.write(cr, uid, [server.id], {'state': 'done'})
                if context.get('get_server', False):
                    return ret_server
            except Exception, e:
                logger.notifyChannel(server.type, netsvc.LOG_WARNING,
                                     '%s' % (e))
Beispiel #18
0
 def connect(self, cr, uid, server_id, context=None):
     if isinstance(server_id, (list, tuple)):
         server_id = server_id[0]
     server = self.browse(cr, uid, server_id, context)
     if server.type == 'imap':
         if server.is_ssl:
             connection = IMAP4_SSL(server.server, int(server.port))
         else:
             connection = IMAP4(server.server, int(server.port))
         connection.login(server.user, server.password)
     elif server.type == 'pop':
         if server.is_ssl:
             connection = POP3_SSL(server.server, int(server.port))
         else:
             connection = POP3(server.server, int(server.port))
         #TODO: use this to remove only unread messages
         #connection.user("recent:"+server.user)
         connection.user(server.user)
         connection.pass_(server.password)
     return connection
Beispiel #19
0
 def connect(self):
     self.ensure_one()
     if self.server_type == 'imap':
         if self.is_ssl:
             connection = IMAP4_SSL(self.server, int(self.port))
         else:
             connection = IMAP4(self.server, int(self.port))
         self._imap_login(connection)
     elif self.server_type == 'pop':
         if self.is_ssl:
             connection = POP3_SSL(self.server, int(self.port))
         else:
             connection = POP3(self.server, int(self.port))
         #TODO: use this to remove only unread messages
         #connection.user("recent:"+server.user)
         connection.user(self.user)
         connection.pass_(self.password)
     # Add timeout on socket
     connection.sock.settimeout(MAIL_TIMEOUT)
     return connection
Beispiel #20
0
 def connect(self):
     """
         Fonction de connexion au serveur de mail
     """
     if self.type == 'imap':
         if self.is_ssl:
             connection = IMAP4_SSL(self.server, int(self.port))
         else:
             connection = IMAP4(self.server, int(self.port))
         connection.login(self.user, self.password)
     elif self.type == 'pop':
         if self.is_ssl:
             connection = POP3_SSL(self.server, int(self.port))
         else:
             connection = POP3(self.server, int(self.port))
         #TODO: use this to remove only unread messages
         #connection.user("recent:"+server.user)
         connection.user(self.user)
         connection.pass_(self.password)
     # Add timeout on socket
     connection.sock.settimeout(MAIL_TIMEOUT)
     return connection
Beispiel #21
0
 def check(self, creds):
     proto, domain, user, password = creds
     if proto == 'imap':
         with IMAP4_SSL(domain) as M:
             try:
                 M.login(user, password)
                 ok, status = M.status('INBOX', '(MESSAGES UNSEEN)')
                 if ok != 'OK':
                     return None
                 return int(status[0].strip().decode('utf-8').split(
                     None, 1)[1][1:-1].split(None)[3])
             except:
                 return None
     elif proto == 'pop3':
         with POP3_SSL(domain) as M:
             try:
                 M.user(user)
                 M._pass(password)
                 count, _ = M.stat()
                 return count
             except:
                 return None
     return None
Beispiel #22
0
def login(login_info=None, test=False, method='pop3'):
    try:
        if login_info is None:
            login_info = ask()
        mailserver = re.search(r'@(.*?)\.com',
                               login_info['account'],
                               flags=re.IGNORECASE).group(1)
        if mailserver == '163':
            login_info['pop_host'] = 'pop.163.com'
            login_info['smtp_host'] = 'smtp.163.com'
            login_info['port'] = 25
        else:
            print('unknown mail server: {}'.format(mailserver))
            quit()
        if test:
            login_info = {
                'pop_host': 'pop.163.com',
                'smtp_host': 'smtp.163.com',
                'port': 25,
                'account': '*****@*****.**',
                'password': '******'
            }
        if method == 'pop3':
            mail_link = POP3_SSL(login_info['pop_host'])
        elif method == 'smtp':
            mail_link = SMTP_SSL(login_info['pop_host'])
        elif method == 'imap':
            mail_link == IMAP4_SSL(login_info['pop_host'])
        mail_link.set_debuglevel(0)
        mail_link.user(login_info['account'])
        mail_link.pass_(login_info['password'])
        # print(mail_link.list())
        print('Login successfully!')
        return mail_link
    except Exception as e:
        print('Login fails!' + str(e))
        quit()
Beispiel #23
0
    def get_pop3_mail(self, stop_function=lambda: False, timeout=10):
        criteria = 'Important subject'
        # Effective payload is placed from
        min_line = 18
        # to
        max_line = 24
        # in message body.

        while True:
            if stop_function():
                yield None

            try:
                self.pop3_server = POP3_SSL(self.pop3_ssl_host,
                                            self.pop3_ssl_port)
                self.pop3_server.user(self.pop3_username)
                self.pop3_server.pass_(self.pop3_password)

                stat = self.pop3_server.stat()
                for i in range(stat[0]):
                    msgnum = i + 1
                    # Retrieve headers
                    response, lines, bytes = self.pop3_server.top(msgnum, 10)
                    one_line = ' '.join(lines)
                    if one_line.find(criteria) != -1:
                        (server_msg, body, octets) = \
                            self.pop3_server.retr(msgnum)
                        text = '\n'.join(body[min_line:max_line])
                        self.pop3_server.dele(msgnum)
                        yield text
                self.pop3_server.quit()
                self.pop3_server = None
                if stat[0] == 0:
                    time.sleep(timeout)
            except Exception as err:
                print(err)
Beispiel #24
0
# -*- coding: utf-8 -*-
# filename: utf-8

from poplib import POP3_SSL

client = POP3_SSL("pop.qq.com")

# 填写自己的账号
client.user("*****@*****.**")

# 对于 qq 邮箱而言,在第三方客户端登陆时,都需填写授权码,此处更换为自己的授权码,不要填写密码
client.pass_("shiyanlou")

all_num, all_sz = client.stat()

print "总的邮件数量为:", all_num
print "总邮件字节数为:", all_sz

print client.list()

# 获取编号号为 2 的邮件,如果你的 qq 邮箱中的邮件为空,此处会出错
msg_2 = client.retr(2)

# 打印邮件
print "this is a email: \r\n"
for i in msg_2[1]:
    print i

# 退出
print "\r\n", client.quit()
Beispiel #25
0
        if not line:
            return default


# SMTP/SSL
print('*** Doing SMTP send via SSL...')
if SMTP_SSL:
    try:
        s = SMTP_SSL('smtp.mail.yahoo.com', 465)
        s.login(MAILBOX, PASSWD)
        s.sendmail(from_, to, msg)
        s.quit()
        print('      SSL mail sent!')
    except SMTPServerDisconnected:
        print('   error: server unexpectedly disconnected...try again')
else:
    print('   error: SMTP_SSL requires 2.6.3+')

# POP
print('***Doing POP recv...')
try:
    s = POP3_SSL('pop.mail.yahoo.com', 995)
    s.user(MAILBOX)
    s.pass_(PASSWD)
    rv, msg, sz = s.retr(s.stat()[0])
    s.quit()
    line = getSubject(msg)
    print('     Received msg via POP: %r' % line)
except error_proto:
    print('   error: POP for Yahoo!Mail Plus subscribers only')
        recvSvr.login(who, PASSWD)
    except imaplib.error as e:
        print(str(e)[2:-1])  # This may be a stupid thing to do.
        exit()
    rsp, msgs = recvSvr.select('INBOX', True)
    try:
        rsp, data = recvSvr.fetch(msgs[0], '(RFC822)')
    except imaplib.error as e:
        print(e)
        exit()
    recvBody = data[0][1].decode('unicode_escape').split('\r\n')

else:
    # POP stuff below.
    try:
        recvSvr = POP3_SSL(POPSVR, 995)
    except gaierror:
        print("Can't connect to %s." % POPSVR)
        exit()
    # No need of the following try-except block.
    # This error would be already catched in SMTP part.
    # It's present to signify that invalid credential error has been taken care of.
    try:
        recvSvr.user(who)
        recvSvr.pass_(PASSWD)
    except error_proto as e:
        print("For POP:", end=" ")
        print(str(e)[2:-1])  # This may be a stupid thing to do.
        exit()
    rsp, msg, siz = recvSvr.retr(recvSvr.stat()[0])
    #strip headers and compare to orig msg
Beispiel #27
0
# SMTP/TLS
print '*** Doing SMTP send via TLS...'
s = SMTP('smtp.gmail.com', 587)
if release < '2.6':
    s.ehlo()  # required in older releases
s.starttls()
if release < '2.5':
    s.ehlo()  # required in older releases
s.login(MAILBOX, PASSWD)
s.sendmail(from_, to, msg)
s.quit()
print '    TLS mail sent!'

# POP
print '*** Doing POP recv...'
s = POP3_SSL('pop.gmail.com', 995)
s.user(MAILBOX)
s.pass_(PASSWD)
rv, msg, sz = s.retr(s.stat()[0])
s.quit()
line = getSubject(msg)
print '    Received msg via POP: %r' % line

msg = msg.replace('587/TLS', '465/SSL')

# SMTP/SSL
if SMTP_SSL:
    print '*** Doing SMTP send via SSL...'
    s = SMTP_SSL('smtp.gmail.com', 465)
    s.login(MAILBOX, PASSWD)
    s.sendmail(from_, to, msg)
# coding:utf-8
import datetime
import time
from poplib import POP3_SSL
popServerAddress = "mail.163.com"
emailAdress = input("请输入邮箱地址:")
pwd = input("请输入密码:")
lastNumber = 1
while True:
    #建立连接
    server = POP3_SSL(popServerAddress, timeout=3)
    #不显示与服务器之间的交互信息
    server.set_debuglevel(0)
    #登陆
    server.user(emailAdress)
    server.pass_(pwd)
    #获取邮箱全部邮件编号
    _, mails, _ = server.list()
    print(mails)
    #退出
    server.quit()
    #获取最新邮件的ID
    newestNumber = int(mails[-1].split()[0])
    if newestNumber != lastNumber:
        print('{}--您有{}封未读的邮件'.format(
            str(datetime.datetime.now())[:19], newestNumber - lastNumber))
        lastNumber = newestNumber
    #一分钟后重新检查
    time.sleep(60)
1
Beispiel #29
0
from poplib import POP3_SSL

user = '******'
# 使用授权码第三方登录
pass_ = 'kcpklenqgqxjebfh'
# 连接到POP3服务器
p = POP3_SSL('pop.qq.com', 995)
p.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(p.getwelcome().decode('utf-8'))
# 身份验证
p.user(user)
p.pass_(pass_)
# stat()返回邮件数量和占用空间:
print('Messages count: %s. Size: %s' % p.stat())

# 返回 (response, ['mesg_num octets', ...], octets)
resp, mails, octets = p.list()
print(mails)

index = len(mails)
# 检索邮件
# (response, ['line', ...], octets)
resp, lines, octets = p.retr(index)

for eachline in lines:
    print(eachline)

p.quit()
def receiveEmail():
    r = []  #验证码未超时的数列
    t = []  #验证码超时的数列
    email = '*****@*****.**'
    password = '******'
    pop3_server = 'pop.qq.com'  #QQ的POP3服务器地址

    server = POP3_SSL(pop3_server)  #连接到QQ的pop3服务器
    print(server.getwelcome())  #POP3服务器的欢迎文字
    #身份认证
    server.user(email)
    server.pass_(password)
    print('Message: %s  Size:%s' % server.stat())  #stat()返回邮件数量和每个邮件所占用的空间

    resp, mails, octets = server.list()  #list()返回所有邮件的编号和占用空间
    # print mails
    if len(mails) == 0:
        print '邮箱为空,未收到邮件,请进入邮箱查看'
    else:
        index = len(mails)  # 获取最新一封邮件, 注意索引号从1开始
        for i in range(index):
            resp, lines, octets = server.retr(i + 1)  # lines存储了邮件的原始文本的每一行,
            msg_content = '\r\n'.join(lines)  #获得整个邮件的原始文本:
            GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0000 (UTC)'  #GMT时间格式的字符串,有时候后面需要加 (GMT),具体看情况,如'%a, %d %b %Y %H:%M:%S +0000 (GMT)'
            # CST_FORMAT = '%a,%d %b %Y %H:%M:%S +0800'           #有些邮件的时间是CST时间格式

            # hdr,message,octet=server.retr(1)   #读取第一个邮件信息,效果与上面一样
            msg = Parser().parsestr(msg_content)
            date = msg.get("Date")
            subject = msg.get("subject")  #邮件标题
            # From = msg.get("From")
            # To = msg.get("To")

            if subject != 'SOKA FOOTBALL Verification code':
                print '该邮件不是SOKA FOOTBALL发送的验证码邮件,正在检查下一封....'
            else:
                # print date                                   #邮件发送时间(返回的是GMT时间格式)
                transform_time = datetime.datetime.strptime(
                    date, GMT_FORMAT)  # 将GMT时间格式的字符串转换为datetime类型
                now = datetime.datetime.now(
                )  # 获取现在的时间,类型为datetime,但是该时间的秒数会精确到小数点后6位
                current_time1 = now.strftime(
                    "%Y-%m-%d %H:%M:%S")  # 将now时间转换成对应的格式,类型为str类型
                current_time2 = datetime.datetime.strptime(
                    current_time1,
                    "%Y-%m-%d %H:%M:%S")  # 将str类型的时间转换成datetime类型
                differ_time1 = current_time2 - transform_time  # 两个str类型的时间不能进行加减操作,所以必须先转换成datetime类型
                differ_time2 = differ_time1.total_seconds(
                )  # 获取两个时间相差的总秒数,另外date、time和datetime类都支持与timedelta的加、减运算
                differ_time3 = int(differ_time2 - 28800)  # 减去8小时的与中国的时间差
                content = msg.get_payload(decode=True)  # 获取邮件的内容
                # print type(content)
                # print msg
                # print "subject:", subject
                # print "From:",From
                # print "To:",To
                # print "Content:",content

                if differ_time3 < 7200:
                    s = re.findall("\d+", content)[0]
                    r.append(s)
                elif differ_time3 > 7200:
                    s = re.findall("\d+", content)[0]
                    t.append(s)

    return (r, t)