吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3560|回复: 33
收起左侧

[学习记录] python学习的第十七天——基础语法毕业!

[复制链接]
hz1010 发表于 2020-9-6 22:05
最近这几天自己有点偷懒了,学习进度慢了一些,不过还好,基础语法算是学完了,也基本掌握了七七八八,具体操作能力如何无法确定。
值得欣慰的是自己喜欢的一件事情坚持了下来。先给自己一些鼓励~~ 还在学习的童鞋请加油~你是最棒的

为什么没有每天来发一下自己学习的内容呢, 主要因为学习的一些地方比较简洁,也没有可以操作的练习题,所以就继续往下学习了~
那么第十三天到十七天,四天时间,我这边学习了以下内容:
encode()编码与decode()解码
读取文本内容与写入文本内容
利用with方法如何操作
学习了如何调用py文件,包含(import语句,from.....improt......语句,if__name__=='__main__'语句)
最后学习了调用csv文件读取与写入,方法跟读取文本相似。

先说一下从最开始学习到现在为止的一个感想,说白了,我自己学习这个只是出于到写代码的爱好,它到底能在工作或技能上帮助自己多少,能做哪些东西,其实我也不是很清楚。
我相信很多人都学着学着就放弃了,有着各种原因。但是该坚持的总要去坚持一下,或许能给到一个不一样的自己。

学了半个多月,自己掌握了多少不重要,重要的是在你做一个项目或练习题时,你可以知道翻你的哪些笔记,度娘什么问题就好。
python其实不算很难,有点像中文一样,把每个项目拆的散一些,根据逻辑一步一步实现就好了。如同作文似的。
或许在后面的爬虫,数据分析,web开发更复杂,但是先学了再说嘛。

废话不多说,总要拿出一点学习记录来,接下来是手动写一个收发邮件功能程序。也希望给在学的一些启发,大佬给予一些建议~~

使用Python发送邮件, 需要使用smtplib与email两个模块啊。
也就是说email模块负责构造邮件;smtplib模块负责发送邮件,这就是这节课要使用的模块解决的问题。
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。首先, 我们来构造一个简单的邮件。
[Python] 纯文本查看 复制代码
from email.mime.text import MIMEText
import smtplib
msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8')
在这里, 我们把email模块与smtplib模块引入进来,我们还使用MIMEText构造了邮件内容。
现在有了邮件的正文, 但是还缺少, 发件人,收件人; 接下来,我们向用户收集信息。
[Python] 纯文本查看 复制代码
# 输入Email地址和口令:
from_addr = input('From: ')
password = input('Password: ')
# 输入SMTP服务器地址:
smtp_server = input('SMTP server: ')
# 输入收件人地址:
to_addr = input('To: ')
在这里, 我们需要拿到, 发件人的邮箱,邮箱的密码, SMTP服务器地址, 还有收件人的邮箱。

那么这个STMP服务器地址什么意思

SMTP服务器地址,实际上就是代收发服务器地址,是由邮箱服务商提供的。说白了,你用哪家公司的邮箱, 就是哪家公司收发邮件服务器的地址。

我们编写的程序以QQ邮箱来测试. 我们使用QQ邮箱的收发邮件服务器的地址。

QQ邮箱SMTP服务器地址:smtp.qq.com, 端口465, QQ邮箱默认的端口是25, 我们这里使用的是加密端口465。
[Python] 纯文本查看 复制代码
server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465
server.set_debuglevel(1)               #调试级别
用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。

好了,接下来我们就要想着发送邮件了, 完成SMTP发送邮件功能
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。

sendmail()方法就是发邮件,需要引入三个参数:

第一个参数:from_addr是发件人的邮箱地址

第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。

第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。

好了,接下来我们整合所有代码.如下:
[Python] 纯文本查看 复制代码
from email.mime.text import MIMEText
import smtplib
msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8')
# 输入Email地址和口令:
from_addr = input('请输入发件人的邮箱号码From: ')
password = input('请输入发件人的邮箱密码Password: ')
# 输入SMTP服务器地址:
smtp_server = input('请输入邮箱服务器地址SMTP server: ')
# 输入收件人地址:
to_addr = input('请输入收件人邮箱地址To: ')

import smtplib
server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
server.quit()语句,是邮件发送结束后,停止服务的意思.好了,基本的版本算是完成了,那么现在还存在如下两个问题 1.邮件没有主题; 2.收件人的名字没有显示为友好的名字,比如Mr Green 这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,
所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件:
[Python] 纯文本查看 复制代码
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( Header(name, 'utf-8').encode(), addr))
# 输入Email地址和口令:
from_addr = input('请输入发件人的邮箱号码From: ')
password = input('请输入发件人的邮箱密码Password: ')
# 输入SMTP服务器地址:
smtp_server = input('请输入邮箱服务器地址SMTP server: ')
# 输入收件人地址:
to_addr = input('请输入收件人邮箱地址To: ')

msg = MIMEText('hi,你好吗,我的朋友', 'plain', 'utf-8')
msg['From'] = _format_addr(u'努力吧 <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'来自Hz的问候……', 'utf-8').encode()

server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
分析整个代码:

先看引入的模块文件
[Python] 纯文本查看 复制代码
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
这次引入的模块文件有点多,增加了四个模块。

1、encoders模块负责编码
2、Header模块负责处理邮件头
3、MIMEText模块负责处理文本
4、parseaddr模块与formataddr模块 负责将输入的内容格式化
[Python] 纯文本查看 复制代码
def _format_addr(s):
	name, addr = parseaddr(s)
	return formataddr(( Header(name, 'utf-8').encode(), addr))
# 之后对输入的内容进行格式化操作,将格式化后的内容赋值给变量

msg = MIMEText('hi,[/backcolor]你好吗,我的朋友', 'plain', 'utf-8')
[backcolor=white]msg['From'] = _format_addr(u'[/backcolor]努力吧 <%s>' % from_addr)
[backcolor=white]msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'来自Hz的问候……', 'utf-8').encode()
我们将发送邮箱、接收邮箱、邮件主题格式化完毕。
好了,接下来运行一下代码
[Python] 纯文本查看 复制代码
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( Header(name, 'utf-8').encode(), addr))
# 输入Email地址和口令:
from_addr = input('请输入发件人的邮箱号码From: ')
password = input('请输入发件人的邮箱密码Password: ')
# 输入SMTP服务器地址:
smtp_server = input('请输入邮箱服务器地址SMTP server: ')
# 输入收件人地址:
to_addr = input('请输入收件人邮箱地址To: ')

msg = MIMEText('hi,你好吗,我的朋友', 'plain', 'utf-8')
msg['From'] = _format_addr(u'努力吧 <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'来自Hz的问候……', 'utf-8').encode()

server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
邮件主题、发件人、内容是不是都有, 比之前规范多了。
但是,还有个小问题。
现在,我们的内容有点少,能不能多写点内容。
可以啊。 下面,我们将邮件内容丰富起来。
我们使用字符串增加邮件内容,使用三引号的字符串,就可以原样显示字符串内容。
[Python] 纯文本查看 复制代码
content = '''
亲爱的小明朋友:
    你好!
    我现在学习python写邮件!
    希望更方便!
'''

msg = MIMEText(content, 'plain', 'utf-8')
使用三引号字符串,将邮件内所有内容放入content变量中;将msg中的内容,换成content变量;将msg中的内容,换成content变量。

最终完整代码
[Python] 纯文本查看 复制代码
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
#对邮箱地址进行格式化
def _format_addr(s):
    name, addr = parseaddr(s)
    #formataddr是email类的内部函数,用于格式化
    return formataddr(( Header(name, 'utf-8').encode(), addr))

try:
    # 输入Email地址和口令:
    from_addr = input('请输入发件人的邮箱号码From: ')
    password = input('请输入发件人的邮箱密码Password: ')
    # 输入SMTP服务器地址:
    smtp_server = input('请输入邮箱服务器地址SMTP server: ')
    # 输入收件人地址:
    to_addr = []

    while True:
        #输入收件人邮箱地址
        a=input('请输入收件人邮箱:')
        to_addr.append(a)
        b=input('是否继续输入,n退出,任意键继续:')
        #如果b等于n,不再继续输入
        if b == 'n':
            break

    content = '''
    亲爱的小明朋友:    你好!
    我现在学习python写邮件!
    希望更方便!    '''
    #邮件内容
    msg = MIMEText(content, 'plain', 'utf-8')
    #发件人地址格式化
    msg['From'] = _format_addr(u'努力吧 <%s>' % from_addr)
    #收件人地址格式化
    msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
    #主题标题,进行编码
    msg['Subject'] = Header(u'来自Hz的问候……', 'utf-8').encode()
    # 邮件转发中心,发件人邮箱的smtp服务器,默认是25
    server = smtplib.SMTP_SSL(smtp_server, 465)
    #设置调试级别,可以查看发送过程中的信息
    server.set_debuglevel(1)
    #登入
    server.login(from_addr, password)
    #发送,收件人可以是多个,所以是数组
    server.sendmail(from_addr, [to_addr], msg.as_string())
    print('恭喜,发送成功')
except:
    print('发送失败,请重试')

server.quit()

最后说一下,其实很多内容我也不是太懂,也是参考了一些,虽然邮件功能可以直接调用,但是多少想了解一些。今天就到此为止~~

免费评分

参与人数 5吾爱币 +11 热心值 +4 收起 理由
楠宝 + 1 用心讨论,共获提升!
深水夜藏 + 1 + 1 热心回复!
EVANLEE + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ciss520 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

白晓生 发表于 2020-9-6 22:23
感谢楼主无私分享,现在找个课程很火呀,这回可以学学了
李斯隆 发表于 2020-9-6 22:30
leasae 发表于 2020-9-6 22:37
ygrdkl 发表于 2020-9-6 22:55
以后在学,学业较忙
Joshuacsj 发表于 2020-9-6 23:13
你学习的是哪个资源的 推荐下
小人类 发表于 2020-9-6 23:36
感谢分享学习经验!
yao5201478 发表于 2020-9-6 23:47
加油!!!!
bigdawn 发表于 2020-9-6 23:50
收藏备用。好好学一下
jiajia1714 发表于 2020-9-7 00:15
哈哈,我学的java,到现在都很懵逼,还在基础中挣扎
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 19:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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