【Python入门指北】 发邮件与正则表达式

news2024/7/6 19:37:17

文章目录

  • 邮件发送
    • 一、群发邮件
    • 二、@指定用户发邮件
  • 正则表达式
    • 一、预备知识正则
      • 1. 正则介绍
      • 2. 陷阱
      • 3. 特殊的字符
    • 二、 re 模块的方法
      • 1 常用方法
      • 2. 正则分组
  • 总结


在这里插入图片描述


邮件发送

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

#第三方模块 yagmail
#pip3 install yagmail

import yagmail

"""
项目需求
yag =yagmail.SMTP(
            user='自己的邮箱账号',
            password='账号的授权码(不是登录密码)',
            host='smtp.qq.com', #邮局的smtp 地址
            port='端口号',          #邮局的stmp端口25不加密
            smtp_ssl=False)

yag.send(to='收件箱账号',
			subject='邮件主题',
			contents='邮件内容')

"""
email_user = 'm18277724978@163.com'
email_pwd = 'yourpassword'
email_host = 'smtp.163.com'
with open('/root/.emailpwd')  as f:
        pwd = f.read()[:-1]
email_pwd = pwd
email_content = """
如果有一天 我们都发觉

原来什么都可以 我们是否还会 停留在这里

当你的眼睛 眯着笑 当你喝可乐 当你吵

我想对你好 你从来不知道 想你 想你 也能成为嗜好

当你说今天的烦恼 当你说夜深 你睡不着

我想对你说 却害怕都说错 好喜欢你 知不知道

也许空虚 让我想得太多 也许该回到被窝

梦里会相遇 就毫不犹豫 大声的说 我要说

当你的眼睛 眯着笑 当你喝可乐 当你吵

我想对你好 你从来不知道 想你 想你 也能成为嗜好

啦~~~~啦~~~~

我想对你说 却害怕都说错 好喜欢你 知不知道
"""

yag =yagmail.SMTP(
            user=email_user,
            password=email_pwd,
            host=email_host, #邮局的smtp 地址
            port=25,          #邮局的stmp端口25不加密
            smtp_ssl=False)

yag.send(to='2054210430@qq.com',
			subject='等我雨婷',
			contents=email_content)

一、群发邮件

#第三方模块 yagmail
#pip3 install yagmail

import yagmail

"""
项目需求
yag =yagmail.SMTP(
            user='自己的邮箱账号',
            password='账号的授权码(不是登录密码)',
            host='smtp.qq.com', #邮局的smtp 地址
            port='端口号',          #邮局的stmp端口25不加密
            smtp_ssl=False)

yag.send(to='收件箱账号',
			subject='邮件主题',
			contents='邮件内容')

"""
email_user = 'm18277724978@163.com'
email_pwd = 'yourpassword'
email_host = 'smtp.163.com'
with open('/root/.emailpwd')  as f:
        pwd = f.read()[:-1]
email_pwd = pwd
email_content = """
如果有一天 我们都发觉

原来什么都可以 我们是否还会 停留在这里

当你的眼睛 眯着笑 当你喝可乐 当你吵

我想对你好 你从来不知道 想你 想你 也能成为嗜好

当你说今天的烦恼 当你说夜深 你睡不着

我想对你说 却害怕都说错 好喜欢你 知不知道

也许空虚 让我想得太多 也许该回到被窝

梦里会相遇 就毫不犹豫 大声的说 我要说

当你的眼睛 眯着笑 当你喝可乐 当你吵

我想对你好 你从来不知道 想你 想你 也能成为嗜好

啦~~~~啦~~~~

我想对你说 却害怕都说错 好喜欢你 知不知道
"""

yag =yagmail.SMTP(
            user=email_user,
            password=email_pwd,
            host=email_host, #邮局的smtp 地址
            port=465,          #邮局的stmp端口25端口不加密,465加密
            smtp_ssl=True) #进行加密

email_users = ['2054210430@qq.com','guan12319@qq.com']
yag.send(to=email_users,
		subject='晴天',
		contents=email_content,
                attachments='/root/python_code/work001/day001/fat.jpeg')

接收邮件
在这里插入图片描述

在这里插入图片描述
@全体成员

webhook = "https://oapi.dingtalk.com/robot/send?access_token=4e656635905747906a767d4fedac795e027470250c7e2cf9cf00e609af25ae47"

#pip3 install request
import requests

send_contents = "guan:早上好,准备开工!"
content = {
    "msgtype": "text",
    "text": {
        "content": send_contents
    },
    "at": {
        #发送给群里的所有人
        "isAtAll": True
    }
}

headers = {"Content-Type": "application/json;charset=utf-8"}

r = requests.post(url=webhook,json=content,headers=headers)
print(r.content)

在这里插入图片描述
如果出现上面的报错,要检查dns 和 ping一下测网络是否连通

在这里插入图片描述

在这里插入图片描述

二、@指定用户发邮件

webhook = "https://oapi.dingtalk.com/robot/send?access_token=4e656635905747906a767d4fedac795e027470250c7e2cf9cf00e609af25ae47"

#pip3 install request
import requests

send_contents = "guan:早上好,准备开工!"
content = {
    "msgtype": "text",
    "text": {
        "content": send_contents
    },
    "at": {
        #发送给群里的所有人
        #"isAtAll": True
        "atMobiles": [
            #单独@某个人,使用绑定的手机号
            # 多个人,用户用英文逗号隔开
            "18277724978",
            "17877170938",
            "182xxxxxxxxxxx"

        ]
    }
}


headers = {"Content-Type": "application/json;charset=utf-8"}

r = requests.post(url=webhook,json=content,headers=headers)
print(r.content.decode)

正则表达式

一、预备知识正则

1. 正则介绍

Python 中的正则,本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过 re 这个内置模块获得。
正则表达式模式几乎和 shell 中的一样,更接近 grep -P 的效果,因为 Python 中的 re 模块提供的是类似 Perl 语言中的正则表达式。
正则表达式模式会被编译成一系列字节码,然后由用 C 编写的匹配引擎执行。

2. 陷阱

友情提示:
正则表达式语言相对较小且受限制,因此并非所有可能的字符串处理任务都可以使用正则表达式完成。

还有一些任务 可以 用正则表达式完成,但表达式变得非常复杂。 在这些情况下,你最好编写 Python 代码来进行处理;虽然 Python 代码比精心设计的正则表达式慢,但它也可能更容易理解。

3. 特殊的字符

在 Python 中有一些特殊的字符,在正则表达式模式中的作用和 shell 和 grep -P 时候有一些细微的差别

正则特殊字符匹配内容
\w匹配单个字母、数字、汉字(shell中没有)或下划线 类似于 [a-zA-Z0-9_]
\d匹配单个数字 类似于 [0-9]
\s匹配单个任意的空白符,这等价于 [ \t\n\r\f\v]
\S匹配任何非空白字符, [^ \t\n\r\f\v]

二、 re 模块的方法

其实,前面在 shell 中我们已经学习正则,这里我们主要学习的是 Python 中如何使用正则的,就是 re 模块中都有哪些方法。
接下来我们就学习几个常间的方法,更多请移步正则扩展知识完整版

1 常用方法

match() 就看开头有没有

只在整个字符串的起始位置进行匹配

示例字符串

s = "isinstance yangge enumerate www.qfedu.com 1997"

示例演示:

import re
In [4]: r = re.match("is\w+", s)

In [8]: r.group()  # 获取匹配成功的结果
Out[8]: 'isinstance'

search() 只查到第一个匹配的

从整个字符串的开头找到最后,当第一个匹配成功后,就不再继续匹配。

In [9]: r = re.search("a\w+", s)

In [10]: r.group()
Out[10]: 'ance'    

findall() 查到所有

搜索整个字符串,找到所有匹配成功的字符串,比把这些字符串放在一个列表中返回。

In [16]: r = re.findall("a\w+", s)

In [17]: r
Out[17]: ['ance', 'angge', 'ate']

sub() 替换

把匹配成功的字符串,进行替换。

# 语法:
"""
("a\w+",    "100",        s,     2)
匹配规则,替换成的新内容,  被搜索的对象, 有相同的话替换的次数


"""
In [24]: r = re.sub("a\w+", "100", s, 2)
  
In [25]: r
Out[25]: 'isinst100 y100 enumerate www.qfedu.com 1997'

# 模式不匹配时,返回原来的值

split() 分割

awk -F '[d]' 一样效果,以匹配到的字符进行分割,返回分割后的列表

In [26]: s
Out[26]: 'isinstance yangge enumerate www.qfedu.com  1997'

In [27]: r = re.split("a", s, 1)

使用多个界定符分割字符串

>>> line = 'asdf fjdk; afed, fjek,asdf,  foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

2. 正则分组

就是从已经成功匹配的内容中,再去把想要的取出来

# match
In [64]: s
Out[64]: 'isinstance yangge enumerate www.qfedu.com  1997'

In [65]: r = re.match("is(\w+)", s)

In [66]: r.group()
Out[66]: 'isinstance'

In [67]: r.groups()
Out[67]: ('instance',)
    
    
    
# search
# 命名分组
In [87]: r = re.search("is\w+\s(?P<name>y\w+e)", s)  

In [88]: r.group()
Out[88]: 'isinstance yangge'

In [89]: r.groups()
Out[89]: ('yangge',)

In [90]: r.groupdict()
Out[90]: {'name': 'yangge'}

    
# findall

In [98]: s
Out[98]: 'isinstance yangge enumerate www.qfedu.com  1997'

In [99]: r = re.findall("a(\w+)", s)

In [100]: r
Out[100]: ['nce', 'ngge', 'ny', 'te']
  
# 内置模块 re
"""
\w  匹配单个字母、数字、汉子(shell中没有)和下划线,类似于[a-z A-Z 0-9]
\d  [ 0-9 ]
\s  单个任意的空白字符,等价于[\t \n \r \f \v]
\S  当非空白字符

"""
# 内置模块 re
"""
\w  匹配单个字母、数字、汉子(shell中没有)和下划线,类似于[a-z A-Z 0-9]
\d  [ 0-9 ]
\s  单个任意的空白字符,等价于[\t \n \r \f \v]
\S  当非空白字符

"""

import re

#match
#

string = "isinstance yangge enumerate www.qfedu.com 1997"

receive= re.match('is\w+', string)  #匹配以is开头的单词...
print(receive.group())

[root@zabbix_server python_code]# /usr/local/bin/python3 "/root/python_code/work001/day001/ 正则表达式.py"
isinstance


在这里插入图片描述

#search
#从开头到结尾,匹配到第一个就结束

r = re.search('a\w+',string) #在一串字符串中,匹配到一个单词中带字母a的就返回,后面的就不进行匹配了
if r:
	print(r.group())

在这里插入图片描述

if r:
    print(r.group())

li = re.findall('a\w+',string) #匹配一串字符串中所有单词中带字母a的并返回
print(li)

在这里插入图片描述

#sub 替换

#语法
"""
sub("a\w+", "100","string", 2)
匹配规则,替换成的新内容, 被搜索的对象,有相同的话替换的次数

"""
s1 = re.sub('a\w+','999',string)
print(s)
print(s1)


在这里插入图片描述

# split 相当于awk -F'[,]'

string = "isinstance yangge enumerate www.qfedu.com 1997"
l2 = re.split('a',string)#在string字符串中以字母a为分隔符
print(l2)

在这里插入图片描述

line = 'asdf fjdk; afed, fjek,asdf,  foo'
l3 = re.split('[;,\s]\s*',line)
print(l3)

在这里插入图片描述

斗图地址:https://www.pkdoutu.com/
在这里插入图片描述
获取图片的html代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

用 requests 爬取单张图片

"""
<img referrerpolicy="no-referrer" src="https://img.pkdoutu.com/production/uploads/image/2021/09/04/20210904738635_JuCdnK.jpg" data-original="https://img.pkdoutu.com/production/uploads/image/2021/09/04/20210904738635_JuCdnK.jpg" alt="手机" class="img-responsive lazy image_dta loaded" data-backup="https://img.pkdoutu.com/production/uploads/image/2021/09/04/20210904738635_JuCdnK.jpg" data-was-processed="true">
"""

import requests,io

res = requests.get('https://img.pkdoutu.com/production/uploads/image/2021/09/04/20210904738635_JuCdnK.jpg')
with io.open('手机.jpg','wb')  as f:
    f.write(res.content)

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

获取多图

import io,re
import requests

base_url = "https://www.pkdoutu.com/photo/list/"

res = requests.get(url=base_url)

html = res.content.decode()

urls = []
for line in html.splitlines():
    if 'data-original' in line:
        re.search(r'.*data-original="(.*)".*',line)
        if r:    
            url = r.groups()
            url = url[0]
            urls.append(url)

for index,img_url in enumerate(urls,1):
    res = requests.get(url=img_url)
    file_name = f'picture{index}.jpg' 
    with io.open(file_name,'wb') as f:
        f.write(res.content)

enumerate用法介绍

>>> li  = [1,2,3,4]
>>> for i in li:
...     print(i)
... 
1
2
3
4
>>> for i in enumerate(li):
...     print(i)
... 
(0, 1)				#返回一个元组,第一列为序号默认从0开始,第二例为对应地值
(1, 2)
(2, 3)
(3, 4)
>>> for index,item in enumerate(li):
...     print(index,item)
... 
0 1   #去掉括号
1 2
2 3
3 4
>>> for index,item in enumerate(li,1):
...     print(index,item)
... 
1 1   #修改默认值为1
2 2
3 3
4 4
>>> 


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis Plus实现动态字段排序

利用周末时间&#xff0c;对已有的项目进行了升级&#xff0c;原来使用的是tkmybatis&#xff0c;改为mybatis plus。但是由于修改了返回数据的格式&#xff0c;前端页面字段排序失效了&#xff0c;需要刷新表格才会排序。页面效果如下 easyui的数据表格datagrid支持多字段排序…

【仿牛客网笔记】Spring Boot实践,开发社区登录模块-账号设置,检查登录

首先访问账号设置的页面。 新建一个Controller,用过RequestMapping生成访问路径 上传头像 首先打开配置文件&#xff0c;配置一下将文件配置到哪里。 直接在Controller存了&#xff0c; 更新的时候掉Map&#xff0c;参数为id和路径。 注入日志对象后&#xff0c;通过Val…

SpringBoot项目启动执行任务的几种方式

经过整理后得到以下几种常用方式&#xff0c;供大家参考。 1. 使用过滤器 init() &#xff1a;该方法在tomcat容器启动初始化过滤器时被调用&#xff0c;它在 Filter 的整个生命周期只会被调用一次。可以在这个方法中补充想要执行的内容。 Component public class MyFilter …

CTF竞赛网络安全大赛(网鼎杯 )Web|sql注入java反序列化

CTF竞赛网络安全大赛题目考点 sql注入 java反序列化 网鼎杯解题思路 题目一打开是这样的界面 下载题目的附件,并用jd-gui.exe打开 核心代码如下 Test代码 `` package 部分class;import cn.abc.common.bean.ResponseCode; import cn.abc.common.bean.ResponseResult; impor…

持续交付中流水线构建完成后就大功告成了吗?别忘了质量保障

上期文章我结合自己的实践经验&#xff0c;介绍了持续交付中流水线模式的软件构建&#xff0c;以及在构建过程中的3个关键问题。我们可以看出&#xff0c;流水线的软件构建过程相对精简、独立&#xff0c;只做编译 和打包两个动作。 但需要明确的是&#xff0c;在持续交付过程…

网课查题接口使用方法

网课查题接口使用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

Hadoop面试题汇总-20221031

Hadoop面试题汇总 HDFS部分 1、请描述HDFS的写流程。 答&#xff1a; 首先由客户端向 NameNode 发起文件上传请求&#xff0c;NameNode 检查文件要上传的目录&#xff0c;并鉴权。如果上传用户对此目录有权限&#xff0c;则允许客户端进行上传操作。客户端接收到允许指令后&…

本科毕业论文内容必须有国内外文献综述吗?

不知不觉间整个暑假变过去了&#xff0c;现在大部分的大学生都已经开学了。2023届毕业的学生现在也开始借鉴毕业论文的选题工作。但是无论是现在正在选题的大四的同学们还是还在上大一大&#xff0c;二大三的同学们都对毕业论文这4个字有着天生的恐惧感。因为对于大多数人来说&…

阿里为何禁止在对象中使用基本数据类型

大家好&#xff0c;我是一航&#xff01; 前两天&#xff0c;因为一个接口的参数问题&#xff0c;和一位前端工程师产生了一些分歧&#xff0c;需求很简单&#xff1a; 根据一个数值类型&#xff08;type 取值范围1&#xff0c;2&#xff0c;3&#xff09;来查询数据&#xff…

HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看

这是程序员表白系列中的100款网站表白之一&#xff0c;旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站&#xff0c;可以任意修改和使用&#xff0c;很多人会希望向心爱的男孩女孩告白&#xff0c;生性腼腆的人即使那个TA站在眼前都不敢向前表白…

pandas 基本数据

目录 1. pandas 简介 2. pandas 基本数据结构 2.1 Series 类型 2.1.1 索引-数据的行标签 2.1.2 值 2.1.3 切片 2.1.4 索引赋值 2.2 DataFrame 类型 1. pandas 简介 一般导入的形式&#xff1a;import pandas as pd 2. pandas 基本数据结构 python 的数据结构&#xff1a…

python爬虫之Scrapy框架,基本介绍使用以及用框架下载图片案例

一、Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据&#xff0c;只需要实现少量的代码&#xff0c;就能够快速的抓取。 Scrapy使用了Twisted异步网络框架来处理网络通信&#xf…

Servlet篇 —— 我的第一个Servlet程序

☕导航小助手☕ &#x1f35a;写在前面 &#x1f35c;一、Maven的介绍 &#x1f371;​二、第一个Servlet的创建 &#x1f354;&#x1f354;2.1 创建项目 &#x1f969;&#x1f969;​2.2 引入依赖 &#x1f9aa;&#x1f9aa;​2.3 创建目录 &#x1f363;&#x1f363;2.4…

没想到GoFrame的gcache天然支持缓存淘汰策略

gcache提供统一的缓存管理模块&#xff0c;提供了开发者可自定义灵活接入的缓存适配接口&#xff0c;并默认提供了高速内存缓存适配实现。 先说结论 这篇文章通过结合商业项目的使用场景&#xff0c;为大家介绍了gcache的基本使用、缓存控制以及淘汰策略。 使用gcache做缓存处…

3分钟,快速上手Postman接口测试

Postman是一个用于调试HTTP请求的工具&#xff0c;它提供了友好的界面帮助分析、构造HTTP请求&#xff0c;并分析响应数据。实际工作中&#xff0c;开发和测试基本上都有使用Postman来进行接口调试工作。有一些其他流程的工具&#xff0c;也是模仿的Postman的风格进行接口测试工…

推荐 4 个开源工具

Hi&#xff0c;艾瑞巴蒂&#xff0c;晚上好&#xff01;今天推荐 4 个登上 GitHub 热搜的开源项目&#xff0c;它们分别是&#xff1a;1. 炫酷的 UI 工具&#xff1a;glslViewer2. Textual3. ToolJet&#xff1a;开源的低代码开发框架4. Linux 命令大全搜索工具01炫酷的 UI 工…

程序人生:去了字节跳动,才知道年薪40W的测试有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…

vue3项目的创建,vite+vue3+ts(3)- router

vue3 有三种写法&#xff1a; 1.compostion API &#xff1a; 还是按照vue2.0写法 2.组合式API: 3. 组合式API 语法糖&#xff08;setup), 语法简洁&#xff08;推荐使用这个&#xff09; 写法&#xff1a; 4. 在.eslintrc.cjs 或者 .eslintrc.js中配置代码&#xff0c;是这个…

聊聊计算机中的寄存器

文章目录前言数据寄存器(DR)地址寄存器(AR)程序状态寄存器(PSW)累加寄存器(AC)乘商寄存器(MQ)程序计数器(PC)指令寄存器(IR)MAR、MDR小结作者&#xff1a;小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 前…

国内第一篇讲解减少卡顿的代码级详细文章

原文链接&#xff1a;原文链接 系统网站应用出现过卡顿&#xff0c;但却不知道如何优化。国内第一篇讲如何减少卡顿的代码级别详细文章&#xff0c;也是性能优化系列文章中的一篇&#xff0c;欢迎点赞、关注&#xff0c;也欢迎对其中的内容进行评论。 经常听人说&#xff0c;“…