139 lines
5.0 KiB
Python
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())
|