2012-01-04 4 views
0

Я хотел бы иметь конфигурационный файл с набором контента для отправки по почте. Каждое электронное письмо должно содержать предмет и тело с новыми строками.Python: файл конфигурации содержимого электронной почты

Например:

[Message_One] 
Subject: Hey there 
Body: This is a test 
     How are you? 
     Blah blah blah 

     Sincerely, 
     SOS 

[Message_Two] 
Subject: Goodbye 
Body: This is not a test 
     No one cares 
     Foo bar foo bar foo bar 

     Regards 

Как бы я получить эту работу с Python в качестве конфигурационного файла для случайного выбора между содержанием и/или захватить один за это определенное имя (Message_One, Message_Two)?

Благодаря

ответ

1
#!/usr/bin/env python3 
from re import match 
from collections import namedtuple 
from pprint import pprint 
from random import choice 

Mail = namedtuple('Mail', 'subject, body') 

def parseMails(filename): 
    mails = {} 
    with open(filename) as f: 
     index = '' 
     subject = '' 
     body = '' 
     for line in f: 
      m = match(r'^\[(.+)\]$', line) 
      if m: 
       if index: 
        mails[index] = Mail(subject, body) 
       index = m.group(1) 
       body = '' 
      elif line.startswith('Subject: '): 
       subject = line[len('Subject: '):-1] 
      else: 
       body += line[len('Body: '):] 
     else: 
      mails[index] = Mail(subject, body) 
    return mails 

mails = parseMails('mails.txt') 
index = choice(list(mails.keys())) 
mail = mails[index] 
pprint(mail) 

Mail(subject='Goodbye', body='This is not a test\nNo one cares\nFoo bar foo bar foo bar\nRegards\n') 
  • разобрать почту
  • случайный выбор один почтовый
+0

Спасибо, работал как ожидалось и позволяет мне при необходимости корректировать. – mikeyy

+0

Любая идея, почему есть только одна новая линия перед Справки, а не две? – mikeyy

+0

@mikeyy 'body + = line [len ('Body:'):]' – kev

3

Может быть, как это:

from ConfigParser import ConfigParser 
import random 

conf = ConfigParser() 
conf.read('test.conf') 

mail = random.choice(conf.sections()) 
print "mail: %s" % mail 
print "subject: %s" % conf.get(mail, 'subject') 
print "body: %s" % conf.get(mail, 'body') 

Это просто вопрос выбора случайного имени раздела с random.choice(conf.sections()). Функция random.choice выберет случайный элемент из последовательности - метод sections вернет все имена разделов, то есть ["Message_One", "Message_Two"]. Затем вы используете это имя раздела, чтобы получить другие нужные вам значения.

+0

Спасибо. Выглядит гораздо более упрощенным, чем то, к чему шел кев, но оба работают так, как ожидалось. – mikeyy

+1

[demo] (http://ideone.com/nOEld) – jfs

+0

@ J.F.Sebastian: ничего себе, я не знал об этом сайте! Круто! –

Смежные вопросы