#!/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') # 收件人显示名称
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):
"""
开发者版本
:return:
"""
dev_weather = WeatherInfo().dev_version()
dates = dev_weather[0]
day_weathers = dev_weather[1]
night_weathers = dev_weather[2]
highest_temps = dev_weather[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} |
"""
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):
"""
免费版本
:return:
"""
free_weather = WeatherInfo().free_version()
dates = free_weather[0]
day_weathers = free_weather[1]
night_weathers = free_weather[2]
highest_temps = free_weather[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} |
"""
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):
"""
自然灾害预警
:return:
"""
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]
match status:
case 'update':
status = '预警更新'
Logger.info(f'{self.language["new_warning"]}')
case 'active':
status = '已有灾害'
Logger.info(f'{self.language["warning_updated"]}')
case 'cancel':
Logger.info(f'{self.language["warning_canceled"]}')
mail_html = f"""
Warning
{title}
释放时间:{release_time} {level}级
预警状态:{status} 预警类型:{type_} 灾害持续时间:{start_time[:10]}~{end_time[:10]}
{text}
"""
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:
if status != 'cancel':
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)