本文可以学习到以下内容:

  1. 使用requests库发送钉钉消息
  2. 使用email和smtplib库发送邮件
  3. 使用163邮箱服务,自动发送邮件及附件

发送邮件源码

smtplib和email库都是python内置的标准库,不需要额外安装。

send_email函数是小凡封装的,参数解释如下:

text:邮件内容

server:发送邮件服务方,默认为163服务方

sender:发送人

receivers:接收人,多个接收人封装为列表

psw:从163邮箱获取的服务密码

attachment:附件,单个附件地址,或者多个附件地址列表

to:收件人名称

subject:邮件主题

源码如下:

import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication def send_email(text, server="smtp.163.com", sender=None, receivers=None, psw=None, attachment=None, to="收件人",subject="python自动发送邮件"):
"""
text:邮件内容
server:发送邮件服务方,默认为163服务方
sender:发送人
receivers:接收人,多个接收人封装为列表
psw:从163邮箱获取的服务密码
attachment:附件,单个附件地址,或者多个附件地址列表
to:收件人名称
subject:邮件主题
"""
# 实例化一个邮箱对象
smtp = smtplib.SMTP()
# 发送的文本内容
text = f'<p>{text}</p>'
# 实例化一个发送文本的邮箱对象
mime_text = MIMEText(_text=text, _subtype="html", _charset="utf-8")
# 发件人
mime_text["from"] = sender
# 收件人
mime_text["to"] = to
# 主题
# mime_text["subject"] = subject
# 创建一个多部分的邮箱对象
mime_multipart = MIMEMultipart()
# 邮箱主题
mime_multipart['Subject'] = subject
mime_multipart.attach(mime_text)
if attachment:
# 发送附件
if isinstance(attachment, str):
# 单个附件地址
with open(attachment, 'rb') as f:
mime_application = MIMEApplication(f.read())
mime_application.add_header('Content-Disposition', 'attachment', filename=attachment)
mime_multipart.attach(mime_application)
elif isinstance(attachment, list):
# 多个附件地址列表
for file in attachment:
with open(file, 'rb') as f:
mime_application = MIMEApplication(f.read())
mime_application.add_header('Content-Disposition', 'attachment', filename=file)
mime_multipart.attach(mime_application)
try:
# 连接并登录发送邮件的服务方
smtp.connect(server)
smtp.login(sender, password=psw)
# 发送邮件
smtp.sendmail(from_addr=sender, to_addrs=receivers, msg=mime_multipart.as_string())
print("发送邮件到 ", receivers, " 成功!")
except Exception as e:
print(str(e))
finally:
smtp.quit() if __name__ == '__main__':
text = "Python自动发送邮件"
sender = 'xxxxxxxxxxx@163.com'
psw = 'xxxxxxxxxxxxxxxx'
receivers = ["xxxxxxxxxx@qq.com", "xxxxxxxxxx@163.com"]
# 不发送附件方式
# send_email(text=text,sender=sender,psw=psw,receivers=receivers)
# 发送单个附件
# attachment = "./requirements.txt"
# send_email(text=text,sender=sender,psw=psw,receivers=receivers,attachment=attachment)
# 发送多个附件
# attachment = ["./requirements.txt","./sspython.ico"]
# send_email(text=text,sender=sender,psw=psw,receivers=receivers,attachment=attachment)

发送钉钉消息源码

参考钉钉开发文档,封装了dingding_robot函数。
参数解释如下:

title: 在消息显示的时候的简短信息

secret: 密钥

key_msg_list: 自定义的关键词列表

msg: 发送的信息

safe_set:安全设置,自定义关键词,加签

send_type: 发送内容的类型:text,markdown(md)

webhook: 申请的webhook

at_mobiles: 默认为None,指定@某人,传入列表

at_all: @所有人,传入True或者False

return: 发送是否成功标志

源码如下:

import requests
import time
import hmac
import hashlib
import base64
import urllib.parse def judge_msg(key_msg_list, msg):
"""
判断发送的消息中是否包含关键字
"""
for km in key_msg_list:
if km in msg:
return True
return False def make_sign(secret=None):
# 当安全设置选择加签方式时,制作秘钥
timestamp = str(round(time.time() * 1000))
if secret is None:
return None
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign def dingding_robot(msg=None, key_msg_list=None, safe_set=None, send_type=None, secret=None, webhook=None,
at_mobiles=None, at_all=False, title="钉钉机器人"):
"""
钉钉机器人
:param title: 在消息显示的时候的简短信息
:param secret: 密钥
:param key_msg_list: 自定义的关键词列表
:param msg: 发送的信息
:param safe_set:安全设置,自定义关键词,加签
:param send_type: 发送内容的类型:text,markdown(md)
:param webhook: 申请的webhook
:param at_mobiles: 默认为None,指定@某人,传入列表
:param at_all: @所有人,传入True或者False
:return: 发送是否成功标志
"""
if webhook is None:
print("webhook参数为必选项")
return None
if at_mobiles is None:
at_mobiles = []
if send_type not in ["text", "md", "markdown"]:
print("send_type必须为['text', 'md', 'markdown']其中一个")
return None
if safe_set in ['自定义关键词', '加签']:
header = {
"Content-Type": "application/json",
"Charset": "UTF-8"
}
send_content = {"at": {"atMobiles": at_mobiles, "isAtAll": at_all}}
if send_type == "text":
send_content["msgtype"] = "text"
send_content["text"] = {"content": msg}
elif send_type in ["md", "markdown"]:
send_content["msgtype"] = "markdown"
send_content["markdown"] = {"title": title, "text": msg}
if safe_set == "自定义关键词":
if not isinstance(key_msg_list, list) and not judge_msg(key_msg_list, msg):
print("key_msg_list传入自定义的关键词列表,msg中必须包含其中一个关键词")
return None
res = requests.post(url=webhook, json=send_content, headers=header)
return res.text
elif safe_set == "加签":
if secret:
timestamp, sign = make_sign(secret)
webhook = webhook + "&timestamp=" + timestamp + "&sign=" + sign
res = requests.post(url=webhook, json=send_content, headers=header)
return res.text
else:
print("secret为密钥,加签方式必须传入;")
return None
else:
print("safe_set参数为['自定义关键词', '加签']其中一个")
return None if __name__ == '__main__':
# 1、安全设置为自定义关键词
webhook = "从钉钉群中获取的webhook"
safe_set = "自定义关键词"
key_msg_list = ["自定义关键词1", "自定义关键词2", "自定义关键词3"]
msg = "发送的内容"
send_type = "text" # 或 md、或 markdown
at_mobiles = ["11111111111", "2222222222"] # 默认为 None
dingding_robot(webhook=webhook, safe_set=safe_set, key_msg_list=key_msg_list, msg=msg, send_type=send_type,
at_mobiles=at_mobiles)
# 2、安全设置为加签
# safe_set = "加签"
# secret = "xxxxxxxxxxxxxxxxxxxxxxx"
# dingding_robot(webhook=webhook, safe_set=safe_set, secret=secret, msg=msg, send_type=send_type,
# at_mobiles=at_mobiles)

源码地址

链接:https://pan.baidu.com/s/1Z0ecTuPmXSqgCnuvwn3rfg?pwd=g6b5
提取码:g6b5

第六章:用Python实现自动发送邮件和发送钉钉消息的更多相关文章

  1. python selenium-7自动发送邮件

    https://jingyan.baidu.com/article/647f0115b78f8d7f2148a8e8.html 1.发送HTML格式的邮件 import smtplib from em ...

  2. 第六章:Python基础の反射与常用模块解密

    本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...

  3. python实现自动发送邮件

    Python发送邮件成功的前提,应是先开启授权码.目前使用广泛的邮箱有:163邮箱.qq邮箱等. 163邮箱开启授权码的方法如下图: qq邮箱开启授权码的方法如下图: 接下来代码的实现: import ...

  4. 【TCP/IP详解 卷一:协议】第六章:DHCP 和自动配置

    简介 为了使用 TCP/IP 协议族,每台主机or路由器都需要一定的配置信息: IP地址 子网掩码 广播地址 路由或转发表 DNS 协议配置方法: 手动 通过使用网络服务来获得 使用一些算法来自动确定 ...

  5. 第六章深入python的set和dict

    1.collections中的abc MutableMapping是Mapping的子类 Mapping是Collection的子类 Collection是Sized,Iterable,Contain ...

  6. 第十六章:Python の Web开发基础(三) jQuery与Ajax

    本課主題 jQuery 介绍 Ajax 介绍 jQuery 介绍 选择器 jQuery 的选择器分不同的种类,主要目的是用来查找目标的 HTML 标签,方便对目标标签进行操作,比如找到 <li& ...

  7. python如何自动发送邮件

    #coding=utf-8 import smtplib from email.mime.text import MIMEText from email.mime.application import ...

  8. python接口自动化二(发送post请求)

    前言 一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样: 请求行 请求报头 消息主体 HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编 ...

  9. 【C#】新建服务自动发送邮件

    ---windows服务,---自动发送邮件 邮件发送code #region 发送邮件函数 public void SendMailUseZj() { System.Net.Mail.MailMes ...

  10. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

随机推荐

  1. Thymeleaf中判断Security权限 - SpringBoot

    参考:https://blog.csdn.net/perfect_red/article/details/110821582

  2. JAVA虚拟机23---JAVA与线程

    1 线程简介 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度 目前线程是Java里面进行处 ...

  3. 2211-12 Hello Flask!

    本篇记录来自Flask 入门教程 第 2 章:Hello, Flask! 第 2 章:Hello, Flask! 追溯到最初,Flask 诞生于 Armin Ronacher 在 2010 年愚人节开 ...

  4. cannot load "mso.dll" vs2008 web开发问题

    已成功解决办法: ①将VS 2008安装包WCUWebDesignerCoreWebDesignerCore.exe提取并重新安装: ②将C:Program Files/Common Files/Mi ...

  5. Spring事务(Transaction)管理高级篇一栈式解决开发中遇到的事务问题

    Spring是目前Java开发中最流行的框架了,它的事务管理我们在开发中常常的用到,但是很多人不理解它事务的原理,导致开发中遇到事务方面的问题往往都要用很长的时间才能解决,下面就带着大家去深入了解Sp ...

  6. SQL Server数据库日常检查

    1.1代码检查从昨天到现在,SQL代理Job有没有运行失败的,会把运行失败的Job名字,步骤,运行时间,错误等级,错误原因罗列出来,方便查看. ----1.1  Check Job Fail List ...

  7. kali挂代理之——proxychains4

    记一次打站需要用到kali,但是得挂代理,就从别人那里知道了一个kali挂代理的工具proxychains4. 首先是打开kali输入:root@Kali:~# vi /etc/proxychains ...

  8. JZOJ 2022.02.11【提高A组】模拟

    \(\text{Solution}\) 首先把 \(T2\) 给切了,\(T1\) 找半天规律找不到 然后打了个表算是暴力了 \(T3\) 也暴... 太暴了... \(T4\) 直接啥也不会 \(\ ...

  9. pytorch学习笔记五之通过示例学习

    1.概述¶   PyTorch 的核心是提供两个主要功能: n 维张量,类似于 NumPy,但可以在 GPU 上运行 用于构建和训练神经网络的自动微分   我们将使用将三阶多项式拟合y = sin(x ...

  10. 《话糙理不糙》之如何在学习openfoam时避免坑蒙拐骗

    今天开启一个单独的系列 <话糙理不糙> - 谁要和你说学openfoamC++基础不重要,那就是放氨气,非常误人 这就好比没读过外国文献的人和你说不需要学专业英语一样 谜底就在谜面里,程序 ...