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: