1.安装yamail模块

pip install yamail

2.发送QQ邮件

2.1 开启POP3/SMTP服务,

QQ邮箱->设置->账户
image.png

2.2.查找对应邮箱,发送邮件服务器地址

QQ邮箱:
image.png

网易邮箱:
image.png

2.3.使用QQ邮件发送邮件

发给一个人:传一个字符串
发送给多个人,传list

  1. import yamail
  2. username = "1234455@qq.com"
  3. password = "授权码"
  4. host = "smtp.qq.com" # smtp.163.com
  5. port = 465
  6. mail = yamail.SMTP(user=username, password=password, host=host, port=port, smtp_ssl=True)
  7. # to = "1214504186@qq.com"
  8. to = ["1214504186@qq.com", "1078376500@qq.com", "1306114919@qq.com"]
  9. cc = ["1735763715@qq.com", username, "1581753566@qq.com"]
  10. subject = "大家好,今天北京下雪了,我们一起出来吃火锅"
  11. content = "晚上8点,去海底捞太阳宫店"
  12. attachments = "D:\pythonProject\Study\day7\log.py"
  13. mail.send(to=to, cc=cc, subject=subject, contents=content, attachments=attachments)

3.1参数说明

3.1.1.实例化一个SMTP类对象

  1. #实例化一个yamail 库里的SMTP类对象
  2. m=yamail.SMTP(host=host,port=port,user=user,password=password,smtp_ssl=True)
  3. #smtp_ssl 使用SSL协议

SMTP类对象,传递的形参

  1. username = "1234455@qq.com"
  2. password = "授权码"
  3. host = "smtp.qq.com" # smtp.163.com
  4. port = 465
  5. smtp_ssl=True #使用SSL协议

3.1.2、SMTP对象调用send方法发送邮件

  1. m.send(to=to,subject=subject,contents=contents,cc=cc,attachments=attachments)

收件人to参数

to参数:
可以将收件人邮箱地址放到一个字符串中 例如 :”123456@qq.com”
也可以将多个收件人邮箱地址分别放到字符串后,再放到一个列表中
例如:[“123@qq.com”,”456@qq.com”]

  1. to=["992264596@qq.com"] #收件人邮箱,可以选择多个收件人

抄送人cc参数

cc参数:
可以将抄送人邮箱地址放到一个字符串中 例如 :”123456@qq.com”
也可以将多个抄送人邮箱地址分别放到字符串后,再放到一个列表中
例如:[“123@qq.com”,”456@qq.com”]

  1. cc=["673536548@qq.com"]

邮件附件attachments参数

attachments参数将附件本地绝地路径地址放到一个字符串中 例如 :”D:\demo.jpg”
也可以将多个附件本地绝地路径地址分别放到字符串后,再放到一个列表中
例如:
[“lidong01.png”,”lidong02.png.jpg”]

  1. D:\study\progrm\elephant
  2. #附件
  3. attachments=[r"D:\study\progrm\elephant\demo\lidong01.png"\
  4. ,r"D:\study\progrm\elephant\demo\lidong02.png"]

3.发送钉钉消息

3.1 添加自定义机器人

image.pngimage.png
image.png
image.png

3.2自定义机器人安全设置

自定义机器人安全设置
目前有3种安全设置方式,请根据需要选择一种。
https://developers.dingtalk.com/document/robots/customize-robot-security-settings

关键字
image.png
image.png

3.3选择消息类型

当前自定义机器人支持文本 (text)、链接 (link)、markdown(markdown)、ActionCard、FeedCard消息类型,请根据自己的使用场景选择合适的消息类型,达到最好的展示样式

更多消息类型,请求参数可以参考 钉钉开放平台
https://developers.dingtalk.com/document/robots/custom-robot-access

举例:text消息类型

  1. {
  2. "at": {
  3. "atMobiles":[
  4. "180xxxxxx"
  5. ],
  6. "atUserIds":[
  7. "user123"
  8. ],
  9. "isAtAll": false
  10. },
  11. "text": {
  12. "content":"我就是我, @XXX 是不一样的烟火"
  13. },
  14. "msgtype":"text"
  15. }
参数 参数类型 是否必填 必须
msgtype String 消息类型,此时固定为:text。
content String 消息内容。
atMobiles Array 被@人的手机号。
atUserIds Array 被@人的用户userid。
isAtAll Boolean 是否@所有人。

注意
在content里添加@人的手机号,且只有在群内的成员才可被@,非群内成员手机号会被脱敏。
注意
在content里添加@人的userid。

python实例

以 自定义关键词 安全模式,
以 发送text消息类型 举例:

  1. import requests
  2. url = "https://oapi.dingtalk.com/robot/send"
  3. token = {"access_token":"token"}
  4. data = {
  5. "at": {
  6. "atMobiles":[
  7. "18513112593",
  8. "15503122090"
  9. ],
  10. "isAtAll": True
  11. },
  12. "text": {
  13. "content":"我是机器人,thz,这是写代码发送的"
  14. },
  15. "msgtype":"text"
  16. }

加签

image.png

  1. import requests
  2. import time
  3. import hmac
  4. import hashlib
  5. import base64
  6. import urllib.parse
  7. from loguru import logger
  8. def get_dding_sign(secret):
  9. timestamp = str(round(time.time() * 1000))
  10. secret_enc = secret.encode('utf-8')
  11. string_to_sign = '{}\n{}'.format(timestamp, secret)
  12. string_to_sign_enc = string_to_sign.encode('utf-8')
  13. hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
  14. sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
  15. return timestamp, sign
  16. def send_dd_msg(msg, token="token",
  17. secret="secret", at=None, at_all=False):
  18. url = "https://oapi.dingtalk.com/robot/send"
  19. timestamp, sign = get_dding_sign(secret)
  20. url_params = {"access_token": token, "timestamp": timestamp, "sign": sign}
  21. data = {
  22. "at": {
  23. "atMobiles": at,
  24. "isAtAll": at_all
  25. },
  26. "text": {
  27. "content": msg
  28. },
  29. "msgtype": "text"
  30. }
  31. r = requests.post(url, params=url_params, json=data)
  32. ret = r.json()
  33. if ret.get("errcode") != 0:
  34. logger.warning("钉钉消息发送失败!返回报文是:{}", ret)
  35. return False
  36. logger.info("钉钉消息发送成功")
  37. return True
  38. if __name__ == '__main__':
  39. send_dd_msg("下课后,同学们出来打雪仗了", at=["18513112593", "15503122090"])

raise主动抛出异常
image.png

https://pypi.org/