import os from configparser import ConfigParser import json import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import datetime import requests SMTP_PORT = 0 SMTP_SERVER = 'null' SENDER_EMAIL = 'a@b.c' RECEIVER_EMAIL = 'd@e.f' def main(): global SMTP_PORT, SMTP_SERVER, SENDER_EMAIL, RECEIVER_EMAIL script_dir = os.path.dirname(__file__) conf_file = os.path.join(script_dir, 'conf.ini') template_file = os.path.join(script_dir, 'template.html') parser = ConfigParser() parser.read(conf_file) SMTP_PORT = parser.get('config', 'smtp_port') SMTP_SERVER = parser.get('config', 'smtp_server') SENDER_EMAIL = parser.get('config', 'sender_email') RECEIVER_EMAIL = parser.get('config', 'receiver_email') projects = json.loads(parser.get('projects', 'projects')) new_releases = [] new_projects = [] if not parser.has_section('release'): parser.add_section('release') for project in projects: last_release = get_last_release(project) if not parser.has_option('release', project): new_projects.append(last_release) else: last_config_tag = parser.get('release', project) if last_config_tag != last_release['release_tag']: last_release['preview_tag'] = last_config_tag new_releases.append(last_release) parser.set('release', project, last_release['release_tag']) if not new_releases and not new_projects: print('No new projets or new release detected. Bye!') return content = "" for new_r in new_releases: content += """
  • {}: new release {} available (old: {}). (published {})
  • """.format( new_r['release_url'], new_r['project_name'], new_r['release_url'], new_r['release_tag'], new_r['preview_tag'], convert_date(new_r['published_date'])) for new_p in new_projects: content += """
  • {} was added to your configuration. Last release: {} (published {})
  • """.format( new_p['release_url'], new_p['project_name'], new_p['release_url'], new_p['release_tag'], convert_date(new_p['published_date'])) # print(content) with open(template_file, 'r') as f_template: template = f_template.read() send_mail(template.replace('{{content}}', content)) with open('conf.ini', 'w') as configfile: parser.write(configfile) def get_last_release(project): url = 'https://api.github.com/repos/{}/releases/latest'.format(project) result = requests.get(url) print(project) print(url) release = result.json() release_tag = release['tag_name'] published_date = release['published_at'] # body = release['body'] release_url = release['html_url'] return {'release_tag': release_tag, 'published_date': published_date, # 'body': body, 'project_name': project, 'release_url': release_url} def send_mail(content): message = MIMEMultipart("alternative") message["Subject"] = "New Github releases" message["From"] = SENDER_EMAIL message["To"] = RECEIVER_EMAIL # part1 = MIMEText(text, "plain") part2 = MIMEText(content, "html") # message.attach(part1) message.attach(part2) with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server: server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string()) def convert_date(date: str, format='%d %b %Y at %H:%M') -> str: return datetime.datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ").strftime(format) if __name__ == "__main__": main()