社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

我要偷偷的学Python,然后惊呆所有人(第六天)

看,未来 • 4 年前 • 1677 次点击  

在这里插入图片描述

标题无意冒犯,就是觉得这个广告挺好玩的
上面这张思维导图喜欢就拿走,反正我也学不了这么多

前言

前期回顾: 我要偷偷学Python,然后惊呆所有人(第五天)

本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python,这里也要感谢齐锋学长送来的支持。
本系列文默认各位会百度,学习‘模块’这个模块的话,还是建议大家有自己的编辑器和编译器的,上一篇已经给大家做了推荐啦?

我要的不多,点个关注就好啦
然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。

本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

好,这是一篇“玩乐文”,看看我们今天会做几个好玩的项目呢?坐好咯,打开你们的编译器,不论是在线编译器还是PC编译器

这篇玩完了,下一篇就开始进爬虫咯


邮件群发

有朋友让我写邮件群发的功能,那就来呗?(此处手动补上表情包)

也学了这么些天了,应该对这套方法流程很熟悉了吧,第一步要干什么?

  1. 找到群发邮件所使用的模块或包
  2. 熟悉或了解该模块或包的使用
  3. 怎么了解?手册里有示例的嘛
  4. 修修改改,这么一个功能就出来啦

好,明确了步骤之后,我们开始吧: Python3.9库函数支持


···

在这里插入图片描述

在这里插入图片描述


代码参考

今天情绪有点不高,就直接来个代码参考,对着代码来讲吧

伪代码1:发送一个空壳邮件

我们以QQ邮箱为例(因为我只有QQ邮箱)

在干这个事情之前,我们要先干一个事情:开通QQ邮箱的第三方客户端使用授权。
我们的QQ邮箱并不是说用什么软件都能去发邮件的,这需要授权。
具体怎么弄嘞,

  1. 登录QQ邮箱
  2. 设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务->开通,开通前两个
  3. 现在是2020-10-26,如果以后界面又改版了,请搜索上面那一串英文,与时俱进

做完这些步骤之后,我们会拿到一些授权码,记住,使用最新的那个授权码。

# smtplib 用于邮件的发信动作
import smtplib	#引入smtplib模块

# 发信方的信息:发信邮箱,QQ邮箱授权码
from_addr = 'xxx@qq.com'	
password = '你的授权码'

# 收信方邮箱
to_addr = 'xxx@qq.com'

# 发信服务器
smtp_server = 'smtp.qq.com'	#目前就是这个了,你也不用去百度啦,我当时百度了十分钟,最后确定了就是它。。。

# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)	#这个465是端口号,如果不是465就换587试试,实在不行就只能公共端口号25了

# 登录发信邮箱
server.login(from_addr, password)

# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())

# 关闭服务器
server.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

这是一段伪代码,切记,这个是不能运行的,需要你把里面缺失的信息补全了,当然,我们不急着运行,等我讲完。

伪代码2:构建邮件内容

上面那段伪代码是发送邮件的壳,而邮件的具体内容,还得靠email包来实现

在这里插入图片描述

这里要重新介绍一下import这个语句了。

对于email这个
这个包的导入和模块的导入是有不一样的地方,我记得前边是用import导入哪个模块然后不行了来着(不用翻回去找,我健忘症,不知道有没有发出来),现在有结果了。

这就要谈到“模块”和“包”的区别了,模块(module)一般是一个文件,而包(package)是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。

在你看不见的地方,有一个init.py文件在暗中操控着这一切(当然,要看也有办法),init.py控制着包的导入行为。假如这个文件为空,那么我们仅仅导入包的话,就什么都做不了。所以直接import email是行不通的。

所以,我们就需要使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】。比如从email包下的text文件中引入MIMEText方法。

MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

步骤进行到这里,其实就已经可以发出一个邮件了(在前面的伪代码部分,会发现msg填不上,这样: msg = MIMEText('send by python','plain','utf-8')

动手能力强的朋友可以自己试一下了,动手能力不强的朋友可以跟着我再往下。
就是你会发现这是一个无头邮件。

邮件头(header,没错它也叫header)是这一块区域,包括主题、发件人、收件人等信息:

from email.header import Header

msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

把这一块加入到你的代码里去,效果如下:

from email.mime.text import MIMEText
from email.header import Header
import smtplib

#这里的邮箱请自己填哦
msg = MIMEText('猜猜我是谁:send by python','plain','utf-8')
smtp_server = 'smtp.qq.com'
from_addr = 'FF@foxmail.com'
to_addr = 'XX@qq.com'
#to_addr = 'XX@qq.com'

msg['From'] = Header('小锋')
msg['To'] = Header(to_addr)

msg['Subject'] = Header('这是一份Python发送的邮件哦,今天刚学的哈哈哈')


server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)

#server = smtplib.SMTP()
#server.connect(smtp_server,25)

server.login(from_addr, 'XXX')#授权码要选最新的
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这段代码里面你把那几个参数填上,就可以去发了。


群发邮件

群发的话,这里有两个办法,我讲一个,提一个,留一个吧:

第一个方法是把 to_addrs写成一个列表形式:

from email.mime.text import MIMEText
from email.header import Header
import smtplib

msg = MIMEText('猜猜我是谁:send by python','plain','utf-8')
smtp_server = 'smtp.qq.com'
from_addr = 'FF@foxmail.com'
to_addrs = ['FF@foxmail.com','XX@qq.com','XX@qq.com']

msg['From'] = Header('小锋')
msg['To'] = Header(",".join(to_addrs))	
#因为server.sendmail(from_addr, to_addrs, msg.as_string())这个函数里面接收的msg参数只能是字符串(不信你把这行去掉试试),所以我们要把这个列表变成字符串

msg['Subject'] = Header('这是一份Python发送的邮件哦,今天刚学的哈哈哈')


server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)

#server = smtplib.SMTP()
#server.connect(smtp_server,25)

server.login(from_addr, '填你自己的')#授权码要选最新的
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

提一个:
这里可以做一些安全方面的优化,虽然说也没啥人要拿咱的这个代码,但是好的习惯要从小抓起。

在我刚开始学编程,做的第一个项目的时候,老师就跟我们说,这个项目的密码要做成密文的,让用户输入,不能让别看到。
那么这段代码中有什么问题呢?

1、我们的账号都是公开的(虽然上面是伪代码)
2、我们的授权码也是公开的
3、我们的代码复用程度低,可用性低(这就涉及到第二个方法了)

解决前两个问题的方法也很简单,input就好了。
不过那个列表呢?怎么办嘞?
while循环!!

to_addrs = []
while True:
    a=input('请输入收件人邮箱:')
    #输入收件人邮箱
    to_addrs.append(a)
    #写入列表
    b=input('是否继续输入,n退出,任意键继续:')
    #询问是否继续输入
    if b == 'n':
        break


    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

提高代码可复用性与可用性

什么叫代码可复用性呢?就是你这个代码,今天我要群发这五个人,可以,明天我要群发另外六个人呢?怎么办?进去改代码。
如果到了要改代码这一步,那这个代码的可复用性设计也就太差了。

那什么叫代码可用性呢?请问你写的东西是给会写代码的人玩吗?那还是上面那个问题,她要是想换几个人群发那怎么办?哪天想多给一个人发,哪天想少给一个人发,怎么办?

不好用呐,她不会啊。

那怎么办?
还记得我们之前操作Excel的模块吗?对头,自己试一下吧。


告白气球

上面讲的比较认真些,带着大家一步一步做,接下来大家自己来看一段代码,看看能看懂多少,看不懂的可以百度,也可以加入我们的小圈子来和大家一起聊聊

我画了个圈,欢迎大家来我们的小圈子

我建了一个Python学习答疑群,有兴趣的朋友可以了解一下: 这是个什么群

直通群的传送门: 传送门

import turtle
import time

# 画心形圆弧
def chage_angle():
    for i in range(200):
        turtle.right(1)
        turtle.forward(2);

def move_position(x,y):
    turtle.hideturtle() # 隐藏画笔(先)
    turtle.up()  # 提笔
    turtle.goto(x,y)# 移动画笔到指定起始坐标(窗口中心为0,0)
    turtle.down()  # 下笔
    turtle.showturtle()  # 显示画笔

love = input("请输入表白语: ")
signature = input("请输入签名: ")
if love == '':
    love = "I LOVE YOU"


turtle.setup(width=800, height=500)     # 窗口(画布)大小
turtle.color('red', 'pink')     # 画笔颜色
turtle.pensize(3)       # 画笔粗细
turtle.speed(1)     # 描绘速度
# 初始化画笔起始坐标
move_position(x=0,y=-180)   # 移动画笔位置
turtle.left(140)    # 向左旋转140度

turtle.begin_fill()     # 标记背景填充位置

# 画心形直线( 左下方 )
turtle.forward(224)    # 向前移动画笔,长度为224
# 画爱心圆弧
chage_angle()      # 左侧圆弧
turtle.left(120)    # 调整画笔角度
chage_angle()      # 右侧圆弧
# 画心形直线( 右下方 )
turtle.forward(224)

turtle.end_fill()       # 标记背景填充结束位置

# 在心形中写上表白话语
move_position(0,20)      # 表白语位置
turtle.hideturtle()     # 隐藏画笔
turtle.color('#CD5C5C', 'pink')      # 字体颜色
# font:设定字体、尺寸(电脑下存在的字体都可设置)
turtle.write(love, font=('Arial', 30, 'bold'), align='center')

# 签写署名
if signature != '':


    

    turtle.color('red', 'pink')
    time.sleep(2)
    move_position(180, -180)
    turtle.hideturtle()  # 隐藏画笔
    turtle.write(signature, font=('Arial', 20), align="left")
    
    # 点击窗口关闭程序
window = turtle.Screen()
window.exitonclick()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

我看看能不能加视频啊
在这里插入图片描述

那没办法咯,不是我不加视频

在这里插入图片描述

可以自己去试试看哦


长尾流量优化

在这里插入图片描述
在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74689
 
1677 次点击  
文章 [ 1 ]  |  最新文章 4 年前