办公自动化 ----利用python发邮件

办公自动化 ---->利用python发邮件

加载工作簿:load_workbook

import openpyxl
workbook = openpyxl.load_workbook('resources/阿里巴巴2020年股票数据.xlsx')

获取工作表

1)只有一个工作表的时候
sheet = workbook.active
2)打印所有的工作簿
for sheet in workbook.worksheets:
    print(sheet.title)
3)拿第一个工作表
sheet = workbook.worksheets[0]

获取工作表的属性

sheet = workbook['Sheet1']  # type.Worksheet
# 代码后面的类型注释可以让PyCharm在后面的代码中为sheet对象提示属性和方法
print(sheet.max_row, sheet.max_column)
print(sheet.dimension)

操作单元格

cell = sheet['E5']  # type:Cell
cell = sheet.cell(5, 5)
print(cell.value)   # 获取单元格的值

# 给单元格重新赋值
# 法1
cell.value = 200
# 法2
sheet.cell(5, 5, 300)   # 将第5行第5列的值改变

循环遍历所有单元格

for row in range(2, sheet.max_row+1):
    for col in range(1, sheet.max_column+1):
        value = sheet.cell(row, col).value
        if isinstance(value, float):
            print(f'{value:.2f}', end='\t')
        elif isinstance(value, int):
            print(f'{value:>10.2f}', end='\t')
        elif type(value) == datetime:
            print(value.strftime('%Y/%m/%d'), end='\t')
        else:
            print(value, end='\t')
    print()

公式计算

sheet['E256'] = '=avergae(e2:e255)'
sheet['F256'] = '=sum(f2:f255)'
# 修改对齐方式以及字体
cell = sheet['F257']
cell.value = '加油'
cell.alignment=Alignment(horizontal='center', vertical='center')
cell.font = Font(name='华文行楷', size=20, color='000099')

# 修改边框的样式
side = Side(color='000099', style='mediumDashed')
cell.border = Border(left=side, right=side, top=side, bottom=side)

# 修改行高和列宽
sheet.row_dimensions[257].height = 70
sheet.colum_dimension['F'].width = 20

插入图表

# 绘制折线
c1 = LineChart()
c1.title = '一月份收盘价和开盘价'
c1.style = 13
c1.y_axis.title = '价格'
c1.x_axis.title = '日期'
# 给图添加数据引用(纵轴数据)
data = Reference(sheet, min_col=4, max_col=5, min_row=2, max_row=23)
c1.add_data(data, titles_from_data=True)
# 设置横轴数据
cats = Reference(sheet, min_col=1, min_row=2, max_row=23)
c1,set_categories(cats)

# 给数据系列设置样式
s1 = c1.series[0]
s1.marker.symbol = 'triangle'
# 标记点的填充色
s1.marker.graphicalProperties.solidFill = '000099'
# 设置标记点的边框色
s1.marker.graphicalProperties.line.solidFill = '0000ff'

# 将曲线设置为平滑曲线
s1.smooth = True
# 将图添加到工作表
sheet.add_chart(c1, 'A258')

# 保存工作薄
workbook.save('resources/阿里巴巴2020年股票数据.xlsx')

利用python发邮件

邮件服务器 --》自己搭建,或者买三方邮件服务
发邮件:SMTP ---》简单邮件传输协议 ---》通过这个协议跟自己的邮件服务器进行网络通信
Python标准库已经对SMTP进行了封装,我们主要通过创建对象,通过给对象发消息的方式就可以完成邮件发送

smtplib模块 --》SMTP_SLL --》login()/ sendmail/quit()
MIME  ---> Multi-purpose(多用途) Internet Mail Extension
---> text/html  超文本
---> image/png
---> image/gif
---> audio/mp3
---> video/mp4
---> application/pdf
MIMEMultipart  --> attach -->添加文本,附件等其他内容
MIMEMText ---> 既可以封装文本也可以封装二进制数据(需要经过BASE64编码处理)

收邮件:1)POP3 -->邮局协议第三版
       2)IMAP -->网络传输协议
# 没有附件的邮件发送格式
import smtplib
from email.mime.text import MIMEText
# 创建SMTP_SSL对象
smtp_obj = smtplib.SMTP_SLL(host='smtp.qq.com', port=465)

# 1.登录授权
smtp_obi.login(本机邮箱账号,服务器给的授权码)
# 文件内容
content = """
    武侯区明天小雨,出门记得带伞
"""
# MIMEText对象的构建以及文件标题等
mime_text = MIMEText(content, 'plain', 'utf-8')
mime_text['From'] = 发件人账号
mime_text['To'] = 收件人账号(多个收件的的时候中间用分号隔开)
mime_text['Subject'] = 邮件主题

# 2、发送邮件
stmp_obj.sendmail(
     # 发件人
    from_addr=发件人邮箱账号
    # 收件人
    to_addrs=收件人邮箱账号,多个账号的时候中间用逗号隔开
    # 邮件内容,调用MIMEText对象的as_string()方法,将邮件主体转换成字符串作为第三个参数
    msg=mime_text.as_string()
)

# 结束会话
smtp_obj.quit()

给邮件添加附件

import smtplib
from email.mime.multipart import MIMEMutipart
from email.mime.text import MIMEText

# 创建SMTP_SSL对象
smtp_obj = smtplib.SMTP_SSL(host=邮件服务器地址, port=安全的SMTP默认465端口)

# 1、授权登录
smtp_obj.login(发件人邮箱地址,服务器给的授权码)

# 文件正文
content = """
    万里晴空
"""
MIMEMultipart()添加附件
m_part = MIMEMultipart()
m_part['From'] = 发件人邮箱地址
m_part['To'] = 收件人地址(人比较多的时候中间用分号隔开)
m_part['Cc'] = '....;....;.....;....'
m_part['Subject'] = 邮件主题
mime_text = MIMEText(content, 'plain', 'utf-8')
m_part.attach(mime_text)

# 添加附件
with open('resources/Base64 - 维基百科,自由的百科全书.pdf', 'rb') as file:
    pdf_file = MIMEText(file.read(), 'base64', 'utf-8')
    # 确定附件内容的类型
    pdf_file['content-type'] = 'application/pdf'
    # 在文本协议里面需要处理成百分号编码
    # 设置内容的处置方式(可下载的附件)
    pdf_file['content-disposition']='attachment;filename="aaa.pdf"'
    m_part.attach(pdf_file)

with open('resources/阿里巴巴2020年股票数据.xlsx', 'rb') as file:
    excel_file=MIMEText(file.read(), 'base64', 'utf-8')
    excel_file['content-type']='application/vnd.ms-excel'
    excel_file['content-disposition']= 'attachment;filename="alibb-stock.xlsx"'
    m_part.attach(excel_file)
smtp_obj.sendmail(
     from_addr=发件人邮箱
     to_addrs = 收件人邮箱(如果有多个,他们中间用分号隔开)
     msg=m_part.as_string()
)
# 结束会话
smtp_obj.quit()

百分号编码

将字符串处理成百分号编码quote(将中文处理成百分号编码)/unquote(将百分号编码转换成中文)
filename = quote('中文')
f'attachment; filename={filename}'
f"attachment; filename *=utf-8''{filename}"

在邮件里面添加html格式的内容

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import requests

smtp_obj = smtplib.SMTP_SSL(host=本机服务器,port=安全的端口)
smtp_obj.login(本机账户,授权码)
m_part = MIMEMultipart()
m_part['From'] = 发件人账户
m_part['To'] = 收件人账户
m_part['Subject'] = 邮件主题
content="""
    <p>晴空万里</p>
    <img src=网络图片地址>
"""
resp = requests.get(要查看的网页地址)
html_page = MIMEText(resp.text + content, 'html', 'utf-8')
m_part.attach(html_page)
smtp_obj.sendmail(
     from_addr=发件人账户,
     to_addrs=收件人账户,
    msg=m_part.as_string()
)
smtp_obj.quit()

调用三方短信网关-使用python发短信

HTTP ---》 请求方法 ---》 GET(从服务器拿数据)/POST(发数据给服务器)
import requests
def send_message(tel, message):
    resp=requests.post(
         url=第三方短信网关地址,
         auth=('api','授权码'),
        data={
            'mobile':tel,
            'message':message
        },
        timeout=3,
        verify=False
    )
    return resp.json()

只有在IP白名单中的地址,才能调短信网关发送短信

用python操作PDF文件

如果要从PDF文件中抽取中文,建议直接使用光学文字识别(OCR)
pip install easyocr

生成依赖项清单
pip freeze > requirements.txt(读取依赖项清单文件,安装依赖项)  ---> 输出重定项

pip uninstall -y -r requirements.txt - > 将requirements.txt安装的一条一条删掉

python实现pdf转图片

def get_filename(file_path):
    """
    获取不带路径和后缀的文件名
    :param file_path: 文件路径
    :return:
    """
    _, fullname = os.path.split(file_path)
    # 获取文件名和后缀
    filename, _ = os.path.splitext(fullname)
    return filename


def pdf_image(pdf_file, img_file, zoom_x=3, zoom_y=3, rotation_angle=0):
    """
    将PDF文件转成PNG图片
    :param pdf_file: PDF文件路径
    :param img_file: 保存图片的路径
    :param zoom_x: 缩放比例(横向)-》决定图的质量,值越大处理起来越慢,但是图的质量越好
    :param zoom_y: 缩放比例(纵向)
    :param rotation_angle: 旋转角度
    :return:
    """
    # 打开PDF文件
    pdf = fitz.open(pdf_file)
    # 逐页读取PDF
    for page_num in range(0, pdf.pageCount):
        page = pdf[page_num]
        # 设置缩放和旋转系数
        # 创建用于图像变换的矩阵
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
        # 将PDF页面处理成图像
        pm = page.getPixmap(matrix=trans, alpha=False)
        # 开始写图像
        temp = get_filename(pdf_file)  # 根据pdf的文件名,给生成的图片取名字
        # 图片输出格式
        pm.writePNG(f'{img_file}{temp}_{page_num + 1}.png')
    pdf.close()


def main():
    # 如果没有则添加文件目录
    if not os.path.exists('resources/images/'):
        os.makedirs('resources/images/')
    pdf_image('resources/XGBoost.pdf', 'resources/images/')


if __name__ == '__main__':
    main()

给pdf文件加空白页或者将页面进行旋转

import PyPDF2
from PyPDF2.pdf import PageObject

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
# 可以查看一共有多少页
for page_num in range(reader.getNumPages()):
    # 从reader里面拿到获取到的每一页
    page_obj = reader.getPage(page_num)  # type: PageObject
    # 顺时针旋转90度
    page_obj.rotateClockwise(90)
    # 将旋转后的图片写入新的文件
    writer.addPage(page_obj)

    # 添加空白页
    blank_age = writer.addBlankPage()  # type: PageObject
    blank_age.rotateClockwise(90)

# pdf文件设置密码(口令)
writer.encrypt('TingTingZi')
# 将writer写入文件
with open('resources/XGBoost_modified.pdf', 'wb') as file:
    writer.write(file)

加水印

import PyPDF2
from PyPDF2.pdf import PageObject

# 读取水印文件
reader = PyPDF2.PdfFileReader('resources/watermark.pdf')
wm_page = reader.getPage(0)

# 读取需要添加水印的文件
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')

# 创建Pdf 文件
writer = PyPDF2.PdfFileWriter()

# 遍历文件所有页面,然后往里面添加水印
for page_num in range(reader.getNumPages()):
    page_obj = reader.getPage(page_num)  # type: PageObject
    # 加水印页
    page_obj.mergePage(wm_page)
    # 将合并之后的页添加到新创建的pdf文件中
    writer.addPage(page_obj)

# 保存添加完水印之后pdf文件
with open('resources/XGBoost_watermarked.pdf', 'wb') as file:
    writer.write(file)

创建pdf文件

from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas

# 创建画布
pdf_canvas = canvas.Canvas('resources/demo.pdf', pagesize=A4)
width, height = A4

# 绘图
# image = canvas.ImageReader('girl01.jpg')
# pdf_canvas.drawImage(image, 20, height - 395, 250, 200)

# pdfmetrics.registerFont(TTFont('Font2', 'resources/青呱石头体.ttf'))
# pdf_canvas.setFont('Font2', 40)
# # 设置颜色, 1 是透明度为不透明, 透明度是0.2
# pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 0.3)
# 书写文字
# pdf_canvas.drawString(width // 2 - 120, height // 3, '我心向阳!!!')
# pdf_canvas.rotate(36)
#
# # 显示当前页
# pdf_canvas.showPage()

# 注册字体文件
pdfmetrics.registerFont(TTFont('Font1', 'resources/dd.ttf'))
pdfmetrics.registerFont(TTFont('Font2', 'resources/青呱石头体.ttf'))

# 写字
pdf_canvas.setFont('Font2', 40)
# 设置颜色, 1 是透明度为不透明, 透明度是0.2
pdf_canvas.setFillColorRGB(0, 200, 0, 0.1)
# 书写文字
# pdf_canvas.drawString(width // 2 - 120, height // 3, '你好,世界!')
pdf_canvas.rotate(36)
pdf_canvas.drawString(400, 250, 'Python学习!!!')
# pdf_canvas.setFont('Font1', 40)
# pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
# 显示当前页
pdf_canvas.showPage()

# pdf_canvas.setFillColorRGB(0, 2, 3, 0.4)
# # 将字体旋转18度
# pdf_canvas.rotate(18)
# pdf_canvas.drawString(250, 250, 'hello, world!')

# 保存
pdf_canvas.save()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值