diff --git a/mailing.py b/mailing.py index b590930..f48c561 100755 --- a/mailing.py +++ b/mailing.py @@ -7,12 +7,12 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. -# +# # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA @@ -31,13 +31,17 @@ from email.message import EmailMessage # displays usage of the program, then quit # def usage(returncode): - print("""SYNTAX: - """, sys.argv[0], """ -t tofile -b bodyfile [-p attachedfile] + print( + """SYNTAX: + """, + sys.argv[0], + """ -t tofile -b bodyfile [-p attachedfile] tofile : sort of CSV file containing addresses of recipients bodyfile : template of the mail to be sent attachedfile : optionnal attachment - """) + """, + ) sys.exit(returncode) @@ -47,44 +51,46 @@ JOINFILE = None # read the recipients file where values are separated by | characters -def read_recipients() : +def read_recipients(): recipientfile = open(TOFILE) lines = recipientfile.readlines() - return [line[:-1].split('|') for line in lines] + return [line[:-1].split("|") for line in lines] -def read_body() : +def read_body(): bodyfile = open(BODYFILE) body = "" - for line in bodyfile.readlines() : + for line in bodyfile.readlines(): body = body + line return body -def read_join() : + +def read_join(): try: - with open(JOINFILE, 'rb') as fp: + with open(JOINFILE, "rb") as fp: ctype, encoding = mimetypes.guess_type(JOINFILE) if ctype is None or encoding is not None: - ctype = 'application/octet-stream' - maintype, subtype = ctype.split('/', 1) + ctype = "application/octet-stream" + maintype, subtype = ctype.split("/", 1) metadata = { - 'filename': JOINFILE, - 'maintype': maintype, - 'subtype': subtype, - } + "filename": JOINFILE, + "maintype": maintype, + "subtype": subtype, + } return (fp.read(), metadata) except Exception as e: print("read error: %s" % e) exit(1) -def replace_values(bodytemplate, values) : + +def replace_values(bodytemplate, values): body = bodytemplate - for i in range(len(values)) : - i = i+1 + for i in range(len(values)): + i = i + 1 pattern = "${{%02d}}" % i - body = body.replace(pattern, values[i-1]) + body = body.replace(pattern, values[i - 1]) return body @@ -96,17 +102,20 @@ CCPATTERN = re.compile(r"^Cc: *(.*)") BCCPATTERN = re.compile(r"^Bcc: *(.*)") REPLYTOPATTERN = re.compile(r"^Reply-To: *(.*)") -def qencode_subject (message): - subjectmatches = re.search (r"^Subject: *(.*)$", message, re.MULTILINE) - if (subjectmatches == None): return message + +def qencode_subject(message): + subjectmatches = re.search(r"^Subject: *(.*)$", message, re.MULTILINE) + if subjectmatches == None: + return message subjectstr = subjectmatches.group(1) - h = Header(subjectstr, 'utf-8') - qsubjectstr=h.encode() - return message.replace (subjectstr, qsubjectstr, 1) + h = Header(subjectstr, "utf-8") + qsubjectstr = h.encode() + return message.replace(subjectstr, qsubjectstr, 1) -def send_message(message, to, attachment) : - lines = message.split('\n') +def send_message(message, to, attachment): + + lines = message.split("\n") # identify headers in the template fromvalue = None @@ -114,10 +123,10 @@ def send_message(message, to, attachment) : ccvalue = None bccvalue = None replytovalue = None - - for index, line in enumerate(lines) : - if not line : - body = '\n'.join(lines[index+1:]) + + for index, line in enumerate(lines): + if not line: + body = "\n".join(lines[index + 1 :]) break frommatches = FROMPATTERN.match(line) @@ -126,62 +135,65 @@ def send_message(message, to, attachment) : bccmatches = BCCPATTERN.match(line) replytomatches = REPLYTOPATTERN.match(line) - if frommatches : + if frommatches: fromvalue = frommatches.group(1) - if subjectmatches : + if subjectmatches: subjectvalue = subjectmatches.group(1) - if ccmatches : + if ccmatches: ccvalue = ccmatches.group(1) - if bccmatches : + if bccmatches: bccvalue = bccmatches.group(1) - if replytomatches : + if replytomatches: replytovalue = replytomatches.group(1) # lists all addresses to which the mail will be sent dests = [to] - if ccvalue : + if ccvalue: dests.append(ccvalue) - if bccvalue : + if bccvalue: dests.append(bccvalue) msg = EmailMessage() - msg['Subject'] = subjectvalue - msg['From'] = fromvalue - msg['To'] = to + msg["Subject"] = subjectvalue + msg["From"] = fromvalue + msg["To"] = to if replytovalue: - msg['Reply-To'] = replytovalue - if ccvalue : - msg['Cc'] = ccvalue + msg["Reply-To"] = replytovalue + if ccvalue: + msg["Cc"] = ccvalue msg.set_content(body) if attachment: msg.add_attachment(attachment[0], **attachment[1]) - print("Sending : %s, from %s to %s, dests : %s" % (subjectvalue, fromvalue, dests[0], repr(dests))) + print( + "Sending : %s, from %s to %s, dests : %s" + % (subjectvalue, fromvalue, dests[0], repr(dests)) + ) # sending the mail to its recipients using the local mailer via SMTP - server = smtplib.SMTP('localhost','25') + server = smtplib.SMTP("localhost", "25") server.set_debuglevel(1) server.send_message(msg) server.quit() - - -if __name__ == '__main__' : - +if __name__ == "__main__": # handle options of the program - try: - opts, args = getopt.getopt(sys.argv[1:], 't:b:p:') + try: + opts, args = getopt.getopt(sys.argv[1:], "t:b:p:") except getopt.error as msg: print("getopt error: %s" % msg) usage(1) - + for name, value in opts: - if name == '-t': TOFILE = value - elif name == '-b': BODYFILE = value - elif name == '-p': JOINFILE = value + if name == "-t": + TOFILE = value + elif name == "-b": + BODYFILE = value + elif name == "-p": + JOINFILE = value else: print("argument: ", name, " invalid") usage(1) @@ -204,8 +216,8 @@ if __name__ == '__main__' : counter = 0 # send mail to each recipient - for set in sets : - + for set in sets: + values = set # the recipient is always in first column @@ -219,8 +231,7 @@ if __name__ == '__main__' : # pause every 10 mails for 5 secs so that the MTA doesn't explode counter = counter + 1 - if counter >= 10 : + if counter >= 10: counter = 0 print("suspending execution for 5 secs") time.sleep(5) -