小白学习,大佬绕行

目录

背景、设计

思路

邮件发送

完整代码


背景、设计

        最近准备考个软考证,官网上看我所在地区一直没有开始报名,就想写个python脚本定时去获取信息,如果发现我所在地区的报名信息就自己给自己发封邮件。

        代码其实很简单,主要分两个部分,一:匹配网页上的信息,二:发送邮件。匹配网页信息主要使用正则表达式需要用到re包,发送邮件主要用到smtplib和一些辅助包。

思路

打开网站

python email内容加粗 python email html_html

        通过开发者模式或鼠标右键打开查看网页源代码,来匹配你想要信息所在的html语句以及该html使用的编码格式。

python email内容加粗 python email html_python_02

python email内容加粗 python email html_运维开发_03

url = "https://bm.ruankao.org.cn/sign/welcome"              #原始url
page = urllib.request.urlopen(url).read().decode('utf-8')   #读取,此处需要导入urllib.request
pattern = r'<div class="layui-col-md5 col1">(.*?)</div>'    #正则表达式匹配所需数据
content = re.findall(pattern, page, re.S)                   #获取所需数据

.*? 表示任意字符,(.*?) 表示提取符合模式的字符。当要提取的字符前后出现太长其他无专一特性的字符时便可用.*?来代替。

       至此,获取网页信息已经完成,下面是发送邮件模块。

邮件发送

SMTP,例如QQ邮箱发件服务器为smtp.qq.com,收件服务器为IMAP。发邮件只需要通过你邮箱的发件服务器,故你需要知道你使用邮箱的发件服务器地址以及其端口,一般smtp端口为465,imtp端口为993。通过一般性邮件发送,需要开启你的SMTP、IMAP\POP3服务,并获取授权码(不需要你的账号密码)。

smtp = smtplib.SMTP_SSL(mail_server) #mail_server为发件服务器如smtp.qq.com
smtp.connect(mail_server,465)        #连接上发件服务器
smtp.login(mail_sender,mail_code)    #登录,邮箱账号+授权码
smtp.sendmail(mail_sender,mail_receiver,msg.as_string())  #发送邮件信息

授权码以qq邮箱为例,进入POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务设置,选择开启IMAP/SMTP服务,便可以得到你邮箱账户的授权码。

python email内容加粗 python email html_python_04

完整代码

# -*- coding: UTF-8 -*-
import re
import urllib.request
import smtplib
from bs4 import BeautifulSoup
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

def get_data():
    url = "https://bm.ruankao.org.cn/sign/welcome"
    #终端执行pip3 install BeautifulSoup4   BeautifulSoup4为解析网页包
    page = urllib.request.urlopen(url).read().decode('utf-8')
    #soup = BeautifulSoup(page, 'html.parser')                 #  
    #print(soup)                                     #输出信息即为网页源代码,我用来测试用
    pattern = r'<div class="layui-col-md5 col1">(.*?)</div>'
    content = re.findall(pattern, page, re.S)
    #print(len(content))
    for province in content:
        if province == '某省名':                       #匹配到便发送短信
            send_msg()
            break
    #  print(province)

def send_msg():
    mail_server = 'smtp.qq.com'                #邮箱服务器,若服务默认端口不是465需要单独配置
    mail_sender = '1212121211212@qq.com'       #发件人邮箱
    mail_code = 'XXXXXXXXXXXXX'                #授权码
    mail_receiver = ['1221212212212@qq.com','131313131313@qq.com'] #收件人邮箱
    mail_title = '2022上半年XX省软考报名通知'    #邮件名
    mail_content = '''                         
    <meta http-equiv="Content-Type"content="text/html;charset=utf-8">
    <p>您好!软考XX地区已开始报名,请登录:</p>
    <p><a href='https://bm.ruankao.org.cn/sign/welcome'>https://bm.ruankao.org.cn/sign/welcome</a></p>
    '''
    #邮件内容
    msg = MIMEText(mail_content,'html')
    msg["Subject"] = Header(mail_title,'utf-8')
    msg["From"] = mail_sender
    msg["To"] = ','.join(mail_receiver)
    #msg.attach(MIMEText(mail_content,'html'))
    try:
        smtp = smtplib.SMTP_SSL(mail_server) #python3.7修改了此处
        smtp.connect(mail_server,465)        #python3.7修改了此处
        #smtp = smtplib.SMTP_SSL()
        #smtp.connect(mail_server,465)
        smtp.set_debuglevel(1)               #允许调试,0为不允许
        smtp.ehlo(mail_server)               #对服务器say hello
        smtp.login(mail_sender,mail_code)
        smtp.sendmail(mail_sender,mail_receiver,msg.as_string())
        smtp.quit()
        print("发送成功!")
    except smtplib.SMTPException:
        print("发送失败!")

if __name__ == "__main__":
    get_data()

 至于脚本执行,我是在Linux上写了个定时任务来执行这个python文件。

python email内容加粗 python email html_html_05