Day29笔记-Python操作pdfPython发送邮件

一、Python操作PDF【了解】

1.pdf 简介

PDF是Portable Document Format的缩写,这类文件通常使用.pdf作为其扩展名。在日常开发工作中,最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。

在Python中,可以使用名为PyPDF2的三方库来读取PDF文件,可以使用下面的命令来安装它。

pip install PyPDF2==2.3.1      # 安装指定版本
pip install PyPDF2          # 安装最新版本
2.从PDF中提取文本和加密PDF文件

PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为Python字符串。

使用PyPDF2中的PdfFileWriterPdfWriter对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。

# 注意:安装:pypdf2     导入:PyPDF2
import PyPDF2
​
# 1.读取pdf文件中的文本内容
# a.获取reader对象
reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
# b.获取指定页的字典
print(reader.pages)   # 列表,其中的元素是字典
page = reader.pages[0]
print(page)
# c.获取指定页的文本内容
# 废弃的函数
# text = page.extractText()
# print(text)
# 更新之后的函数
text = page.extract_text()    # *****
print(text)
'''
PyPDF2.errors.DeprecationError: extractText is deprecated废弃 and was removed in PyPDF2 3.0.0. Use extract_text instead.
'''
​
# 2.加密pdf文件
# a.创建writer对象
writer = PyPDF2.PdfWriter()
# b.获取已知文件中的每一页,添加到新的文件对象中去
for i in range(len(reader.pages)):page = reader.pages[i]writer.add_page(page)
# c.设置加密
writer.encrypt('abc123')    # *******
​
# d.保存文件
with open(r'data/XGBoost-加密.pdf','wb') as f:writer.write(f)   # 注意和f.write()区别,f.write()只能传参字符串
3.旋转和创建空白pdf文件

可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwiserotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的add_blank_page方法可以添加一个新的空白页

import  PyPDF2
​
# 1.旋转
# a.创建reader和writer对象
reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
writer = PyPDF2.PdfWriter()
​
# b.旋转
# 需求1:将第0页顺时针旋转180
# page_0 = reader.pages[0]
# # page_0.rotate(angle),angle为正数:顺时针旋转   angle为负数:逆时针旋转
# page_0.rotate(-90)
# writer.add_page(page_0)
​
# 需求2:批量旋转
for i in range(len(reader.pages)):page = reader.pages[i]if i % 2 == 0:page.rotate(90)     # ******else:page.rotate(-90)writer.add_page(page)
​
# c.添加空白pdf
writer.add_blank_page()
​
# 注意:如果打开新生成的文件,报错文件损坏,则可能是writer是空的
with open(r'data/XGBoost-旋转.pdf','wb') as f:writer.write(f)
​
4.批量添加水印【掌握】

上面提到的PageObject对象还有一个名为mergePage的方法,可以两个PDF页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的PDF文件,然后将包含水印的PageObject读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到PageObject对象,然后通过mergePage方法实现水印页和原始页的合并

import PyPDF2
​
# 1.创建reader和writer对象
src_reader = PyPDF2.PdfReader(r'data/XGBoost.pdf')
water_reader = PyPDF2.PdfReader(r'data/watermark.pdf')
writer = PyPDF2.PdfWriter()
​
# 2.遍历已知文件的每一页对象,和水印页进行合并,最终将合并之后的结果添加到writer中
water_page = water_reader.pages[0]  # 获取水印页对象
for i in range(len(src_reader.pages)):src_page = src_reader.pages[i]  # 获取原文件每一页的对象# 合并# a.merge_page(b):将b合并到a上src_page.merge_page(water_page)   # *****# 将合并之后的对象添加给writerwriter.add_page(src_page)
​
with open(r'data/XGBoost-添加水印.pdf','wb') as f:writer.write(f)

二、发送邮件【重要】

1.概念

SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负 责发送邮件。

2.邮件服务器设置

1.设置发送方的qq 邮箱

  • 选取邮箱设置

  • 开启smtp协议

  • 发送短信获取授权码

  • 获取qq邮箱授权码

2.设置发送方163 邮箱

  • 选取邮箱设置

  • 开启smtp协议

  • 打开网易邮箱大师,扫码发送短信获取授权码

  • 获取qq邮箱授权码

3.发送邮件流程
  1. 登录邮箱

     import smtplib 
    1. 连接邮箱服务器连接对象 = smtplip.SMTP_SSL(服务器地址, 邮箱服务端口)- 服务器地址:smtp.163.com(163邮箱)、smtp.qq.com(qq邮箱) - 邮箱服务端口:465
    2. 登录邮箱连接对象.login(邮箱账号, 授权码)
  2. 准备数据

    数据指的需要发送的内容。邮件内容的构建需要涉及到另外一个库email,它可以用来构建邮件主题以及各种形式的邮件内容,包括文字内容、图片内容、html内容、附件等
    ​
    from email.mime.multipart
    import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
    1. 创建邮件对象邮件对象 = MIMEMultipart()
    2. 设置邮件主题主题对象 = Header(邮件标题, 编码方式).encode()邮件对象['Subject'] = 主题对象
    3.设置邮件发送者邮件对象['From'] = '用户名 <用户名>' 4.设置邮件接受者邮件对象['To'] = '收件人1;收件人2;收件人3...' 5. 添加文文字内容文字内容对象 = MIMEText(内容, 类型, 编码方式) - 内容:就是文字符串串- 类型:plain(简单的文字内容)、html(超文本)邮件对象.attach(文字对象)
  3. 发送邮件

    1.连接对象.sendmail(发件人, 收件人, 邮件对象.as_string()) 
    2.连接对象.quit()
4.实现
4.1发送文本

注意:有时候会涉及到发送 html邮件,html格式的邮件本质还是文本格式的邮件,所有文件的构建方式和普通文本文件的构建方式差不多:

from email.mime.text import MIMEText
文本对象 = MIMEText(内容字符串, 'html', 编码方式) 
邮件对象.attach(文本对象)
'''
获取发送方邮箱的授权码:qq授权码:qzoepkfnqecxhddc163授权码:HRHVSCXKGSVWYRKG
​
发送方的SMTP服务器:smtp.163.comsmtp.qq.comsmtp.126.com
'''
​
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEText('今天星期四,天气很好~~~~')# 主题data['Subject'] = '通过Python发送纯文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.2发送html
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)# 正文:html文本html_str = '''<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>html邮件正文内容</h1>
<ol><li>教学部</li><li>行政部</li><li>财务部</li><li>运营部</li>
</ol>
<table width="500" border="1" cellspacing="0"><tr align="center"><td>姓名</td><td>年龄</td><td>性别</td><td>地址</td></tr><tr align="center"><td>张明</td><td>10</td><td>male</td><td>上海</td></tr><tr align="center"><td>小王</td><td>11</td><td>female</td><td>北京</td></tr>
</table>
</body>
</html>'''text = MIMEText(html_str,'html','utf-8')   # utf-8是文本内容的编码格式data.attach(text)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.3发送图片
from email.mime.image import MIMEImage
图片对象 = MIMEImage(图片二进制数据)
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
from email.mime.image import MIMEImage   # 图片
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)
​# 正文内容:图片with open(r'data/logo.png','rb') as f:img_data = f.read()# 构建图片对象img = MIMEImage(img_data)img.add_header('Content-ID','testimg')html_str = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>图片邮件内容</h1>
<p><img src="cid:testimg">
</p>
</body>
</html>"""text = MIMEText(html_str, 'html', 'utf-8')# 附加文本data.attach(text)# 附加图片data.attach(img)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件
4.4发送文件附件
from email.mime.text import MIMEText
文件对象 = MIMEText(文件二进制数据, 'base64', 编码方式) 
文件对象["Content-Disposition"] = 'attachment; filename="文件名"' 
邮件对象.attach(文件对象)
# 需求:发送方:163邮箱  接受方:qq,同学的qq,163
# 一、导入模块
import  smtplib   # 发送邮件
from email.mime.text import MIMEText    # emial:构建邮件      MIMEText:文本对象
from email.mime.multipart import MIMEMultipart   # 构建多个内容
​
# 二、封装函数:
# 发送方账号
sender_account = '18501970795@163.com'
# 接收方账号
recivers_acount = ['1490980468@qq.com','2440311490@qq.com']
​
# a.构建邮件
def form_email():# 创建MIMEText对象data = MIMEMultipart()# 主题data['Subject'] = '通过Python发送html文本文件'# 发送方data["From"] = sender_account# 接收方data["To"] = ';'.join(recivers_acount)
​# 附件with open(r'data/致橡树.txt','r',encoding='gbk') as f:file_data = f.read()# 构建文本对象text = MIMEText(file_data, 'base64', 'gbk')  # gbk是文件的编码格式# 将文本对象设置为附件text["Content-Disposition"] = 'attachment; filename="lianxi.txt"'# 附加文本data.attach(text)return data
​
# b.发送邮件
def send_email():data = form_email()
​# smtp服务器mail_host = 'smtp.163.com'# 创建连接对象smtp_obj = smtplib.SMTP_SSL(mail_host,465)# 登录发送方的邮箱账号,需要给定授权码,注意:不是邮箱的登录密码sender_allow_pwd  = 'HRHVSCXKGSVWYRKG'smtp_obj.login(sender_account,sender_allow_pwd)print('邮箱登录成功~~~~~~')# 发送邮件smtp_obj.sendmail(sender_account,recivers_acount,data.as_string())# 退出smtp_obj.quit()print('邮件发送成功~~~~~~')
​
if __name__ == '__main__':send_email()
​# 注意:运行该程序之前,可以先关闭防火墙,杀毒软件 

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

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

相关文章

【中国剩余定理例题】

一个整数除以3余2、除以5余3、除以7余2&#xff0c;求这个整数&#xff1f;答案&#xff1a;23 构造逆元方程 ax np 1 获得逆元 x 求权重和 求余和正数处理 代码 #include <bits/stdc.h> using namespace std; typedef long long LL; LL ex_gcd(LL a, LL b, LL &a…

网安面试会问到的:http的长连接和短连接

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

iOS开发工程师面试

iOS开发工程师面试题可以涵盖多个方面,包括但不限于iOS开发的基础知识、高级概念、性能优化、架构设计、最新技术等。 1. 基础知识 1.1 请解释iOS中的Xcode是什么,以及它在开发中的作用和功能有哪些? Xcode是用于iOS和macOS等苹果平台开发的集成开发环境(IDE),提供了代…

华为HarmonyOS地图服务 4 - 通过“地图相机“控制地图的可见区域

场景介绍 华为地图的移动是通过模拟相机移动的方式实现的&#xff0c;您可以通过改变相机位置&#xff0c;来控制地图的可见区域&#xff0c;效果如图所示。 本章节将向您介绍相机的各个属性与含义&#xff0c;并移动相机。 相机移动前 …

java 后端数据权限解读

一、代码 package com.dkd.framework.aspectj;import com.dkd.common.annotation.DataScope; import com.dkd.common.core.domain.BaseEntity; import com.dkd.common.core.domain.entity.SysRole; import com.dkd.common.core.domain.entity.SysUser; import com.dkd.common.…

开源PHP导航网源码/精美简约网址导航收录网站/QQ技术导航程序

源码简介&#xff1a; 一款给力的开源PHP导航网源码&#xff0c;它不仅外观精美简约&#xff0c;还是个网址导航收录网站/QQ技术导航程序哦&#xff01; 在信息爆炸的时代&#xff0c;找网页就像大海捞针一样难。但是有了像PHP 导航网这样的神器&#xff0c;一切都变得简单了…

One API本地开发环境搭建

One API本地开发环境搭建 简介 摘要 &#xff1a; 本文介绍如何在本地搭建 One API 开发环境&#xff0c;包括安装 Go 语言和 GoLand IDE&#xff0c;以及如何新建项目和配置数据库信息。通过简明的步骤说明&#xff0c;帮助开发者快速完成基本的开发环境配置&#xff0c;方…

搜维尔科技:SenseGlove DK1触觉反馈手套,远程操作机器人任务,保证你工作时的安全

SenseGlove DK1触觉反馈手套&#xff0c;实现远程操作机器人 搜维尔科技&#xff1a;SenseGlove DK1触觉反馈手套&#xff0c;远程操作机器人任务&#xff0c;保证你工作时的安全

Vue3 + ts + Vite 不同屏适配:px 转 vw

1. 下载插件 npm i postcss-px-to-viewport autoprefixer amfe-flexible --save-dev 2. 配置 &#xff08;1&#xff09;在 main.ts 导入依赖 import amfe-flexible/index.js&#xff08;2&#xff09;在项目根目录下编写配置文件 postcss.config.cjs module.exports {plu…

STM32与51单片机的区别:是否应该直接学习STM32?

STM32与51单片机的区别&#xff1a;是否应该直接学习STM32&#xff1f; 在单片机的世界里&#xff0c;STM32和51单片机都是非常重要的角色。对于初学者来说&#xff0c;是否可以直接跳过51单片机&#xff0c;直接学习STM32&#xff0c;这个问题一直存在争议。让我们深入探讨这…

AndroidManifest.xml 文件中的 package 属性不再是强制要求定义

在 Android 的较新版本中&#xff0c;AndroidManifest.xml 文件中的 package 属性不再是强制要求定义应用程序包名的位置&#xff0c;而是通过 build.gradle 文件中的 namespace 属性来设置包名。这种更改的主要目的是更好地将应用程序包名和代码包结构分离&#xff0c;同时简化…

Vue:默认插槽

目录 一.性质 1.内容分发 2.无名称标识 3.作用域 4.使用方式 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 一.性质 1.内容分发 默认插槽允许组件的使用者定义一些内容&#xff0c;这些内容会被插入到组件模板中的特定位置。这有助于实…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决&#xff1a; 响应乱码问题 向客户端响应数据&#xff1a; package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

【HTTP】方法(method)以及 GET 和 POST 的区别

文章目录 方法&#xff08;method&#xff09;登录上传GET 和 POST 有什么区别&#xff08;面试&#xff09;区别不准确的说法 方法&#xff08;method&#xff09; 首行中的第一部分。首行是由方法、URL 和版本号组成 方法描述了这次请求想干什么&#xff0c;最主要的是&…

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行

1. Unity3D介绍 Unity3D是虚拟现实行业中&#xff0c;使用率较高的一款软件。 它有着强大的功能&#xff0c;是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…

[Redis][事务]详细讲解

目录 0.什么是事务&#xff1f;1.Redis 事务本质2.Redis 事务意义3.事务操作1.MULTI2.EXEC3.DISCARD4.WATCH5.UNWATCH 0.什么是事务&#xff1f; Redis的事务和MySQL的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行Redis事务和M…

苹果macOS 15.0 Sequoia正式版发布:iPhone应用镜像玩、手机消息电脑知

9月17日苹果向 Mac 电脑用户推送了 macOS 15 更新&#xff08;内部版本号&#xff1a;24A335&#xff09;&#xff0c;除了引入数个 iOS 18 的新功能外&#xff0c;macOS 15 Sequoia 还带来了全新的 Continuity 功能 ——iPhone 镜像。 iPhone 镜像功能可以让用户直接在 Mac 上…

Ubuntu 安装和使用 Fcitx 中文输入法;截图软件flameshot

一、Ubuntu 安装和使用 Fcitx 中文输入法 在 Ubuntu 上安装和使用 Fcitx 输入法框架是一个常见的选择&#xff0c;特别是对于需要中文输入的用户。以下是详细的步骤来安装和配置 Fcitx 输入法&#xff1a; 1. 安装 Fcitx 和相关输入法 首先&#xff0c;更新你的包列表并安装…

单词搜索问题(涉及递归等)

目录 一题目&#xff1a; 二思路解释&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; newcode题目链接&#xff1a; 单词搜索_牛客题霸_牛客网 二思路解释&#xff1a; 思路&#xff1a;个人理解是找到word中的第一个元素&#xff0c;然后去递归的上下左右查找&am…

HTTP常见状态码 HTTP的逐步发展(通俗易懂版)

HTTP常见状态码 HTTP 状态码是服务器返回的响应结果的一个数字标志&#xff0c;用于告诉客户端&#xff08;例如浏览器&#xff09;请求的处理情况。为了方便记忆&#xff0c;我们可以简单地分成几类并用通俗的方式来理解&#xff1a; 1. 2xx 成功类&#xff1a;请求成功&…