Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 388|回复: 0

[默认分类] Python让繁琐工作自动化——chapter16 发送电子邮件和短信

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-4-19 10:47:42 | 显示全部楼层 |阅读模式

    1. 基础语法
    1.1 发送邮件SMTP
    用书上提供的代码一直显示ConnectionClosed 或者554错误,之后换了一种写法,虽然还是不稳定(有时候能发出去有时候就显示554——垃圾邮件错误)
    以下是一种发送成功的写法(不稳定):
    1. [/code]
    2. [code]import smtplib
    3. from email.mime.text import MIMEText
    4. from email.header import Header
    5. msg = MIMEText("Hello from the other side","plain","utf-8")   #正文
    6. from_addr = "你的邮箱"                      #发送邮箱地址
    7. password =  "授权码"                        #邮箱授权码,非登陆密码
    8. to_addr = "收件人邮箱"                      #收件箱地址
    9. smtp_server = "smtp.163.com"               #smtp服务器  在这里用的是163
    10. msg["From"] = from_addr                    #发送邮箱地址
    11. msg["To"] = to_addr                        #收件箱地址
    12. msg["Subject"] = "为什么发不出去呢"          #主题
    13. server = smtplib.SMTP(smtp_server,25)      #端口465显示connetclosed
    14. #server.set_debuglevel(1)                  #打印出和SMTP服务器交互的所有信息
    15. server.starttls()                          #SSL加密,感觉这部应该可以不要,因为网易本身就是SSL加密
    16. server.login(from_addr,password)           #邮箱登录
    17. server.sendmail(from_addr,[to_addr],msg.as_string())     #邮件发送(发件人,收件人群发列表,内容的字符串形式)
    18. server.quit()                              #退出登录
    复制代码
    出现问题
    (1)出现554解决方案:
    a: 更换邮件主题,不要用“测试”、“test”等主题
    b: 使用MIMEtext方法,添加 “From”“To”“Sbuject”关键字,这里采用了这种方法
    (2)SSL问题 :ssl.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)
    将smtplib.SMTP_SSL   更换为  smtplib.SMTP(smtp_server,25)
    (3)ConnectionClosed 错误
    a:尝试更换端口
    b:检查是否开启IMAP/SMTP服务
    c:网易163邮箱好像不能频繁发送,需要等待一段时间后在发送就可以了...
    (4)认证错误
    确保账号填写正确后,密码输入是授权码,而不是邮箱设定的密码
    1.2 用Twilio发送短信
    (1)注册账号
    https://www.twilio.com/ 注册新账号,需要验证一个手机,防止用该账号给别的手机发送垃圾短信,得到几个参数,在之后的程序中用到:账户SID,账户AUTH认证标志,你的Twilio号码
    (2)发送短信
    1. from twilio.rest import Client
    2. accountSID = "ACXXXX"          #账户SID
    3. authtoken = "XXXXXX"           #账户AUTH认证标志
    4. myTwilionumber = "+XXXXX"      #你的Twilio号码
    5. myphonenumber = "+86XXXXX"     #接收的手机号
    6. twiliocli = Client(accountSID, authtoken)    #创建一个Client对象
    7. msg = twiliocli.messages.create(body=message, from_=myTwilionumber, to=myphonenumber)    #创建message(正文内容,发件人,收件人)
    复制代码
    (3)发送状态
    1. msgsid = msg.sid                               #显示消息sid
    2. updatemsg = twiliocli.messages.get(msg.sid)    #根据SID更新消息
    3. print(updatemsg.status)                        #查询发送状态
    4. datetime = msg.date_created                     #查询datetime创建时间   date_sent 为发送时间
    5. time = datetime.strftime("%Y/%m/%d %H:%M:%S")
    6. print(time)
    复制代码
    不过在调用的过程中,显示没有get属性不知道为啥...


    2. 实例应用


    3. 课后习题
    3.1 天气预报短信提醒程序
    首先从天气网站调用API得到某地天气,进行JSON解析之后,将信息通过Twilio模块发送给指定号码。本来写了一个具有归属地和手机号码的字典数据结构,想要实现消息的群发,不过Twilio好像只能发送给自己?
    1. #!python3
    2. #-*- coding: utf-8 -*-
    3. # 2018/4/13 0013  10:41
    4. #天气预报短信提醒程序  输入城市,通过twilio发送短信
    5. import requests,json,sys
    6. import twilio
    7. import datetime
    8. import time
    9. from twilio.rest import Client
    复制代码
    1. #发送短信列表,手机号-地点
    2. location = {
    3.     "X1":"+86XXXXXXXXXXX",      
    4.     "X2":"+86XXXXXXXXXXX"
    5. }
    6. accountSID = "ACXXXXXXXXXXXXXXX"
    7. authtoken = "XXXXXXXXXXXXXXXXXXX"
    8. myTwilionumber = "+XXXXXXXXXXXXXXXXX"
    9. myphonenumber = location.values()          #接收的手机号
    10. def textme(message):
    11.     twiliocli = Client(accountSID, authtoken)
    12.     msg = twiliocli.messages.create(body=message, from_=myTwilionumber, to=myphonenumber)
    13. for city in location.keys():
    14.     weatherurl = "https://www.sojson.com/open/api/weather/json.shtml?city=%s"%city    #天气API
    15.     hello = "%s天气"%city     #短信开头
    16.     response = requests.get(weatherurl)
    17.     response.raise_for_status()
    18.     weatherdata = json.loads(response.text)
    19.     data = weatherdata["data"]
    20.     forecast = data["forecast"]
    21.     j = 0
    22.     text = []
    23.     sendsms = []
    24.     for i in range(1):   #i为每一天的数据,字典类型
    25.         content = []
    26.         content.append(hello)
    27.         for k,v in forecast[i].items():
    28.             text.append(v)             #将天气预报中文信息加到列表中
    29.         for t in text:
    30.             if isinstance(t, str) :    #去除不是string的参数,防止报错
    31.                 content.append(t)      #添加到一个新的列表content
    32.         x = "\n".join(content)       #twilio发送list数据时,只会发送第一项,所以要链接为字符串
    33.         print(x)
    34.     textme(x)                           #调用发短息模块
    35.     time.sleep(4)
    复制代码
    TBC。。。明天再写
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 21:19 , Processed in 0.373878 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表