Python实现邮件发送,钉钉机器人

Python 专栏收录该内容
16 篇文章 0 订阅

邮件编程

SMTP概述

  • SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,使用TCP协议25端口
  • 它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式
  • python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装

SMTP对象

Python发送邮件,第一步是创建SMTP对象
import smtplib
smtp_obj = smtplib.SMTP([host],[port],[local_hostname])
  • 创建SMTP对象也可以不给定参数,之后再通过对象的其他方法进行绑定
设置邮件

标准邮件需要三个头部信息

  • From:发件人
  • To:收件人
  • Subject:主题
from email.mime.text import MIMEText
from email.header import Header
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("zzg", 'utf-8')	#发送者
message['To'] = Header("root", 'utf-8') #接收者
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#邮件正文
message = MIMEText('python email test','plain','utf8')
#邮件头部信息:发件人,收件人,主题
message['From'] = Header('root','utf8')
message['To'] = Header('bob','utf8')
message['Subject'] = Header('py test','utf8')

#发邮件:邮件服务器,发件人,收件人
smtp = smtplib.SMTP('localhost') #使用本机作为服务器
sender = 'root'
receivers = ['root','bob']
smtp.sendmail('root',receivers,message.as_bytes())

SMTP认证

如果本机没有SMTP功能,也可以使用第三方的邮件服务器

  • 第三方邮件服务器往往需要认证
mail_host="mail.sina.cn"	
mail_user="zzg"
mail_pass="zzg_pass"
smtp_obj = smtplib.SMTP()
smtp_obj.connect(mail_host, 25) # 25 为 SMTP端口号
smtp.starttls() #如果使用证书,打开此注释
smtp_obj.login(mail_user,mail_pass)
smtp_obj.sendmail(sender,receivers,	message.as_string())

发邮件

  • 邮件服务器
    • 需要认证的服务器需要填用户名和密码
    • 服务器的地址在邮箱的“设置”中查询
    • 需要在邮件服务器的“设置”中允许客户端使用smtp
    • 客户端发邮件时,填写的是授权码
  • 发件人
  • 收件人
import getpass
from email.header import Header
from email.mime.text import MIMEText
import smtplib

def send_mail(host, password, sender, receivers, body, subject):
    # 邮件头部信息:发件人、收件人、主题
    msg = MIMEText(body, 'plain', 'utf8')
    msg['From'] = Header(sender, 'utf8')
    msg['To'] = Header(receivers[0], 'utf8')
    msg['Subject'] = Header(subject, 'utf8')

    # 发邮件:邮件服务器、发件人、收件人
    smtp = smtplib.SMTP()
    smtp.connect(host)
    # smtp.starttls()   # 如果服务器需要安全连接,打开此注释
    smtp.login(sender, password)  # 登陆
    smtp.sendmail(sender, receivers, msg.as_bytes())

if __name__ == '__main__':
    sender = 'xxx@163.com'
    receivers = ['xxx@163.com']
    server = 'smtp.163.com'
    password = getpass.getpass()
    body = '库尼奇瓦'
    subject = '棒棒哒'
    send_mail(server, password, sender, receivers, body, subject)

JSON

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
  • 易于人阅读和编写,同时也易于机器解析和生成
  • 基于JavaScript Programming Language
  • JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java,JavaScript, Perl, Python等)
  • 这些特性使JSON成为理想的数据交换语言
JSON结构

JSON主要有两种结构

  • “键/值”对的集合:python中主要对应成字典
  • 值的有序列表:在大部分语言中,它被理解为数组
PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

dumps方法

  • 对编码后的json对象进行decode解码,得到原始数据,需要使用的json.loads()函数
>>>	import json
>>>	number = json.dumps(100)
>>>	json.loads(number)
100
loads方法
  • 使用简单的json.dumps方法对简单数据类型进行编码
>>>	import json
>>>	json.dumps(100)
'100'
>>>	json.dumps([1,	2,	3])
'[1,2,3]'
>>>	json.dumps({'name':	'zzg'})
'{"name":"zzg"}'

json应用:获取天气情况

  • 搜索“中国天气网 城市代码”

  • 访问网址

    • 实况天气: http://www.weather.com.cn/data/sk/城市代码.html
      
    • 城市信息: http://www.weather.com.cn/data/cityinfo/城市代码.html
      
    • 详细指数: http://www.weather.com.cn/data/zs/城市代码.html
      

    如北京:

    http://www.weather.com.cn/data/sk/101010100.html

    >>> from urllib import request
    >>> url = 'http://www.weather.com.cn/data/sk/101010100.html'
    >>> r = request.urlopen(url)
    >>> data = r.read()
    >>> json.loads(data)
    

查快递

url = 'http://www.kuaidi100.com/query?type=%s&postid=%s'
# type是快递公司,postid是单号
>>> url = 'http://www.kuaidi100.com/query?type=youzhengguonei&postid=9893442769997'
>>> r = request.urlopen(url)
>>> data = r.read()
>>> json.loads(data)

requests基础

requests简介
  • Requests是用Python语言编写的、优雅而简单的HTTP库
  • Requests内部采用来urillib3
  • Requests使用起来肯定会比urillib3更简单便捷
  • Requests需要单独安装
requests特性
  • 支持keep-alive的连接池
  • 支持通用的域名以及URL地址
  • 支持使用cookie
  • 支持使用类似浏览器的SSL验证
  • 文件上传、下载
GET和POST
  • 通过requests发送一个GET请求,需要在URL里请求的参数可通过params传递
    r = requests.get(url="", params={},headers={},cookies={})
  • 与GET不同的是,POST请求新增了一个可选参数data,需要通过POST请求传递的body里的数据可以通过data传递
    r = requests.post(url="", data ={}, params={},file={},headers={},cookies={})
其他方法
  • 其他 HTTP 请求类型:PUT,DELETE,HEAD 以及OPTIONS使用起来一样简单
>>>	r = requests.put('http://httpbin.org/put',data={'key':'value'})
>>>	r = requests.delete('http://httpbin.org/delete')
>>>	r = requests.head('http://httpbin.org/get')
>>>	r = requests.options('http://httpbin.org/get')
请求参数
  • 当访问一个URL时,我们经常需要发送一些查询的字段作为过滤信息,例如:httpbin.com/get?key=val,这里的key=val就是限定返回条件的参数键值对
  • 当利用python的requests去发送一个需要包含这些参数键值对时,可以将它们传给params
payload = {'key1':'value1','key2':'value2'}
r = requests.get('http://httpbin.com/get,params =	payload)
设定头部
  • 用户也可以自己设定请求头
url = 'https://api.github.com/some/endpoint'	
headers = {'Accept':'application/json'}
r = requests.get(url, headers	= headers)
发送请求数据
  • 有时候,用户需要将一些数据放在请求的body内;这时候,就需要对data传参了(仅POST, DELETE,PUT等方法有该参数,GET没有,因为GET请求没有body)
payload = {'key1' : 'value1', 'key2':'value2'}
r = requests.post('http://httpbin.org/post', data	= payload)

requests应用

响应内容
  • 读取服务器响应的内容
>>> r = requests.get('http://www.baidu.com')
>>> r.text
  • 请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测
  • 可以找出 Requests 使用了什么编码,并且能够使用r.encoding 属性来改变它
>>> r.encoding
'ISO-8859-1'
>>> r.encoding='utf8'
>>> r.text
其他响应内容格式
  • 也可以用字节的方式访问请求响应体,尤其是非文本请求(如图片)
    >>> r.content
  • Requests 中还有一个内置的 JSON 解码器,助你处理 JSON 数据
    >>> r.json()
响应头
  • 可以查看以字典形式展示的服务器响应头
>>> r.headers
{
'content-encoding':	'gzip',
'transfer-encoding':	'chunked',
'connection':	'close',
'server':	'nginx/1.0.4',
'x-runtime':	'148ms',
'etag':	'"e1ca502697e5c9317743dc078f67693f"',
'content-type':	'application/json'
}
>>> import requests
>>> r = requests.get('http://www.sogou.com')
>>> r.text   # 访问文本内容

>>> r = requests.get('https://upload-images.jianshu.io/upload_images/7610279-f4563d12e2cc2c14.jpg')
>>> r.content   # 非文本内容
>>> with open('/tmp/myimg.jpg', 'wb') as fobj:
...   fobj.write(r.content)

>>> url = 'http://www.weather.com.cn/data/zs/101010100.html'
>>> r = requests.get(url)
>>> r.json()    # 乱码
>>> r.encoding  # 查看编码
'ISO-8859-1'
>>> r.encoding = 'utf8'   # 更换编码方式
>>> r.json()

# 如果资源比较大,可以采用切分处理
>>> r = requests.get('https://upload-images.jianshu.io/upload_images/7610279-f4563d12e2cc2c14.jpg')
>>> with open('/tmp/newimg.jpg', 'wb') as fobj:
...   for data in r.iter_content(4096):   # 每次读取4096字节
...     fobj.write(data)
# r.iter_content()用于迭代内容

钉钉机器人:

  1. 创建钉钉群聊机器人:https://www.jianshu.com/p/a3c62eb71ae3
  2. 搜索 “钉钉机器人 开放到台”找到网址:https://docs.open.alipay.com/
  3. 在开放平台搜索自定义机器人,得到网址:https://open-doc.dingtalk.com/microapp/serverapi3/iydd5h
import json
import requests
import sys
import getpass

def send_msg(url, reminders, msg):
    data = {
        "msgtype": "text",  # 发送消息类型为文本
        "at": {
            "atMobiles": reminders,
            "isAtAll": True,   # 不@所有人
        },
        "text": {
            "content": msg,   # 消息正文
        }
    }
    r = send_data(url,data)
    return r.json()   # 服务器的返回信息,用于调试

def send_link(url, reminders, msg):
    data = {
        "msgtype": "link",
        "link": {
            "text": "美女",
            "title": "美女",
            "picUrl": "",
            "messageUrl": "http://i1.whymtj.com/uploads/tu/201907/9999/2fc988d2ec.jpg"
        }
    }
    r = send_data(url,data)
    return r.json()   # 服务器的返回信息,用于调试

def action_card(url, reminders, msg):
    data = {
        "actionCard": {
            "title": "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身",
            "text": "![screenshot](http://i1.whymtj.com/uploads/tu/201907/9999/2fc988d2ec.jpg)\n### 乔布斯20年前想打造的苹果咖啡厅\nApple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
            "hideAvatar": "0",
            "btnOrientation": "0",
            "singleTitle" : "阅读全文",
            "singleURL" : "http://i1.whymtj.com/uploads/tu/201907/9999/2fc988d2ec.jpg"
        },
        "msgtype": "actionCard"
    }
    r = send_data(url,data)
    return r.json()   # 服务器的返回信息,用于调试

def send_data(url,data):
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    result = requests.post(url, data=json.dumps(data), headers=headers)
    return result
if __name__ == '__main__':
    msg = sys.argv[1]
    reminders = ['133xxxxxx02']  # 特殊提醒要查看的人,就是@某人一下
    url = "xxxx"  #此处填写钉钉机器人的webhook
    # print(send_msg(url, reminders, msg))
    print(send_link(url,reminders,msg))
    # print(action_card(url,reminders,msg))
  • 1
    点赞
  • 0
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值