ArxivRobot/email_sender.py
2019-12-23 12:42:31 +08:00

139 lines
5.0 KiB
Python

from lib.parser import dom_node, simple_parser
from lib import parser
from lib import utils
import os
import config
import smtplib
import email
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
from email.header import Header
from email import generator
def send_mail(reciver, title, content):
# with open('email.html', 'w', encoding="utf-8") as f:
# f.write(content)
# 20:24
username = config.username
password = config.password
replyto = config.replyto
msg = MIMEMultipart('alternative')
msg['Subject'] = Header(title)
msg['From'] = '%s <%s>' % (Header(config.sender_name), username)
msg['To'] = reciver
msg['Reply-to'] = replyto
msg['Message-id'] = email.utils.make_msgid()
msg['Date'] = email.utils.formatdate()
texthtml = MIMEText(content, _subtype='html', _charset='UTF-8')
msg.attach(texthtml)
# with open('email.eml', 'w') as outfile:
# gen = generator.Generator(outfile)
# gen.flatten(msg)
try:
client = smtplib.SMTP_SSL(config.smtp_ssl_addr)
# client.connect('smtpdm-ap-southeast-1.aliyun.com', 80)
client.set_debuglevel(0)
client.login(username, password)
client.sendmail(username, reciver, msg.as_string())
client.quit()
print ('Email send to {0} success!'.format(reciver))
return True
except smtplib.SMTPConnectError as e:
print ('Connection Error:', e.smtp_code, e.smtp_error)
except smtplib.SMTPAuthenticationError as e:
print ('Authentication Error:', e.smtp_code, e.smtp_error)
except smtplib.SMTPSenderRefused as e:
print ('Sender Refused:', e.smtp_code, e.smtp_error)
except smtplib.SMTPRecipientsRefused as e:
print ('SMTPRecipients Refused:', e.smtp_code, e.smtp_error)
except smtplib.SMTPDataError as e:
print ('Data Error:', e.smtp_code, e.smtp_error)
except smtplib.SMTPException as e:
print ('SMTPException:', e.message)
except Exception as e:
print ('Unknown error:', str(e))
return True
class arxiv_emailer():
def __init__(self, arxiv_bot, feeds_generator, session_file = './config/email_session.xml', debug=False):
self.debug = debug
self.email_info = dom_node()
self.session_file = session_file
self.sessions = None
if self.session_file is not None:
self.load_session()
self.bot = arxiv_bot
self.feeds = feeds_generator
def send_daily_email(self):
emails = self.feeds.generate_daily_emails()
today = utils.str_day()
for name in emails:
email = emails[name]
send = False
if name not in self.sessions:
print('New user found!')
self.sessions[name] = {}
self.sessions[name]['last-send'] = today
send = True
if self.sessions[name]['last-send'] != today:
send = True
if send:
print('Sending email to user {0} [{1}]'.format(name, email['reciver']))
print('reciver:', email['reciver'])
print('title:', email['title'])
print('content:', len(email['content']))
success = False
if not self.debug:
success = send_mail(email['reciver'], email['title'], email['content'])
if success:
self.sessions[name]['last-send'] = today
self.save_session()
else:
print('skipping user {0} since already sent!'.format(name))
def load_session(self, session_file=None):
if session_file is None:
session_file = self.session_file
tree = None
with open(session_file, 'r') as f:
xml = f.read()
xmlparser = simple_parser()
xmlparser.feed(xml)
tree = xmlparser.root
sessions = parser.dom2dict(tree)
if 'root' in sessions:
sessions = sessions['root']
else:
sessions = {}
self.sessions = sessions
print(self.sessions)
return sessions
def save_session(self, session_file=None):
if session_file is None:
session_file = self.session_file
if session_file is None:
return None
xml = parser.dict2dom(self.sessions).to_string()
with open(session_file, 'w') as f:
f.write(xml)
return xml
if __name__ == '__main__':
emailer = arxiv_emailer(None, None, None)
emailer.send_daily_email()
print(emailer.load_session())
print(emailer.save_session())