From d28dde9ff3187a0d652041719dace55ead21a0ef Mon Sep 17 00:00:00 2001 From: RTAkland Date: Thu, 16 Dec 2021 21:50:35 +0800 Subject: [PATCH] feat: sendmail.py --- core/sendmail.py | 406 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 406 insertions(+) create mode 100644 core/sendmail.py diff --git a/core/sendmail.py b/core/sendmail.py new file mode 100644 index 0000000..fca499a --- /dev/null +++ b/core/sendmail.py @@ -0,0 +1,406 @@ +#!/usr/bin/env python3 +# -- coding:utf-8 -- +# @Author: markushammered@gmail.com +# @Development Tool: PyCharm +# @Create Time: 2021/12/16 +# @File Name: sendmail.py + + +import sys +import smtplib +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart +from email.header import Header +from email.mime.text import MIMEText +from core.logger import Logger +from core.language import Language +from core.information import WeatherInfo +from core.read_config import read_config + + +class Mail: + def __init__(self): + self.settings = read_config() + self.language = Language() + self.enableSSL = self.settings[2]['SSL'] + self.server = self.settings[0]['server'] + self.port = self.settings[0]['port'] + self.password = self.settings[0]['password'] + self.sender = self.settings[0]['sender'] + self.receiver = self.settings[1]['receiver'] + self.city_name = self.settings[3]['city-name'] + self.message = MIMEMultipart('related') + self.message['From'] = Header('QWeather') # 发件人名称 + self.message['To'] = Header('All allowed User') # 收件人显示名称 + self.msg_content = MIMEMultipart('alternative') # 文字目录 + + if self.enableSSL: + self.smtp = smtplib.SMTP_SSL(self.server, self.port) # 登录服务器 使用SSL连接 + else: + self.smtp = smtplib.SMTP(self.server, self.port) # 登录邮箱服务器 不使用SSL连接 + + def dev_version(self): + dev_weather = WeatherInfo().dev_version() + dates = dev_weather[0] + day_weathers = dev_weather[1] + night_weathers = dev_weather[2] + highest_temps = [3] + lowest_temps = dev_weather[4] + icons = dev_weather[5] + sunset = dev_weather[6] + sunrise = dev_weather[7] + humidity = dev_weather[8] + wind_speed = dev_weather[9] + wind_scale = dev_weather[10] + wind_dir = dev_weather[11] + uv_index = dev_weather[12] + cloud = dev_weather[13] + pressure = dev_weather[14] + vis = dev_weather[15] + + mail_html = f""" +

+ + + 地区:{self.city_name} +
+ 发送者:{self.sender} +
+
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
| 日期  | 天气  | 最低温度  | 最高温度  
今天{day_weathers[0]}/{night_weathers[0]} {lowest_temps[0]}℃{highest_temps[0]}℃
{dates[1]}{day_weathers[1]}/{night_weathers[1]} {lowest_temps[1]}℃{highest_temps[1]}℃
{dates[2]}{day_weathers[2]}/{night_weathers[2]} {lowest_temps[2]}℃{highest_temps[2]}℃
{dates[3]}{day_weathers[3]}/{night_weathers[3]} {lowest_temps[3]}℃{highest_temps[3]}℃
{dates[4]}{day_weathers[4]}/{night_weathers[4]} {lowest_temps[4]}℃{highest_temps[4]}℃
{dates[5]}{day_weathers[5]}/{night_weathers[5]} {lowest_temps[5]}℃{highest_temps[5]}℃
{dates[6]}{day_weathers[6]}/{night_weathers[6]} {lowest_temps[6]}℃{highest_temps[6]}℃
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
相对湿度紫外线
{wind_speed}m/s  {wind_scale}  {wind_dir} {humidity}% {uv_index} 
 
能见度大气压强相对云量
{vis}km {pressure}hPa {cloud}% 
+ + + + + + + + + + + + + + +
 
Sunrise Sunset
 {sunrise} --------------- {sunset} 
+
+
+
+
+ + + QWeather +  ·  + Github Repo + + +
""" + self.message['Subject'] = '七天天气预报' # 邮件标题 + self.message.attach(MIMEText(mail_html, 'html', 'utf-8')) + + image_count = 1 + for image_resource in icons: + with open(f'./res/icons/{image_resource}.png', 'rb') as fp: + MyImage = MIMEImage(fp.read()) + MyImage.add_header('Content-ID', f'img{image_count}') + self.message.attach(MyImage) + image_count += 1 + + with open('./res/basic-resources/sunrise.png', 'rb') as sr_f: + sunrise_img = MIMEImage(sr_f.read()) + sunrise_img.add_header('Content-ID', 'sunrise') + self.message.attach(sunrise_img) + with open('./res/basic-resources/sunset.png', 'rb') as ss_f: + sunset_img = MIMEImage(ss_f.read()) + sunset_img.add_header('Content-ID', 'sunset') + self.message.attach(sunset_img) + + try: + self.smtp.login(self.sender, self.password) # 登录 + self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 + Logger.info(f'{self.language["mail_succeed"]}') + except smtplib.SMTPException as e: # 处理错误 + Logger.critical(f'{self.language["mail_error"]}: {e}') + sys.exit(1) + + def free_version(self): + free_weather = WeatherInfo().free_version() + dates = free_weather[0] + day_weathers = free_weather[1] + night_weathers = free_weather[2] + highest_temps = [3] + lowest_temps = free_weather[4] + icons = free_weather[5] + sunset = free_weather[6] + sunrise = free_weather[7] + humidity = free_weather[8] + wind_speed = free_weather[9] + wind_scale = free_weather[10] + wind_dir = free_weather[11] + uv_index = free_weather[12] + cloud = free_weather[13] + pressure = free_weather[14] + vis = free_weather[15] + + mail_html = f""" +

+ + + 地区:{self.city_name} +
+ 发送者:{self.sender} +
+
+

+
+ + + + + + + + + + + + + + + + + + + + + + +
| 日期  | 天气  | 最低温度  | 最高温度  
今天{day_weathers[0]}/{night_weathers[0]} {lowest_temps[0]}℃{highest_temps[0]}℃
{dates[1]}{day_weathers[1]}/{night_weathers[1]} {lowest_temps[1]}℃{highest_temps[1]}℃
{dates[2]}{day_weathers[2]}/{night_weathers[2]} {lowest_temps[2]}℃{highest_temps[2]}℃
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
相对湿度紫外线
{wind_speed}m/s  {wind_scale}  {wind_dir} {humidity}% {uv_index} 
 
能见度大气压强相对云量
{vis}km {pressure}hPa {cloud}% 
+ + + + + + + + + + + + + + +
 
Sunrise Sunset
 {sunrise} --------------- {sunset} 
+
+
+
+
+ + + QWeather +  ·  + Github Repo + + +
""" + self.message['Subject'] = '三天天气预报' # 邮件标题 + self.message.attach(MIMEText(mail_html, 'html', 'utf-8')) + + image_count = 1 + for image_resource in icons: + with open(f'./res/icons/{image_resource}.png', 'rb') as fp: + MyImage = MIMEImage(fp.read()) + MyImage.add_header('Content-ID', f'img{image_count}') + self.message.attach(MyImage) + image_count += 1 + + with open('./res/basic-resources/sunrise.png', 'rb') as sr_f: + sunrise_img = MIMEImage(sr_f.read()) + sunrise_img.add_header('Content-ID', 'sunrise') + self.message.attach(sunrise_img) + with open('./res/basic-resources/sunset.png', 'rb') as ss_f: + sunset_img = MIMEImage(ss_f.read()) + sunset_img.add_header('Content-ID', 'sunset') + self.message.attach(sunset_img) + + try: + self.smtp.login(self.sender, self.password) # 登录 + self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 + Logger.info(f'{self.language["mail_succeed"]}') + except smtplib.SMTPException as e: # 处理错误 + Logger.critical(f'{self.language["mail_error"]}: {e}') + sys.exit(1) + + def warning_(self): + info = WeatherInfo().warning_() + release_time = info[0] + title = info[1] + status = info[2] + level = info[3] + type_ = info[4] + text = info[5] + start_time = info[6] + end_time = info[7] + + mail_html = f""" + + + + + Warning + + +
+

{title}

+

释放时间:{release_time} {level}级

+

+ 预警状态:{status} 预警类型:{type_} 灾害持续时间:{start_time[:10]}~{end_time[:10]} +
+ {text} +

+
+
+
+
+
+ + + QWeather +  ·  + Github Repo + + +
+ + + """ + self.message['Subject'] = '自然灾害预警' # 邮件标题 + self.message.attach(MIMEText(mail_html, 'html', 'utf-8')) + + with open('./res/basic-resources/sunrise.png', 'rb') as sr_f: + sunrise_img = MIMEImage(sr_f.read()) + sunrise_img.add_header('Content-ID', 'sunrise') + self.message.attach(sunrise_img) + with open('./res/basic-resources/sunset.png', 'rb') as ss_f: + sunset_img = MIMEImage(ss_f.read()) + sunset_img.add_header('Content-ID', 'sunset') + self.message.attach(sunset_img) + + try: + self.smtp.login(self.sender, self.password) # 登录 + self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 + Logger.info(f'{self.language["mail_succeed"]}') + except smtplib.SMTPException as e: # 处理错误 + Logger.critical(f'{self.language["mail_error"]}: {e}') + sys.exit(1)