Link Search Menu Expand Document

天气查询邮件提醒

软件界面ui

ui设计

用的是PyQt5,先用Qt Designer设计界面,拖动组件改属性即可,注意objectName一定要改,保持良好的习惯。

image-20210530172731604

主程序调用ui:

将ui文件转化成py文件Ui_weatherQuery.py,在这个文件里绑定事件,然后在主程序里面调用界面就可。

ui事件绑定业务函数:

Ui_weatherQuery.py文件里,

self.queryBtn.clicked.connect(Dialog.queryWeather)
self.clearBtn.clicked.connect(Dialog.clearText)
self.pushButton.clicked.connect(Dialog.sendEmail)
主程序里与ui的交互
class MainDialog(QDialog):
    def __init__(self, parent=None):
        super(QDialog, self).__init__(parent)
        self.ui = Ui_weatherQuery.Ui_Dialog()
        self.ui.setupUi(self)

    def queryWeather(self):
        city_name = self.ui.txtCityName.text()
        self.res = query_weather(city_name=city_name)
        self.ui.txtQueryRes.setText(self.res)

    def clearText(self):
        self.ui.txtQueryRes.clear()
        self.ui.txtCityName.clear()

    def sendEmail(self):
        email_send.go(msg=self.res, subject_msg='天气预报')
        pass
显示界面模板框架
from PyQt5.QtWidgets import QApplication, QDial, QDialog

if __name__ == '__main__':
    myApp = QApplication(sys.argv)
    myDlg = MainDialog()
    myDlg.show()

    sys.exit(myApp.exec_())

天气查询部分

调用api

api有免费的,申请就完事了。

request包发送请求,返回的json解析一下就可。

def query_weather(city_name="武汉", record=True):
    appid = "29467327"
    appsecret = "27kJLhNF"
    # 请求地址&信息
    url = u"https://www.tianqiapi.com/free/week?appid={}&appsecret={}&city={}".format(
        appid, appsecret, city_name)
    # 发送请求得到返回结果
    r = requests.get(url)
    # 格式化显示json
    res = json.dumps(r.json(), indent=4, ensure_ascii=False)
    if record:
        with open("res.txt", 'w')as f:
            f.write(res)
    return res

部分结果展示

{
    "cityid": "101200101",
    "city": "武汉",
    "update_time": "2021-05-30 15:55:18",
    "data": [
        {
            "date": "2021-05-30",
            "wea": "晴转多云",
            "wea_img": "yun",
            "tem_day": "30",
            "tem_night": "20",
            "win": "南风",
            "win_speed": "<3级"
        },
        ......
    ]
}

邮件发送部分

# smtp(simple mail transfer protocol)是python自带的邮件模块,负责邮件传输
# email负责邮件内容
import smtplib

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

# stmp_server={'163':'smtp.163.com','qq':'stmp.qq.com'}
# port_list={'163':25,'qq':465}
class email_send:
    '''
    description:封装了构造邮件及发送邮件的操作
    param {*}
    return {*}
    '''

    def __init__(self, from_addr, password, to_addr, server="smtp.qq.com", port=465) -> None:
        self.from_addr = from_addr
        self.password = password
        self.to_addr = to_addr
        self.server = server
        self.port = port

    def server_start(self):
        self.server = smtplib.SMTP_SSL(host=self.server, port=self.port)
        print(self.server)

    def server_quit(self):
        self.server.quit()

    def _format_addr(self, addr_msg):
        name, addr = parseaddr(addr_msg)
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def send_text_data(self, text, data_type, subject_msg):
        msg = MIMEText(_text=text, _subtype='plain', _charset='utf-8')
        msg['From'] = self._format_addr(self.from_addr)
        msg['To'] = self._format_addr(self.to_addr)
        msg['Subject'] = Header(s=subject_msg, charset='utf-8')
        self.server.login(self.from_addr, self.password)
        self.server.sendmail(self.from_addr, self.to_addr, msg.as_string())


def go(msg='新的邮件代码测试', subject_msg='A new test'):
    # 账号信息
    sender = "141*****@qq.com"		# 发件人
    password = "*******"			# 在QQ邮箱里可打开SMTP服务的密码,非邮箱登录密码
    receivers = ["13******@qq.com"]	# 收件人
    # 邮件文本内容
    try:
        es = email_send(sender, password, receivers)
        es.server_start()
        es.send_text_data(msg, 'plain', subject_msg)
        es.server_quit()
        print('success')
    except:
        print('error')


if __name__ == "__main__":
    go()