Python+Linux云主机实现将每日天气资讯定时发送至个人邮箱

代码已经部署在了Linux云主机,亲测有效,需要的朋友们可以稍加修改就可以使用啦

1.获取天气信息

我通过天气网这个平台获取每日天气资讯

网站比较简单没有什么反爬措施

直接上代码

import requests
import re
import time

# 我需要5个城市的每日天气资讯 分别是
# 太原市万柏林区 商洛市商州区 西安市雁塔区 北京市延庆区 宝鸡市渭滨区
url_list = ["https://tianqi.com/wanbolinqu/", 
"https://tianqi.com/shangzhou",
"https://tianqi.com/yantaqu", 
"https://tianqi.com/yanqing", 
"https://tianqi.com/weibin"]

# 定义请求头
header = {
        "user-agent": "Mozilla / 5.0(X11; Linux x86_64) AppleWebKit / 537.36(KHTML, likeGecko) "
                      "Chrome / 77.0.3865.120Safari / 537.36"}

text = """
    现在是北京时间{year}年{month}月{day}日{hour}时{minute}分{second}秒
    今日5个城市的天气状况分别为:\n
    """.format(year=time.localtime().tm_year, month=time.localtime().tm_mon, day=time.localtime().tm_mday,
               hour=time.localtime().tm_hour, minute=time.localtime().tm_min, second=time.localtime().tm_sec)

for url in url_list:
        html = requests.get(url, headers=header, timeout=10)
        data = html.content.decode('utf8')
        
        # 每个城市的名称
        name = re.search('<dd class="name"><h2>(.*?)</h2>.*?</dd>', data)
		
		# 今日份公历和农历的时间
        week = re.search('<dd class="week">(.*?)</dd>', data)
		
		# 今日的天气状况和最低最高气温
        weather = re.search('<p class="now">.*?<span><b>(.*?)</b>(.*?)</span>', data, re.S)

		# 湿度风向紫外线等信息
        shidu = re.search('<dd class="shidu"><b>(.*?)</b><b>(.*?)</b><b>(.*?)</b></dd>', data, re.S)

		# 空气质量和日出日落时间
        kongqi = re.search('<dd class="kongqi"><h5.*?>(.*?)</h5><h6>(.*?)</h6><span>(.*?)<br />(.*?)</span></dd>', data, re.S) 

		string = """
        今天是{week}
        {name}的具体天气状况是\t{weather1}\t{weather2}
        {shidu1}\t{shidu2}\t{shidu3}
        {kongqi1}\t{kongqi2}\t{kongqi3}"\t{kongqi4}\n
        """.format(week=week.group(1), name=name.group(1), weather1=weather.group(1),
                   weather2=weather.group(2), shidu1=shidu.group(1), shidu2=shidu.group(2),
                   shidu3=shidu.group(3), kongqi1=kongqi.group(1), kongqi2=kongqi.group(2),
                   kongqi3=kongqi.group(3), kongqi4=kongqi.group(4))
        text = text+string              

2.使用Python发送邮件

我参考了菜鸟教程 “Python3 SMTP发送邮件”的教程,教程言简意赅,很好理解

以下是具体代码

import smtplib
from email.mime.text import MIMEText

# 发件人邮箱账号
sender = "xxx@qq.com"

# 收件人邮箱(可以同时给多账号发送)  
receiver = "xxx@qq.com, xxx@qq.com, xxx@163.com"

# 邮箱域名,我是用qq邮箱发送邮件的,所以这里填了qq邮箱的域名
Host = "smtp.qq.com"  

# 邮件的主题或者标题 
subject = "{year}-{month}-{day} 太原商洛西安北京宝鸡5城每日天气状况".format\
(year=time.localtime().tm_year, month=time.localtime().tm_mon, day=time.localtime().tm_mday)


# MIMEText三个参数分别是邮件内容 邮件类型 编码方式
txt = "我是邮件的具体内容"
message = MIMEText(txt, _subtype="plain", _charset="utf8")
message['From'] = sender   # 设置邮件发件人
message['To'] = receiver  # 设置邮件收件人
message['Subject'] = subject   # 设置邮件标题

try:
    # Python3.7版本必须使用这个方法设置邮件传输协议证书
    server = smtplib.SMTP_SSL(host=Host) 
    server.connect(host=Host, port=465)

# Python3.6及其以下版本同时可以使用这两种方法设置邮件传输协议证书
    # server = smtplib.SMTP_SSL(Host, 465)  

# 设置发件人和授权码
    server.login(sender, "此处为授权码") 

# 发送邮件
    server.sendmail(from_addr=sender, to_addrs=message['To'].split(','), msg=message.as_string())

# 断开连接  
    server.close()   
    print("邮件发送成功")

except Exception:
    print("邮件发送失败")
    print(Exception)

3.为个人邮箱开通SMTP服务

以QQ邮箱为例

进入到邮箱之后

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
记住生成的授权码

4.贴上完整代码

import requests
import re
import time
import smtplib
from email.mime.text import MIMEText

def get_weather_information():
	# 我需要5个城市的每日天气资讯 分别是
	# 太原市万柏林区 商洛市商州区 西安市雁塔区 北京市延庆区 宝鸡市渭滨区
	url_list = ["https://tianqi.com/wanbolinqu/", 
	"https://tianqi.com/shangzhou",
	"https://tianqi.com/yantaqu", 
	"https://tianqi.com/yanqing", 
	"https://tianqi.com/weibin"]
	
	# 定义请求头
	header = {
	        "user-agent": "Mozilla / 5.0(X11; Linux x86_64) AppleWebKit / 537.36(KHTML, likeGecko) "
	                      "Chrome / 77.0.3865.120Safari / 537.36"}
	
	text = """
	    现在是北京时间{year}年{month}月{day}日{hour}时{minute}分{second}秒
	    今日5个城市的天气状况分别为:\n
	    """.format(year=time.localtime().tm_year, month=time.localtime().tm_mon, day=time.localtime().tm_mday,
	               hour=time.localtime().tm_hour, minute=time.localtime().tm_min, second=time.localtime().tm_sec)
	
	for url in url_list:
	        html = requests.get(url, headers=header, timeout=10)
	        data = html.content.decode('utf8')
	        
	        # 每个城市的名称
	        name = re.search('<dd class="name"><h2>(.*?)</h2>.*?</dd>', data)
			
			# 今日份公历和农历的时间
	        week = re.search('<dd class="week">(.*?)</dd>', data)
			
			# 今日的天气状况和最低最高气温
	        weather = re.search('<p class="now">.*?<span><b>(.*?)</b>(.*?)</span>', data, re.S)
	
			# 湿度风向紫外线等信息
	        shidu = re.search('<dd class="shidu"><b>(.*?)</b><b>(.*?)</b><b>(.*?)</b></dd>', data, re.S)
	
			# 空气质量和日出日落时间
	        kongqi = re.search('<dd class="kongqi"><h5.*?>(.*?)</h5><h6>(.*?)</h6><span>(.*?)<br />(.*?)</span></dd>', data, re.S) 
	
			string = """
	        今天是{week}
	        {name}的具体天气状况是\t{weather1}\t{weather2}
	        {shidu1}\t{shidu2}\t{shidu3}
	        {kongqi1}\t{kongqi2}\t{kongqi3}"\t{kongqi4}\n
	        """.format(week=week.group(1), name=name.group(1), weather1=weather.group(1),
	                   weather2=weather.group(2), shidu1=shidu.group(1), shidu2=shidu.group(2),
	                   shidu3=shidu.group(3), kongqi1=kongqi.group(1), kongqi2=kongqi.group(2),
	                   kongqi3=kongqi.group(3), kongqi4=kongqi.group(4))
	        text = text+string 
	return text


def send_mail(text):
# 发件人邮箱账号
sender = "xxx@qq.com"

# 收件人邮箱(可以同时给多账号发送)  
receiver = "xxx@qq.com, xxx@qq.com, xxx@163.com"

# 邮箱域名,我是用qq邮箱发送邮件的,所以这里填了qq邮箱的域名
Host = "smtp.qq.com"  

# 邮件的主题或者标题 
subject = "{year}-{month}-{day} 太原商洛西安北京宝鸡5城每日天气状况".format\
(year=time.localtime().tm_year, month=time.localtime().tm_mon, day=time.localtime().tm_mday)


# MIMEText三个参数分别是邮件内容 邮件类型 编码方式
message = MIMEText(text, _subtype="plain", _charset="utf8")
message['From'] = sender   # 设置邮件发件人
message['To'] = receiver  # 设置邮件收件人
message['Subject'] = subject   # 设置邮件标题

try:
    # Python3.7版本必须使用这个方法设置邮件传输协议证书
    server = smtplib.SMTP_SSL(host=Host) 
    server.connect(host=Host, port=465)

# Python3.6及其以下版本同时可以使用这两种方法设置邮件传输协议证书
    # server = smtplib.SMTP_SSL(Host, 465)  

# 设置发件人和授权码
    server.login(sender, "此处为授权码") 

# 发送邮件
    server.sendmail(from_addr=sender, to_addrs=message['To'].split(','), msg=message.as_string())

# 断开连接  
    server.close()   
    print("邮件发送成功")

except Exception:
    print("邮件发送失败")
    print(Exception)


if __name__ == '__main__':
	msg = get_weather_information()
	send_mail(msg)             

5.将代码部署到云主机并实现每日定时执行

用以下命令在本机将代码传送到云主机

scp /home/long/auto_send_mail.py  user@ip:/home
# /home/long/auto_send_mail.py为本机的代码路径
# user和ip分别为云主机的用户名和ip地址,之后的/home为在云主机存放路径

设置Python脚本定时执行

nano /etc/crontab

在最后添加
00 07 * * * root python3.6 /home/auto_send_mail.py
# 意思就是每天早上七点以root用户身份执行此Python脚本

6.手机端具体效果

在这里插入图片描述
在这里插入图片描述

7.注意事项

如果没有收到邮件,那极有可能是收件人邮箱将邮件判断为了垃圾邮件,邮件接收者得手动将发送者邮箱账号设置为白名单

设置邮箱白名单的方法可百度

想尝试的朋友赶紧行动起来

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要现定时运行 Python 脚本并发送邮件,可以使用 Python 的第三方库 schedule 和 smtplib。 首先,安装这两个库: ```python pip install schedule ``` ```python pip install secure-smtplib ``` 接下来,编写 Python 脚本,实现定时发送邮件的功能: ```python import schedule import time import smtplib from email.mime.text import MIMEText from email.header import Header # 定义发送邮件的函数 def send_email(): # 邮件内容 mail_content = '这是一封测试邮件' # 发送信息 sender = '发送邮箱' password = '发送邮箱密码' # 接收方信息 receivers = ['接收方邮箱'] # 邮件标题和内容 message = MIMEText(mail_content, 'plain', 'utf-8') message['From'] = Header(sender) message['To'] = Header(','.join(receivers)) message['Subject'] = Header('测试邮件') # 发送邮件 try: smtp_obj = smtplib.SMTP_SSL('smtp.qq.com', 465) smtp_obj.login(sender, password) smtp_obj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功') except smtplib.SMTPException as e: print('邮件发送失败', e) # 定义定时任务 def job(): print('开始发送邮件...') send_email() # 设置定时任务,每隔一定时间执行一次 schedule.every(10).minutes.do(job) # 每隔10分钟执行一次 # schedule.every().hour.do(job) # 每小时执行一次 # schedule.every().day.at('10:30').do(job) # 每天10:30执行一次 # 循环执行定时任务 while True: schedule.run_pending() time.sleep(1) ``` 在上述代码中,`send_email()` 函数定义了如何发送邮件,而 `job()` 函数则定义了定时任务的具体内容。在这里,我们将每隔10分钟执行一次 `job()` 函数,可以根据自己的需要设置定时任务的时间间隔。 最后,在命令行中运行该 Python 脚本即可。注意,为了保证邮件能够正常发送,需要在发送邮箱的设置中开启 SMTP 服务,并且在代码中填写正确的发送邮箱和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值