selenium无头浏览器截图并以邮件发送

  • selenium
    4.11版本的selenium无需在本地下载浏览器驱动
# @Time    : 2024/10/18 17:54
# @Author  : 
# @FileName: print_sc.py
# @Description:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import base64from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicechrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')path = r'D:\chrome_driver'
service = Service(executable_path=path)def download(url, pngName):# 设置chrome参数browser = webdriver.Chrome(options=chrome_options)try:# 获取网页内容browser.get(url)# 通过执行脚本,设置滚动条到最大宽度及最大高度width = browser.execute_script("return document.documentElement.scrollWidth")height = browser.execute_script("return document.documentElement.scrollHeight")browser.set_window_size(width, height)# 是否需要超时等待# time.sleep(10)# 保存的截图名字browser.save_screenshot(pngName)browser.quit()except Exception as err:print(err)browser.quit()finally:browser.quit()def send_email(smtp_server, port, username, password, from_addr, to_addr, subject, body, image_path):# 创建MIME多部分消息msg = MIMEMultipart('related')msg['From'] = from_addrmsg['To'] = to_addrmsg['Subject'] = subject# 创建邮件主体HTML内容# cid:image1 用于指定嵌入图像的位置html_content = f"""<html><body><p>{body}</p><img src="cid:image1" alt="Embedded Image"></body></html>"""# 添加HTML到邮件msg.attach(MIMEText(html_content, 'html'))# 读取和编码图像with open(image_path, 'rb') as img_file:img_data = img_file.read()# 创建MIMEImage对象并设置相关头信息image = MIMEImage(img_data, name=image_path.split('/')[-1])image.add_header('Content-ID', '<image1>')  # cid标识符# 将图片对象附加到邮件msg.attach(image)# 连接到SMTP服务器并发送邮件try:server = smtplib.SMTP(smtp_server, port)# server.starttls()  # 启用TLS加密# server.login(username, password)server.send_message(msg)print("Email sent successfully")except Exception as e:print(f"Failed to send email: {e}")finally:server.quit()smtp_server = 'SMTp.test.com'  # 替换为你的SMTP服务器
port = 25  # 通常为587或465,为SMTP服务器提供
username = 'xxxxx'
password = 'xxxxx'
from_addr = 'Test@test.com'if __name__ == '__main__':url = 'https://console.cn/platform'pngPath = 'D:/chrome_driver/'pngName = pngPath + "summary.png"download(url, pngName)to_addr = 'test@test.com'subject = 'Here is your embedded image'body = 'Please see the image below.'image_path = pngNamesend_email(smtp_server, port, username, password, from_addr, to_addr, subject, body, image_path)

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

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

相关文章

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…

Fakelocation 步道乐跑(Root真机篇)

前言:需要 Fakelocation&#xff0c;真机Root,步道乐跑&#xff0c;Dia&#xff0c;MT管理器系统需求 Fakelocation | MT管理器 | Dia | 环境模块 任务一 真机Root&#xff08;德尔塔&#xff0c;过momo&#xff0c;刷环境模块&#xff09; 任务二 前往Dia查看包名&#xff08…

Vue学习笔记(十二)

async与await 1. async async作为一个关键字放到声明函数前面&#xff0c;表示该函数为一个异步任务&#xff0c;不会阻塞后面函数的执行async函数里如果有异步过程会等待&#xff0c;但async函数本身会马上返回&#xff0c;不会阻塞当前线程。可以简单认为async函数工作在主…

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler

MyBatis的SQL执行过程 在前面一系列的文档中&#xff0c;我已经分析了 MyBatis 的基础支持层以及整个的初始化过程&#xff0c;此时 MyBatis 已经处于就绪状态了&#xff0c;等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程&#xff0c;该过程比较复杂&#xff…

达梦数据迁移工具DTS使用实践

1、环境描述 2、DTS概述 1.支持视图、存储过程/函数、包、类、同义词、触发器等对象迁移&#xff1b; 2.支持数据类型的自动映射&#xff0c;编码转换&#xff1b; 3.支持根据条件自定义迁移部分数据&#xff1b; 4.向导式迁移步骤&#xff0c;上手简单&#xff1b; 5.支持 we…

【Web.路由】——路由约束

我们需要明确的一点就是&#xff0c;一个URL地址就是一个路由值。 而路由约束&#xff0c;就是制定出的一套规则&#xff0c;只有路由值与路由约束中的规则匹配&#xff0c;才可以进行下一步操作。 路由约束不仅可用于路由请求&#xff0c;还可以用于链接的生成。 参数值约束 …

医药公司常用的九大翻译场景

医药公司的翻译工作通常涉及多个专业领域&#xff0c;以下是一些常见的翻译场景&#xff1a; 1、药品说明书翻译&#xff1a;包括药物的成分、副作用、使用方法、储存条件等内容的翻译&#xff0c;必须准确无误&#xff0c;以确保患者和医务人员能够正确使用药物。 2、临床研…

VB中的安全性考虑,如防止SQL注入、XSS攻击等

在Visual Basic (VB) 开发中&#xff0c;安全性是一个至关重要的考虑因素。为了防止SQL注入、跨站脚本&#xff08;XSS&#xff09;攻击等常见安全威胁&#xff0c;开发人员需要采取一系列措施来确保应用程序的安全性。以下是对VB中安全性考虑的详细描述&#xff1a; 防止SQL注…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条&#xff0c;可设置背景色、进度条颜色&#xff08;渐变色&#xff09;下载进度控制&#xff1b;可二次定制度高&#xff1b; 核心代码&#xff1a; Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】 ⏲️ 在JavaScript中&#xff0c;防抖&#xff08;Debouncing&#xff09;与节流&#xff08;Throttling&#xff09;是两种常用的性能优化技术&#xff0c;尤其在处理频繁触发的事件时&#xff0c;如滚动、窗口调…

SSH登录介绍

说明&#xff1a;一般登录服务器&#xff0c;我们可以用远程连接工具&#xff0c;如XShell、Windterm等&#xff0c;或者通过公司搭建的JumpServer&#xff08;跳板机、堡垒机&#xff09;来连接。前者是点对点登录&#xff0c;输入主机、端口&#xff0c;通过SSH协议登录&…

中信银行西安分行完成首笔上市公司股票回购增持专项贷款审批

10月18日上午&#xff0c;中国人民银行联合国家金融监管总局、中国证监会发布《关于设立股票回购增持再贷款有关事宜的通知》&#xff0c;创新推出股票回购增持专项再贷款货币政策工具&#xff0c;旨在鼓励金融机构支持上市公司回购和股票增持&#xff0c;进一步提振市场信心&a…

ValueError: Object arrays cannot be loaded when allow_pickle=False

文章目录 问题解决方法1&#xff1a;allow_pickleTrue解决方法2&#xff1a;降低numpy版本错误原因&#xff1a;python和numpy版本不兼容 问题 Traceback (most recent call last): File “D:\project\test_st\retrieval\read_npy.py”, line 4, in data np.load(‘mosi0__le…

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8 在日常开发中&#xff0c;我们经常会遇到不同编码格式的文件&#xff0c;比如 UTF-8、ASCII、Windows-1252、ISO-8859-1 等。文件编码不一致可能导致读取或处理文件时出现乱码&#xff0c;特别是在批量处理数据文件时。…

【三十八】【QT开发应用】vlcplayer视频播放器(一)实现视频播放,视频暂停,视频停止,进度条调节,音量调节,时长显示功能

效果展示 vlcplayer_test视频播放器 MainWidget.ui 注意控件的布局和命名&#xff0c;控件的命名和信号与槽函数的绑定有关&#xff0c;所以这点很重要。 下载VLC组件和环境配置 videolan下载地址我下载的是vlc-3.0.8-win64版本. 将下载的文件复制粘贴到项目文件中. 复制粘…

PostgreSQL中查询每个账号的最新和最新前的数据

问题背景 有时候我们需要PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;也就是Rank12的数据供使用。 解决方案 如果PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;我们可以使用窗口函数来实现。窗口函数允许我们对数据进行分区&#xff0c;然后在每个…

linux上trace code的几种方法

我们在看代码时&#xff0c;总是会遇到下面问题&#xff1a; 1.查看某个场景下的代码执行流 2.查看某个函数被执行时的routine 但是&#xff0c;如果直接查看源码&#xff0c;源码可能代码量大&#xff0c;且分支多&#xff0c;不容易理清。就需要让相关程序运行起来查看。 …

《论文写作》课程心得

《论文写作》课程心得 在学习闵帆老师的《论文写作》课程后&#xff0c;结合平时观察同门的论文评改过程&#xff0c;我对论文写作有了新的体会。因此&#xff0c;我写下这篇博客&#xff0c;作为我对论文写作的总结。在我看来&#xff0c;论文写作这门课虽然主要讲的是如何写…