kleines Email-Prgramm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ich bin gerade dabei ein kleines Email Programm zu schreiben.
Es sieht bis jetzt so aus:

Code: Alles auswählen

#/usr/bin/python3

import time
import smtplib
import poplib
import email
import markdown

class Mail():
    def __init__(self, address, popserver, smtpserver,  username=None):
        if username is None:
            self.username = address
        else:
            self.username = username
        self.address = address
        self.popserver = popserver
        self.smtpserver = smtpserver
        self.mails = []
        
    def send_mail(self, receiver, subject, text, passwd, 
                  use_markdown=False, verbose=False):
        if use_markdown:
            text = markdown.markdown(text)
            
        mail = """From: {}
To: {}
Time: {}
Subject: {}
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">'
</head>
<body>
{}
</body>
</html>""".format(self.address, receiver, time.ctime(time.time()), subject, text)

        mail = markdown.markdown(mail)
        server = smtplib.SMTP(self.smtpserver)
        server.login(self.address,  passwd)
        server.sendmail(self.address,  receiver,  mail)
        server.quit()
        return 0
        
    def get_mails(self, passwd):
        server = poplib.POP3(self.popserver)
        server.getwelcome()
        server.user(self.username)
        server.pass_(passwd)
        emails = server.list()
        for i in emails[1]:
            email = dict.fromkeys(('number', 'bytes', 'header',
                                   'message', 'octets'))
            
            i = i.decode('utf-8').split(' ')
            email['number'] = i[0]
            email['bytes'] = i[1]
            header,message,octets = server.retr(i[0])
            email['header'] = header
            email['message'] = message
            email['octets'] = octets

            self.mails.append(email)
        server.quit()
        
    def print_mails(self, verbose=False):
        for i in self.mails:
            print('#####')
            print(
            """Number: {}
Bytes: {}
Octets: {}
Header: {}""".format(i['number'], i['bytes'], i['octets'], 
                      i['header']) 
                 )
            if verbose:
                for line in i['message']:
                    print(line.decode('utf-8'))
                print('-----')
                
            mail = self.decode_mail(i['message'])    
            print('--- HEADER ---')
            header = dict(email.parser.Parser().parsestr(mail))
            for k,  v in header.items():
                print(k+':: ',  v)
            print('\n\n--- MESSAGE ---')
            print(email.message_from_string(mail))
            
    def delete_mail(self, passwd, number):
        server = poplib.POP3(self.popserver)
        server.getwelcome()
        server.user(self.username)
        server.pass_(passwd)
        server.dele(number)
        server.quit()
        
    def decode_mail(self, mail):
        text = ''
        for line in mail:
            line = line.decode('utf-8')
            text += line+'\n'
        return text
Mein Problem ist: Ich möchte den eigentlichen Text aus einer Email extrahieren, kann aber noch in html sein.
Ein kleines Beispiel:

Code: Alles auswählen

>>>import mail
>>>account = mail.Mail('meine@email.de', 'pop.1und1.de', 'smtp.1und1.de')
>>>account.get_mails('topsecret')
>>>account.print_mails()
#jetzt kommt das Problem:
#Die Ausgabe ab der Zeile, in welcher "print('\n\n--- MESSAGE ---") steht:
--- MESSAGE ---
Return-Path: <meine@email.de>
Received: from mout.kundenserver.de ([212.227.126.130]) by mx.kundenserver.de
 (mxeue004) with ESMTPS (Nemesis) id 0M6KYJ-1bLRbF1mLD-00ySpQ for
 <meine@email.de>; Fri, 05 Aug 2016 17:30:42 +0200
Received: from [127.0.0.1] ([217.227.26.103]) by mrelayeu.kundenserver.de
 (mreue002) with ESMTPA (Nemesis) id 0MZ5ZT-1bjjij0tIx-00VdZd for
 <meine@email.de>; Fri, 05 Aug 2016 17:30:42 +0200
From: meine@email.de
To: meine@email.de
Time: Fri Aug  5 17:30:51 2016
Subject: test
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
Date: Fri, 05 Aug 2016 17:30:42 +0200
Message-ID: <0MNyfL-1bd6wT16Kp-007X7l@mrelayeu.kundenserver.de>
X-Provags-ID: V03:K0:wNxYRKpwRvi6GWP+wjfYTsCbpHTfxouv9hSt1zB2lyDIGX1m6Cq
 hsKI6vDksZMwDHRlx6FEDf/xLy4HCwq7rbrZ7WTCodoYfFCHWwOjuOpObTQotGqtPJkf1U8
 W4+42S0CNNYroq6e8MMzdy4hVkR0bJUaljcvkI77xnydmTZ3iJLoT04fZd/Cmdpz1Mw07F2
 rQg+hnP+dxZB/6WTkj6KQ==
X-UI-Out-Filterresults: notjunk:1;V01:K0:crw3O7LMe+E=:xTqhm1Q655eh7S7c5w9CZQ
 rarM+wEF3I4F9OvtAbKrmmmx5UMASk+vRm9zgVJy7dVNOoR5FWCX25Ge/CyDCAGStD83DrNdn
 vskTsjpuUMOWonMc85zEdWCjzvLlkFP1Fi2r+xfWHzV9Foo/Ao86svSeAWxxx8yIzKrBAVcZR
 krb23X+qw0MnIakbeP+fqPhq9Uvy8qIa6xITFYI3q8AzgkNJ3MTA0hnxCUdTz9bVY4Cy8z/ZI
 LvUB8FiUZ7BlQiKTZPhll+NXaqQ1ivJMkYYyhrhLbySNjZ+P5zU1Zp2ajE5YxM4NxVjgk0i4R
 L0KuTeAa9zcA1mu4U/paMTk0BkRAcG+r2C4IAj4fpiCO5kgeTTWfzRQ+7oTUrgm2Y7j8JtEof
 kNNo8v8FuywS6gEK+dhaQPkzytcrmXcDjR26LUY8VAcI+j33UKFOWS7r6uv0/AhvpObGPdixj
 UfytuhcCLhz1NDFYvINxXh75gsJ4kmoZvSZwh0Jp3S0+rbc+ELIdAhzzMNy868JpY7kQBfnlD
 yPtp4FTEcKUVCPqj5TRLIrsrbz6SNVvZAU1Nc485i1PdmY2vVoMI2P6rawhRWYbbH6Uw817LW
 c2O0CQ3+tFWQEPoCMMRX0CMwY0AGwITtN/v3hW2RHFTTe4BJitiChaGcxV7Xl8HFcu5P1U/de
 nNd80D7dTPxtndUTK0nKLB4J59xJjcXVTFtzVEf0/MbgLnj7WULZWFv368cWys3uCENC3apvo
 LbeFPmI+LgkDpK27qYQN08LOTuHYNzAhXlHIKbiRVDkgD64XHkl9qTZJnPJf2OvdaSU2+DKjd
 1TKb7hi
Envelope-To: <meine@email.de>
X-UI-Filterresults: notjunk:1;V01:K0:Ui3UhvxMcvc=:npW/4HifLGbtChWebOjBspTS4S
 rfn016m1WZ+OgDbXLfDcDmB926qQoAiL8zKu9eqWEUhhfO9Cb5/XRqdCCa+LfFlaOtD4RXlJO
 oQ3hYapy9/d9cu6ZdhBeD0WbIVKzYhGnaNB12h8NBva3EVndkMRvtF0Aip7NZFtoVSfI5eIJG
 oLaaQOl1SBAj1u6OtcFSM0LSriUfuTyAf7pOy8uWdIjbVGH+0AYHhEiWihi8NeQt+gcjoQELc
 vc1UZ6csaodCA8Bnl73c24t/j/63Y7cpN0ww8SF+rwnwunn8VYyzBo5DPlGVqzuJJ4MQ/wCcD
 CcROFZSoIN+tdLwcFYglkBD06V7kmhWuqNvcwgEtFuP3rzS7L+75gl2gRRUXdVXxuqsOgEq4X
 D1S+OKnRXXaGcSPd3/hq+yQipVZJqtEQziPAOoyOducDxiQYkH1lxqsqp0WIiNs+DSdEgg9Vs
 3OqhJIfwLZVJ3VjMEgj5tDl40umEyfp1b0OkkDdWYB0NiWpVNMGHJ2pcq1EChTbMl5tvBQCas
 QrUCU/gPb6xYENHtfiajD9ksyebPBkL1aXLjiSqeR36kVetZcUAYgJ4KfKsPQsGW/T41HWhgr
 Q+wEtaOD0pHr8jrTr6TScuGewOucmQlIYa12aQhdIjMQuhShFkw18J5iucg6+OdUsXb08s+r6
 s18sG8A0F1hrhkgsqDaic9JScfJDhWR4r2A5r+PjcSle+gFU8P6fyHnfeyH1uvEDOIad9RO0I
 Sl+1/00nVX/NEX9TLmALTvo4cpm1JieZTGsBq5MJ7EcW0CdQ84MA8dSdsefWSYkPGahcphdk0
 sl7VYIaIh+4oR+Sl79wEvxsZjt7JVYL7CNKVrP+56juPBwa+oWLDLIvD2TOM3JfUw22/K7HVQ
 CkMQcY4KEC3k6YgQM6oUR7PHtPAq9XTFrCokHbeh4pws0YK+Bm3kTJy0oKcnj698GkGOikoo9
 Gw1RfAKJYlyO85j6DxMwZjIBCBBrb8WS+kPnlQ57y9qQXfzKjZ+vXLVCzeFHW0eiHizY0rNRQ
 +x/3prSPCTdF3LK7Kzgw+sEVCEhehZiRxQzXlPySKoGcGaI/AEYINgCMI0HH2UjLqr4Eowj5q
 rAjOHN63CPCu16zAYNTQKR/M4Wdr483MVvSuzHmVbMEdjxgC5w59Uv76I7DkT8JNLgWcLWvCm
 cR/ADsu5Tm0aCb1xg22nH5vYlyvy9NVo4S/BJ5OqQJim6rXH4B92Z5dphLZbxn/lpHyTFwPly
 ywNVdkHrLqP3NEdJBN2/gngkj9+wFFIiUYLEiZ0+moU3VB1mZv9++ko9KLvrJlubM4sAhJIiF
 AsQVr/8lQ6Ag90R81G8Isxkep3EyL+nVaGM9zhoP2uvJTf8SUDb3tUZFhNIAN11PIyf7EGgnJ
 Q8TXWNaMJw4DXqvS90r2cAO7MhMR/FzY9hJZy7rrN1sqoe2SLjH5ULTGPLdRDaMy9V82ltFZI
 d4ofRSKkdP3kNT8RSPhKdvo6eWQwao348vD5b9iK6uyTAsmYVn+um164SSvIOtUpQM1KYegQG
 IL6cdrNMlMtWeUmXdHVY=

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">'
</head>
<body>
<h1>Hallo</h1>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
</html>

hier möchte ich eigentlich nur 14 Zeilen haben, ich habe aber keine Idee wie ich die gut extrahieren kann, da sie manchmal auch
mitten in der Email stehen.
Hat einer eine Idee?
Zuletzt geändert von Anonymous am Freitag 5. August 2016, 18:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pygoscelis papua: Ein paar Anmerkungen zu Deiner Mail-Klasse:
Zeile 40: ctime ohne Argument nimmt automatisch die aktuelle Zeit
Zeile 42: warum versuchst Du mit markdown Deinen Header kaputt zu machen?
Zeile 47: was soll der Returnwert 0 bedeuten?

Zeile 55: i ist ein schlechter Name für eine i?-Mail
Zeile 56: man erzeugt nicht erst ein Wörterbuch mit Dummy-Werten um sie danach zu füllen, sondern erzeugt gleich das Wörterbuch mit den richtigen Werten
Zeile 59: wäre mir neu, dass POP3 utf-8-codiert ist

Zeile 71: siehe Zeile 55
Zeile 87/91: warum parst Du die Email zweimal? Besser wäre es wohl email.message_from_bytes zu nehmen, dann brauchst Du die Bytes auch nicht auf gut Glück utf8-decodieren, was fehl schlagen kann.
Zeile 91: was Du suchst ist get_payload()
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ok vielen Dank für die Anmerkungen ich werde es noch einmal überarbeiten.
Das mit ctime soll so sein, sonst nimmt der Server die Mail ja nicht an.
Das mit markdown habe ich übersehen, dass ich den Header da gleich mit durch geschickt habe :oops:
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Hier ist jetzt eine bessere Version.
Also mein Problem ist behoben, ich würde mich aber
über weitere Anmerkungen auch freuen.

Markdown habe ich erst mal raus genommen.

Code: Alles auswählen

#/usr/bin/python3

import time
import smtplib
import poplib
import email

class Mail():
    def __init__(self, address, popserver, smtpserver,  username=None):
        if username is None:
            self.username = address
        else:
            self.username = username
        self.address = address
        self.popserver = popserver
        self.smtpserver = smtpserver
        self.mails = []
        
    def send_mail(self, receiver, subject, text, passwd):
        mail = """From: {}
To: {}
Time: {}
Subject: {}
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">'
</head>
<body>
{}
</body>
</html>""".format(self.address, receiver, time.ctime(time.time()), subject, text)
        server = smtplib.SMTP(self.smtpserver)
        server.login(self.address,  passwd)
        server.sendmail(self.address,  receiver,  mail)
        server.quit()
        
    def get_mails(self, passwd):
        server = poplib.POP3(self.popserver)
        server.getwelcome()
        server.user(self.username)
        server.pass_(passwd)
        emails = server.list()
        for mail in emails[1]:
            mail = mail.decode('uS-ASCII').split(' ')
            maildict = dict()
            maildict['number'] = mail[0]
            maildict['bytes'] = mail[1]
            
            header,message,octets = server.retr(mail[0])
            maildict['header'] = header
            maildict['message'] = message
            maildict['octets'] = octets

            self.mails.append(maildict)
        
        server.quit()
        
    def print_mails(self):
        for mail in self.mails:
            msg = self.decode_mail(mail['message'])
            print('#####')
            print('-- HEADER --')
            print(
            """Number: {}
Bytes: {}
Octets: {}
Header: {}""".format(mail['number'], mail['bytes'], mail['octets'], 
                      mail['header']) 
                 )
            header = msg.items()
            print(header)
            
            print('-- MESSAGE --')
            for part in msg.walk():
                print(part.get_content_type())
                print(part.get_payload())
            
    
    def delete_mail(self, passwd, number):
        server = poplib.POP3(self.popserver)
        server.getwelcome()
        server.user(self.username)
        server.pass_(passwd)
        server.dele(number)
        server.quit()
        
    def decode_mail(self, mail):
        text = b''
        for line in mail:
            text += line+b'\n'
        return email.message_from_bytes(text)
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Antworten