PYTHON生成EXE与发送邮件

发布于 2023-01-20  298 次阅读


  • 这个网上已经有不少代码了,但是为什么要发这篇呢?网上一般都是自建stmp,或者使用的是不带ssl的stmp服务器,这里讨论的是使用腾讯邮箱提供的stmp服务,腾讯的stmp都是有ssl的,需要将模板代码改一些小地方
  • 首先,需要一个提供stmp的邮箱,比如qq邮箱,准备好账号密码,检查并开启stmp功能,记住stmp的端口(腾讯一般都是465)

img

发送邮件

  • 直接贴代码吧
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)
  • 读取长度.txt的内容
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()
届ける言葉を今は育ててる
最后更新于 2024-02-07