aboutsummaryrefslogblamecommitdiffstats
path: root/cleanup_failing.patch
blob: 480d2d379c8b3f1c1ba15c22ad525789a3d61e90 (plain) (tree)
1
2
3
4



                                        




































































































































































































































































































































                                                                                              
diff --git b/mail2news.py a/mail2news.py
index e7cbcf9..412e4ee 100644
--- b/mail2news.py
+++ a/mail2news.py
@@ -14,6 +16,8 @@ Gets news email and sends it via SMTP.
 class mail2news is  hopefully conform to rfc850.
 
 """
+
+import email
 import sys
 from os import getpid
 from socket import gethostbyaddr, gethostname
@@ -24,80 +28,41 @@ import pyginfo
 
 class mail2news:
     """news to mail gateway class"""
-
     reader = None                # mode reader
-#    newsgroups = None            # Newsgroups: local.test,local.moderated...
-#    approved = None                # Approved: kame@aragorn.lorien.org
     newsserver = 'localhost'    # no comment :)
     port = 119
     user = None
     password = None
 
-    hostname = gethostbyaddr(gethostname())[0]
-
-    heads_dict, smtpheads, nntpheads = {}, {}, {}
-    email, headers, body = [], [], []
-
-    def readfile(self, opt):
-
-        for line in sys.stdin.readlines():
-            self.email.append(line)
-
-        if(len(self.email) == 1 and self.email[0][0] == '/'):
-            file = self.email[0][:-1]
-            del self.email[0]
-            for line in open(file, 'r').readlines():
-                self.email.append(line)
-
-        # introduce nntpheads
-        if opt.newsgroup != '':
-            # TODO put it directly to self.message when we have it
-            self.nntpheads['Newsgroups:'] = opt.newsgroup + '\n'
-        if opt.approver != '':
-            self.nntpheads['Approved:'] = opt.approver + '\n'
+    def __init__(self):
+        self.hostname = gethostbyaddr(gethostname())[0]
+        self.message = email.message_from_file(sys.stdin)
 
-        return 1
+# """phase 3:
+#     format rfc 822 headers from input article
+#     """
+#
+#     m2n.mergeheads()  # make unique dict from NNTP and SMTP dicts
+#
+#     m2n.addheads()  # add some important heads
+#     m2n.renameheads()  # rename useless heads
+#     m2n.removeheads()  # remove other heads
+#
+#     m2n.sortheads()  # sort remaining heads :)
+#
+#     if opt.verbose:
+#         for line in m2n.headers:
+#             print line[:-1]
 
-    def parseemail(self):
+    def x_parseemail(self):
         """get news email from file or stdin and separate heads from body
 
         REMEBER: headers value has '\n' as last char.
             Use string[:-1] to ignore newline.
         """
-
-        try:
-            body = 0        # are we in body or in headers?
-
-            for line in self.email:
-                if not body and len(line) == 1:
-                    body = 1    # starts email body section
-
-                if not body:
-                    try:
-                        # if it is a multi-line header like Received:
-                        if line[0] not in [' ', '\t']:
-                            try:
-                                head, value = line.split(' ', 1)
-                            except ValueError:
-                                value = ''
-                            self.smtpheads[head] = value
-                        else:
-                            self.smtpheads[head] = '%s%s' % \
-                                (self.smtpheads[head], line)
-                    except (ValueError), message:
-                        print('line: %s' % line)
-                        print('(probably missing couple "Header: value" in %s)'
-                              % line)
-                        sys.exit(1)
-
-                elif len(line) > 0 and body:
-                    self.body.append(line)
-
-        except (ValueError), message:
-            print message
-            sys.exit(1)
-
-        return self.smtpheads, self.body
+        # return self.smtpheads, self.body
+        # self.smtpheads contains headers, self.body body
+        pass
 
     def puthead(self, dict, list, key):
         """private, transform dict entries in list entries
@@ -105,33 +70,34 @@ class mail2news:
         """
 
         if key in dict:
-            list.append(key + ' ' + dict.get(key))
+            list.append(key + ' ' + dict[key])  # FIXME: Message instance doesn't have append
             del dict[key]
         else:
             return 0
         return 1
 
     def sortheads(self):
-        """make list sorted by heads: From: To: Subject: first,
-           others, X-*, X-Resent-* last"""
+        """make list sorted by heads:
+           From: To: Subject: first, others, X-*, X-Resent-* last"""
 
         # put at top
         set = ('Newsgroups:', 'From:', 'To:', 'X-To:', 'Cc:', 'Subject:',
                'Date:', 'Approved:', 'References:', 'Message-Id:')
 
         for k in set:
-            self.puthead(self.heads_dict, self.headers, k)
+            self.puthead(self.heads_dict, self.message, k)
 
-        for k in self.heads_dict.keys():
-            if k[:2] != 'X-' and k[:9] != 'X-Resent-' and k not in set:
+        for k in self.message:
+            if not k.startswith('X-') and not k.startswith('X-Resent-') and \
+                    k not in set:
                         self.puthead(self.heads_dict, self.headers, k)
 
-        for k in self.heads_dict.keys():
-            if k[:2] == 'X-':
+        for k in self.message:
+            if k.startswith('X-'):
                 self.puthead(self.heads_dict, self.headers, k)
 
-        for k in self.heads_dict.keys():
-            if k[:9] == 'X-Resent-':
+        for k in self.message:
+            if k.startswith('X-Resent-'):
                 self.puthead(self.heads_dict, self.headers, k)
 
         return self.headers
@@ -142,14 +108,11 @@ class mail2news:
 
         self.heads_dict = {}
 
-        try:
-            for header in self.smtpheads.keys():  # fill it w/ smtp old heads
-                self.heads_dict[header] = self.smtpheads[header]
-
-            # and replace them w/ nntp new heads
-            for header in self.nntpheads.keys():
-                self.heads_dict[header] = self.nntpheads[header]
+        # FIXME something like a = set() ; a = self.message.items() ?
 
+        try:
+            for header in self.message.keys():  # fill it w/ smtp old heads
+                self.heads_dict[header] = self.message[header]
         except KeyError, message:
             print message
 
@@ -160,22 +123,8 @@ class mail2news:
         """
 
         info = pyginfo.pygsinfo()
-
-        try:
-            self.heads_dict['X-Gateway:'] = info.PROGNAME + ' ' + \
-                info.PROGDESC + ' - Mail to News\n'
-
-# it is nntpheads stuff
-#            if(self.newsgroups):
-#                self.heads_dict['Newsgroups:'] = self.newsgroups
-
-#            if(self.approved):
-#                self.heads_dict['Approved:'] = self.approved
-
-        except KeyError, message:
-            print message
-
-        return self.heads_dict
+        self.message.add_header('X-Gateway', info.PROGNAME + ' ' +
+                                info.PROGDESC + ' - Mail to News')
 
     def renameheads(self):
         """rename headers such as Resent-*: to X-Resent-*:
@@ -184,50 +133,31 @@ class mail2news:
         handles References/In-Reply-To headers
         """
         try:
-
-### test
-#   if(post):
-#       if(post in self.heads_dict):
-#           self.heads_dict['X-Original-' + post] = self.heads_dict[post]
-#
-#       self.heads_dict[post] = self.heads_dict[pre]
-#       del(self.heads_dict[pre])
-#
-#   else:
-#       if(pre[0:2] == 'X-' and pre in self.heads_dict):
-#           self.heads_dict['X-Original-' + pre] = self.heads_dict[pre]
-#       elif(not pre[0:2] == 'X-' and 'X-' + pre in self.heads_dict):
-#           self.heads_dict['X-' + pre] = self.heads_dict[pre]
-#       del(self.heads_dict[pre])
-### end test
-
-            for key in self.heads_dict.keys():
-                if(key[:7] in ['Resent-']):
-                    if ('X-' + key) in self.heads_dict:
-                        self.heads_dict['X-Original-' + key] = \
-                            self.heads_dict['X-' + key]
-                    self.heads_dict['X-' + key] = self.heads_dict[key]
-                    del self.heads_dict[key]
+            for key in self.message.keys():
+                if key.startswith('Resent-'):
+                    if ('X-' + key) in self.message:
+                        self.message['X-Original-' + key] = \
+                            self.message['X-' + key]
+                    self.message['X-' + key] = self.message[key]
+                    del self.message[key]
 
             # In rfc822 References: is considered, but many MUA doen't put it.
-            if ('References:' not in self.heads_dict) and \
-                    ('In-Reply-To:' in self.heads_dict):
-                print self.heads_dict['In-Reply-To:']
+            if 'References:' not in self.message and \
+                    'In-Reply-To:' in self.message:
+                print self.message['In-Reply-To:']
 
+                # FIXME !!! Do konce metody je to dost zmatené!
                 # some MUA uses msgid without '<' '>'
 #                ref = findall('([^\s<>\']+@[^\s<>;:\']+)', \
                 # but I prefer use RFC standards
+                # FIXME isn't In-Reply-To supposed to be unique???
                 ref = findall('(<[^<>]+@[^<>]+>)',
-                              self.heads_dict['In-Reply-To:'])
+                              self.message.get_all('In-Reply-To:'))
 
                 # if found, keep first element that seems a Msg-ID.
                 if(ref and len(ref)):
                     self.heads_dict['References:'] = '%s\n' % ref[0]
 
-#            if('To:' in self.heads_dict):
-#                self.heads_dict['X-To:'] = self.heads_dict['To:']
-#                del self.heads_dict['To:']
-
         except KeyError, message:
             print message
 
@@ -236,51 +166,32 @@ class mail2news:
     def removeheads(self, heads=None):
         """remove headers like Xref: Path: Lines:
         """
-
-        try:
         # removing some others useless headers .... (From is not From:)
 
         rmheads = ['Received:', 'From', 'NNTP-Posting-Host:',
                    'X-Trace:', 'X-Compliants-To:', 'NNTP-Posting-Date:']
-            if(heads):
+        if heads:
             rmheads.append(heads)
 
         for head in rmheads:
-                if head in self.heads_dict:
-                    del self.heads_dict[head]
-
-#            if 'From' in self.heads_dict: # neither 'From ' nor 'From:'
-#                del self.heads_dict['From']
-
-#            # neither 'From ' nor 'From:'
-#            if 'NNTP-Posting-Host:' in self.heads_dict:
-#                del self.heads_dict['']
-
-#            if 'Lines:' in self.heads_dict:
-#                del self.heads_dict['Lines:']
+            if head in self.message:
+                del self.message[head]
 
-            # it is usually set by INN, if ng is moderated...
-#            if 'Sender:' in self.heads_dict:
-#                del self.heads_dict['Sender:']
-
-            if 'Message-id:' in self.heads_dict:
+        # FIXME the following lines are buggy, because they don't expect
+        # the header 'Message-Id' being already present
+        if 'Message-id:' in self.message:
             self.heads_dict['Message-Id:'] = self.heads_dict['Message-id:']
             del(self.heads_dict['Message-id:'])
 
-            if 'Message-ID:' in self.heads_dict:
+        if 'Message-ID:' in self.message:
             self.heads_dict['Message-Id:'] = self.heads_dict['Message-ID:']
             del(self.heads_dict['Message-ID:'])
 
         # If message-id is not present, I generate it
-            if 'Message-Id:' not in self.heads_dict:
+        if 'Message-Id:' not in self.message:
             msgid = '<pyg.%d@tuchailepuppapera.org>\n' % (getpid())
             self.heads_dict['Message-Id:'] = msgid
 
-        except KeyError, message:
-            print message
-
-        return self.heads_dict
-
     def sendemail(self):
         """Talk to NNTP server and try to send email."""
         try: