рдпрд╣ рд▓реЗрдЦ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдпрдерди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛:
- рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛
- рд╡реЗрдм рдкреЗрдЬ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛;
- smtp-server рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдирд╛;
- рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛ред
рдпрд╣ рд╕рдм рдХрд╛рдо рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдХрдИ рд▓реЛрдЧ рдЕрдореЗрд░рд┐рдХреА рдЙрдкрдирдЧрд░реАрдп рд░рд╛рдЬрджреВрдд рдореЗрдВ рдПрдХ рдареЗрда рд╕реБрдмрд╣ рд╕реЗ рдорд╛рдирдХ рдлрд┐рд▓реНрдо рдХреЗ рджреГрд╢реНрдп рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рдЖрджрдореА рд╕рд╛рдЗрдХрд┐рд▓ рдкрд░ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЕрдЦрдмрд╛рд░ рдлреЗрдВрдХрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрдбрд╝рд╛ рдФрд░ рдЭрдмрд░рд╛ рдХреБрддреНрддрд╛ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкреНрд░рдореБрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЦрдмрд╛рд░ рд▓рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рдЧрддрд┐ рдЪрд▓ рд░рд╣реА рд╣реИ рдФрд░ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдЕрдм рдбрд┐рдЬрд┐рдЯрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдбрд╛рдХ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА рдбрд┐рд▓реАрд╡рд░реА рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдпрд╣ рдЕрд╡рд╕рд░ рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкрд░, рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдЯреА рд╕реНрдкреЛрд░реНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░, рдпрд╣ рдЕрд╡рд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдкреАрдбреАрдПрдл рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред
рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рд░ рд╕реБрдмрд╣ рдореБрдЭреЗ рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдирд╛ рдерд╛, рд╡рд╣рд╛рдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд┐рдВрдбрд▓ рдмреЙрдХреНрд╕ рдкрд░ рднреЗрдЬреЗрдВ, рдлрд┐рд░ рдЬрд▓рд╛рдиреЗ рдкрд░ рд╡рд╛рдИ-рдлрд╛рдИ рдЪрд╛рд▓реВ рдХрд░реЗрдВ - рдФрд░ рдЕрдм рдЖрдк рдореЗрдЯреНрд░реЛ рдореЗрдВ рдЕрдЦрдмрд╛рд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреНрд░реЗрди рд╕реЗред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡реЗрдм рдкреЗрдЬ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡реЗрдм рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, urllib2 рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЛ рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдкреГрд╖реНрда рдХреЛ рджреЗрдЦрдирд╛ред
def download_by_link(self, link): content = urllib2.urlopen(link).read()
рдХреЗ рд╕рд╛рде C # рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд┐ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рдкрд╛рд░ рдХрд░реЗрдВрдЧреЗ (рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдкрд╡рд╛рдж) рд╕реЗ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдХреЗ рдирд╡реАрдирддрдо рдЕрдВрдХ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреБрдирдГ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ urllib2 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЕрд▓реМрдХрд┐рдХ рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ:
def get_filename(self, text): pattern = r'(?P<link>http:\/\/archive\.sport\-express\.ru\/pdf\/(?P<filename>[0-9]+\.zip))' match = re.search(pattern, text) return match.group('link'), match.group('filename')
(? рдкреА) - рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рд╕реАрдЬрди рдореЗрдВ рдирд╛рдорд┐рдд рд╕рдореВрд╣ рдХреЛ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рд▓рд┐рдВрдХ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред
class SportExpress(): def get_from(self): return 'username@mail.ru' def get_title(self): return 'Sport Express subscribe' def get_text(self): return "Good morning! Don't be lazy - read newspaper!" def get_prepared_files(self, archive): directory_to_extract = archive[:archive.rfind('.')] zipfile.ZipFile(archive).extractall(directory_to_extract)
рдПрдХ рдкрддреНрд░ рдмрдирд╛рдПрдБ
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рднреЗрдЬрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ "рд▓рд┐рдлрд╛рдлрд╛" рдмрдирд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЕрдЬрдЧрд░ рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдИрдореЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
import email, email. encoders, email.mime.text, email.mime.base class MessageBase: def __init__(self, subscriber): self.__to_addresses = subscriber.get_subscribers() self.__from_address = subscriber.get_from() self.__message = self.__create_message(subscriber.get_title(), subscriber.get_text())
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдЯрд░ рдмрдирд╛рдПрдВред MIME рдХреЗ тАЛтАЛрдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ,
рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз
рд╣реИрдВ ред
def __create_message(self, subject, text): email_msg = email.MIMEMultipart.MIMEMultipart('mixed') email_msg['Subject'] = subject email_msg['From'] = self.get_from() email_msg['To'] = ', '.join(self.get_to()) email_msg.attach(email.mime.text.MIMEText(text,'text')) return email_msg
рдлрд╝рд╛рдЗрд▓ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдЦреЛрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рддреЛ рдЖрдкрдХреЛ file_type рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
def attach_file(self, filename, file_link, file_type = 'unknown'): file_message = email.mime.base.MIMEBase('application', file_type) file_message.set_payload(file(file_link).read()) email.encoders.encode_base64(file_message) file_message.add_header('Content-Disposition','attachment;filename='+filename) self.__message.attach(file_message) return True
рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ as_string () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
def get_text(self): return self.__message.as_string()
рдПрдХ рдкрддреНрд░ рднреЗрдЬреЗрдВ
рдЕрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкрддреНрд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Smtplib Python рдХреЛ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
import smtplib from message import MessageBase class SmtpBase: def __init__(self, serverhost): self.__smtp_server = serverhost def open(self): self.__server = smtplib.SMTP(self.__smtp_server) self.__server.login('<enter your smtp login>', '<enter your smtp password>') def close(self): self.__server.quit()
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ get_from (), get_to (), get_text () рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
def send_mail(self, message): for message_to in message.get_to(): self.__server.sendmail(message.get_from(), message_to, message.get_text())
'рдХреЗ рд╕рд╛рде' рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
def __enter__(self): self.open() return self def __exit__(self, type, value, traceback): if type: print '%s: %s %s' % (type, value, traceback) self.close()
рд╣рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдореЗрд░реА рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
from subscriber_sex import SportExpress from smtp import SmtpBase from message import MessageBase b = SportExpress() filenames = b.download_by_link('http://www.sport-express.ru') msg = MessageBase(b) for file in filenames: msg.attach_file(file[file.rfind('/')+1:], file, 'pdf') with SmtpBase('smtp.yandex.ru') as s: s.send_mail(msg)
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж, рд╕реНрдкреЛрд░реНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдирд╡реАрдирддрдо рдЕрдВрдХ рд╕рд╣реА рдЖрдкрдХреЗ рдЗрдирдмреЙрдХреНрд╕ рдореЗрдВ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рдореИрдВ рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд╢рди рдкрддреНрд░рд┐рдХрд╛рдУрдВ рдХреЗ рдореБрдлреНрдд рдкреАрдбреАрдПрдл рд╕рдВрд╕реНрдХрд░рдг рджреЗрддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдкреАрдбреАрдПрдл рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рддрд╛рдЬрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирдИ рдкрддреНрд░рд┐рдХрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 3 рдлрд╝рдВрдХреНрд╢рди рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕реБрдЦрдж рдереАред