- 这个网上已经有不少代码了,但是为什么要发这篇呢?网上一般都是自建stmp,或者使用的是不带ssl的stmp服务器,这里讨论的是使用腾讯邮箱提供的stmp服务,腾讯的stmp都是有ssl的,需要将模板代码改一些小地方
- 首先,需要一个提供stmp的邮箱,比如qq邮箱,准备好账号密码,检查并开启stmp功能,记住stmp的端口(腾讯一般都是465)
发送邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import sys
import time
#设置服务器,在腾讯邮箱设置中查看
mail_host="smtp.exmail.qq.com"
#你的邮箱名
mail_user="email@drinkflower.asia"
#你的qq密码
mail_pass=""
#收件人显示的发件人
sender = 'email@drinkflower.asia'
# 接收邮件的邮箱名,要群发的话多个邮箱之间加上;
receivers = ['email@drinkflower.asia']
#你要发的内容
txt=""
message = MIMEText(txt, 'plain', 'utf-8')
#邮件中显示的发件人,<>中的内容如果和上面的sender不一样,收件人收件会得到警告
message['From'] = Header("drinkflower<email@drinkflower.asia>", 'utf-8')
#收件人,没试过设置的和上面receivers不一样会怎么样
message['To'] = Header("email@drinkflower.asia", 'utf-8')
#邮件标题
subject = '来自drinkflower的通知'
message['Subject'] = Header(subject, 'utf-8')
#465是stmp邮件服务器开放的端口,qq邮箱可以在设置中查看
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
拓展应用
- 看到这里你应该已经发现问题了,写一个python程序来发邮件属实是吃饱了的行为,功能少而且还不安全,下面将会给一种合理的应用方式.
pyinstaller
- pyinstaller可以将python脚本和它调用的库打包成一个exe或者打包成一个带有一堆运行库的和可执行exe的文件夹,无论是前者还是后者,都可以使exe运行在完全没有python环境的电脑上
- 安装
pip install pyinstaller
pyinstaller a.py
这将生成一个文件夹,里面有可执行exe和其他环境所需文件
pyinstaller -F a.py
这将生成一个exe文件,所有的资源文件都被打包进了这个exe,在exe执行时会被临时释放出来
python接收参数
- 许多程序,可以在命令行执行时传入参数,比如python程序,可以接收变量来传入文件名,python a.py,就将a.py这个文件名传入python.exe处理
- python实现命令行传参也十分简单,需要导入sys库
import sys
print(sys.argv[1])
- 通过上面的pyinstaller将.py脚本编译成exe后,在命令行运行并传入参数喵喵,可以打印喵喵到屏幕
.\a.exe miaomiao
输出:miaomiao
- 如果有多个参数,在程序中可以以sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[x]依次接收下去,而sys.argv[0]表示的是程序本身的路径
实际使用-网站更新监控
- 我还不会爬虫,比如beautifulsoap那些还用不来,但是request库还是可以用的
- 下面获取了一个网页所有代码的长度
import urllib.request
def getHtml(url):
html = urllib.request.urlopen(url).read()
return len(html)
url = "https://xxx.xxx"
len = getHtml(url)
file_object = open("record.txt",'r') #创建一个文件对象,也是一个可迭代对象
length = file_object.read() #结果为str类型
file_object.close()
- 比较一下是否有变化,如果有变化就发送邮件到自己的邮箱来做提醒,然后将本次的网页长度覆盖写入记录文件
if len!=length:
sendmessage() #把上面的发送邮件的代码写到函数里面这里直接调用
a=open('record.txt', 'w')
a.write(len)
a.close()
- 这样就实现了如果一个网页的长度发生了变化(说明网页新增或者删除了内容),自己的邮箱就会收到文件提醒(经过测试,自己的邮箱时可以发送给自己邮箱的,所以不需要准备两个邮箱)
- 下面时完整的代码
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import sys
import time
import urllib.request
def sendmessage():
#设置服务器,在腾讯邮箱设置中查看
mail_host="smtp.exmail.qq.com"
#你的邮箱名
mail_user="email@drinkflower.asia"
#你的qq密码
mail_pass=""
#收件人显示的发件人
sender = 'email@drinkflower.asia'
# 接收邮件的邮箱名,要群发的话多个邮箱之间加上;
receivers = ['email@drinkflower.asia']
#你要发的内容
txt="您监控的网站更新辣"
message = MIMEText(txt, 'plain', 'utf-8')
#邮件中显示的发件人,<>中的内容如果和上面的sender不一样,收件人收件会得到警告
message['From'] = Header("drinkflower<email@drinkflower.asia>", 'utf-8')
#收件人,没试过设置的和上面receivers不一样会怎么样
message['To'] = Header("email@drinkflower.asia", 'utf-8')
#邮件标题
subject = '来自drinkflower的通知'
message['Subject'] = Header(subject, 'utf-8')
#465是stmp邮件服务器开放的端口,qq邮箱可以在设置中查看
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
def getHtml(url):
html = urllib.request.urlopen(url).read()
return len(html)
url = "https://xxx.xxx"
len = getHtml(url)
file_object = open("record.txt",'r') #创建一个文件对象,也是一个可迭代对象
length = file_object.read() #结果为str类型
file_object.close()
if len!=length:
sendmessage() #把上面的发送邮件的代码写到函数里面这里直接调用
a=open('record.txt', 'w')
a.write(len)
a.close()