发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。
smtplib:是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。
email:简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。
举个简单的例子,当你登录邮箱,写好邮件后点击发送,这部分是由 SMTP 接管;而写邮件、添加附件是由 email 模块控制。
在使用脚本发邮件之前,我们需要打开自己邮箱的 SMTP 功能
脚本分为三个步骤:
1.设置好服务器端信息
2.邮件主体信息
3.登录发送
另外在处理文本时,我们需要使用 MIMEText 类。
代码如下
import smtplib from email.mime.text import MIMEText #设置服务器所需信息 #163邮箱服务器地址 mail_host = 'smtp.163.com' #163用户名 mail_user = '192*****82' #密码(部分邮箱为授权码) mail_pass = '7******x' #邮件发送方邮箱地址 sender = 'py*****21@163.com' #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发 receivers = ['19*****82@qq.com'] #设置email信息 #邮件内容设置 message = MIMEText('content','plain','utf-8') #邮件主题 message['Subject'] = 'title' #发送方信息 message['From'] = sender #接受方信息 message['To'] = receivers[0] #登录并发送邮件 try: smtpObj = smtplib.SMTP() #连接到服务器 smtpObj.connect(mail_host,25) #登录到服务器 smtpObj.login(mail_user,mail_pass) #发送 smtpObj.sendmail( sender,receivers,message.as_string()) #退出 smtpObj.quit() print('success') except smtplib.SMTPException as e: print('error',e) #打印错误
我们将上述代码封装成函数
存放在一个新文件命名为mail.py
就可以直接调用了
调用代码
import mail
mail.sendMail('您的程序已经运行完成,请去宝塔面板查看日志结果')
import smtplib from email.mime.text import MIMEText def sendMail(msg): #设置服务器所需信息 #163邮箱服务器地址 mail_host = 'smtp.163.com' #163用户名 mail_user = 'py******21' #密码(部分邮箱为授权码) mail_pass = 'O*****BL' #邮件发送方邮箱地址 sender = 'p*****21@163.com' #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发 receivers = ['19*****82@qq.com'] #设置email信息 #邮件内容设置 message = MIMEText(msg,'plain','utf-8') #邮件主题 message['Subject'] = '程序完成情况' #发送方信息 message['From'] = sender #接受方信息 message['To'] = receivers[0] #登录并发送邮件 try: smtpObj = smtplib.SMTP() #连接到服务器 smtpObj.connect(mail_host,25) #登录到服务器 smtpObj.login(mail_user,mail_pass) #发送 smtpObj.sendmail( sender,receivers,message.as_string()) #退出 smtpObj.quit() print('success') except smtplib.SMTPException as e: print('error',e) #打印错误
宝塔面板-软件商店-搜索-python
根据个人喜好在宝塔面板根目录下新建存放python文件的目录,命名为pythonpart,名称随意
创建完后点击新建一个空白文件。名字设置为requirements.txt。多一个字少一个字母多一个空格都不行
创建完成后选择同样的方式,创建一个hello.py文件,输入如下代码,打印一个hello world
# -*- coding: UTF-8 -*- if __name__ == "__main__": for i in range(100) print("hello world")
项目名称---------: 根据喜好自定义
路径------------: 选择刚刚创建的pythonpart文件夹
Python版本-------: 默认
框架------------: python
启动方式---------: python
启动文件文件夹----: 选择要运行的hello.py文件
端口------------: 输入项目端口,没有端口留空
是否安装模块依赖--: 使用某python库的话勾选
点击“确定”的绿色按钮,就可以实现对python项目的运行。
tip:由于我们的项目运行即停,所以是肯定是提示创建失败的,
因为很短的时间内即可完成项目的运行,只有那些要花费很长时间的项目才会提醒项目创建成功。
但是这些对我们创建项目并没有什么影响。
由于我们创建的hello world项目运行太快,
我们需要去宝塔ssh终端去运行项目,
可以看到我们已经成功打印出来了hello world!
至此我们已经完成了对python项目在云服务器的运行。
比如我想用某python库里面的东西,
我们这时候不是使用pip去Linux环境下安装(当然你非要这样的话),
我们可以先在创建项目的时候,选中是否安装模块依赖,
然后在点击你创建项目的那条里面的“模块”按钮,
输入您要创建的库名字
(我这里安装time库直接输入time,直接点击添加,不用输入版本号,即可完成安装)
安装成功后直接import即可
登录签到
视频观看
5次投币(需消耗5个币)
分享视频(不会发在个人空间动态里)
以上每天经验共65点经验。
获取B站个人Cookie
1、浏览器登入哔哩网站
2、访问 http://api.bilibili.com/x/space/myinfo
3、F12看到cookie的值粘贴即可
# -*- coding: utf-8 -*- # date:2021/12/13 import requests import json import time import random import mail # 填写cookie即可运行 ''' 1、浏览器登入哔哩网站 2、访问 http://api.bilibili.com/x/space/myinfo 3、F12看到cookie的值粘贴即可 ''' cookies = "" coin_operated = 1 # (投币开关,0不投币,1投币) # cookie转字典 def extract_cookies(cookies): global csrf cookies = dict([l.split("=", 1) for l in cookies.split("; ")]) csrf = cookies['bili_jct'] return cookies # 银币数 def getCoin(): cookie = extract_cookies(cookies) url = "http://account.bilibili.com/site/getCoin" r = requests.get(url, cookies=cookie).text j = json.loads(r) money = j['data']['money'] return int(money) # 个人信息 def getInfo(): global uid url = "http://api.bilibili.com/x/space/myinfo" cookie = extract_cookies(cookies) j = requests.get(url, cookies=cookie).json() username = j['data']['name'] uid = j['data']['mid'] level = j['data']['level'] current_exp = j['data']['level_exp']['current_exp'] next_exp = j['data']['level_exp']['next_exp'] sub_exp = int(next_exp) - int(current_exp) if coin_operated: days = int(int(sub_exp) / 65) else: days = int(int(sub_exp) / 15) coin = getCoin() msg = f"欢迎 {username}! 当前等级:" + str(level) + " ,当前经验:" + \ str(current_exp) + ",升级还差 " + str(sub_exp) + \ "经验,还需" + str(days) + "天," + "当前硬币数量:" + str(coin) return current_exp, msg # 推荐动态 def getActiveInfo(): url = "http://api.bilibili.com/x/web-interface/archive/related?aid=" + \ str(7) cookie = extract_cookies(cookies) r = requests.get(url, cookies=cookie).text j = json.loads(r) return j # 推荐动态第二种方式 def getVideo(): random_page = random.randint(0, 167) url = "http://api.bilibili.cn/recommend?page=" + str(random_page) cookie = extract_cookies(cookies) r = requests.get(url, cookies=cookie).text j = json.loads(r) return j # 投币 分享5次 def Task(): coin_num = getCoin() num = 5 if coin_num <= num: num = coin_num coin_count = 0 for i in range(0, 10): j = getVideo() list_len = len(j['list']) random_list = random.randint(1, list_len-1) bvid = j['list'][random_list]['bvid'] aid = j['list'][random_list]['aid'] print(str(i)+' ---- '+str(bvid)+' ---- '+str(aid)) toview(bvid) time.sleep(3) shareVideo(bvid) time.sleep(3) if coin_count < num: coin_code = tocoin(bvid) if coin_code == -99: return if coin_code == 1: coin_count = coin_count+1 if coin_count == num: break print('----------------------') # 观看视频【不会点赞投币】 def toview(bvid): playedTime = random.randint(10, 100) url = "https://api.bilibili.com/x/click-interface/web/heartbeat" data = { 'bvid': bvid, 'played_time': playedTime, 'csrf': csrf } cookie = extract_cookies(cookies) j = requests.post(url, data=data, cookies=cookie).json() code = j['code'] if code == 0: print('看视频成功!') else: print('看视频失败!') # 分享视频 def shareVideo(bvid): url = "https://api.bilibili.com/x/web-interface/share/add" data = { 'bvid': bvid, 'csrf': csrf } cookie = extract_cookies(cookies) # 需要请求头 header = { "Content-Type": "application/x-www-form-urlencoded", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38", } r = requests.post(url, data=data, cookies=cookie, headers=header).text j = json.loads(r) code = j['code'] if code == 0: print('分享成功!') else: print('分享失败!') # 投币函数 def tocoin(bvid): coinNum = getCoin() if coinNum == 0: print('太穷了,硬币不够!') return -99 url = "http://api.bilibili.com/x/web-interface/coin/add" data = { 'bvid': bvid, 'multiply': 1, 'select_like': 1, 'csrf': csrf } cookie = extract_cookies(cookies) r = requests.post(url, data=data, cookies=cookie).text j = json.loads(r) code = j['code'] if code == 0: print(str(bvid) + ' 投币成功!') return 1 else: print(str(bvid) + ' 投币失败!') return 0 # 开启任务运行 def run(): exp1, msg = getInfo() print(msg) Task() exp2, c = getInfo() print(f'任务完成,获得经验{int(exp2) - int(exp1)}') # 云函数使用 def main_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) print("Received context: " + str(context)) run() return "------ end ------" if __name__ == '__main__': run() mail.sendMail('您的程序已经运行完成,请去宝塔面板查看日志结果')
上述代码中加入了刚刚写好的自动发邮件脚本
在程序运行完,就立马发一封邮件提醒我程序跑完了。我们先看一下效果