forked from jackfrued/Python-100-Days
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
281 changed files
with
628 additions
and
634 deletions.
There are no files selected for viewing
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -297,3 +297,123 @@ if __name__ == '__main__': | |
|
||
传输层除了有可靠的传输协议TCP之外,还有一种非常轻便的传输协议叫做用户数据报协议,简称UDP。TCP和UDP都是提供端到端传输服务的协议,二者的差别就如同打电话和发短信的区别,后者不对传输的可靠性和可达性做出任何承诺从而避免了TCP中握手和重传的开销,所以在强调性能和而不是数据完整性的场景中(例如传输网络音视频数据),UDP可能是更好的选择。可能大家会注意到一个现象,就是在观看网络视频时,有时会出现卡顿,有时会出现花屏,这无非就是部分数据传丢或传错造成的。在Python中也可以使用UDP套接字来创建网络应用,对此我们不进行赘述,有兴趣的读者可以自行研究。 | ||
|
||
### 网络应用开发 | ||
|
||
#### 发送电子邮件 | ||
|
||
在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。 | ||
|
||
就像我们可以用HTTP(超文本传输协议)来访问一个网站一样,发送邮件要使用SMTP(简单邮件传输协议),SMTP也是一个建立在TCP(传输控制协议)提供的可靠数据传输服务的基础上的应用级协议,它规定了邮件的发送者如何跟发送邮件的服务器进行通信的细节,而Python中的smtplib模块将这些操作简化成了几个简单的函数。 | ||
|
||
下面的代码演示了如何在Python发送邮件。 | ||
|
||
```Python | ||
from smtplib import SMTP | ||
from email.header import Header | ||
from email.mime.text import MIMEText | ||
|
||
|
||
def main(): | ||
# 请自行修改下面的邮件发送者和接收者 | ||
sender = '[email protected]' | ||
receivers = ['[email protected]', '[email protected]'] | ||
message = MIMEText('用Python发送邮件的示例代码.', 'plain', 'utf-8') | ||
message['From'] = Header('王大锤', 'utf-8') | ||
message['To'] = Header('骆昊', 'utf-8') | ||
message['Subject'] = Header('示例代码实验邮件', 'utf-8') | ||
smtper = SMTP('smtp.126.com') | ||
# 请自行修改下面的登录口令 | ||
smtper.login(sender, 'secretpass') | ||
smtper.sendmail(sender, receivers, message.as_string()) | ||
print('邮件发送完成!') | ||
|
||
|
||
if __name__ == '__main__': | ||
main() | ||
``` | ||
|
||
如果要发送带有附件的邮件,那么可以按照下面的方式进行操作。 | ||
|
||
```Python | ||
from smtplib import SMTP | ||
from email.header import Header | ||
from email.mime.text import MIMEText | ||
from email.mime.image import MIMEImage | ||
from email.mime.multipart import MIMEMultipart | ||
|
||
import urllib | ||
|
||
|
||
def main(): | ||
# 创建一个带附件的邮件消息对象 | ||
message = MIMEMultipart() | ||
|
||
# 创建文本内容 | ||
text_content = MIMEText('附件中有本月数据请查收', 'plain', 'utf-8') | ||
message['Subject'] = Header('本月数据', 'utf-8') | ||
# 将文本内容添加到邮件消息对象中 | ||
message.attach(text_content) | ||
|
||
# 读取文件并将文件作为附件添加到邮件消息对象中 | ||
with open('/Users/Hao/Desktop/hello.txt', 'rb') as f: | ||
txt = MIMEText(f.read(), 'base64', 'utf-8') | ||
txt['Content-Type'] = 'text/plain' | ||
txt['Content-Disposition'] = 'attachment; filename=hello.txt' | ||
message.attach(txt) | ||
# 读取文件并将文件作为附件添加到邮件消息对象中 | ||
with open('/Users/Hao/Desktop/汇总数据.xlsx', 'rb') as f: | ||
xls = MIMEText(f.read(), 'base64', 'utf-8') | ||
xls['Content-Type'] = 'application/vnd.ms-excel' | ||
xls['Content-Disposition'] = 'attachment; filename=month-data.xlsx' | ||
message.attach(xls) | ||
|
||
# 创建SMTP对象 | ||
smtper = SMTP('smtp.126.com') | ||
# 开启安全连接 | ||
# smtper.starttls() | ||
sender = '[email protected]' | ||
receivers = ['[email protected]'] | ||
# 登录到SMTP服务器 | ||
# 请注意此处不是使用密码而是邮件客户端授权码进行登录 | ||
# 对此有疑问的读者可以联系自己使用的邮件服务器客服 | ||
smtper.login(sender, 'secretpass') | ||
# 发送邮件 | ||
smtper.sendmail(sender, receivers, message.as_string()) | ||
# 与邮件服务器断开连接 | ||
smtper.quit() | ||
print('发送完成!') | ||
|
||
|
||
if __name__ == '__main__': | ||
main() | ||
``` | ||
|
||
#### 发送短信 | ||
|
||
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了[互亿无线](http://www.ihuyi.com/)短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。 | ||
|
||
```Python | ||
import urllib.parse | ||
import http.client | ||
import json | ||
|
||
|
||
def main(): | ||
host = "106.ihuyi.com" | ||
sms_send_uri = "/webservice/sms.php?method=Submit" | ||
# 下面的参数需要填入自己注册的账号和对应的密码 | ||
params = urllib.parse.urlencode({'account': '你自己的账号', 'password' : '你自己的密码', 'content': '您的验证码是:147258。请不要把验证码泄露给其他人。', 'mobile': '接收者的手机号', 'format':'json' }) | ||
print(params) | ||
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'} | ||
conn = http.client.HTTPConnection(host, port=80, timeout=30) | ||
conn.request('POST', sms_send_uri, params, headers) | ||
response = conn.getresponse() | ||
response_str = response.read() | ||
jsonstr = response_str.decode('utf-8') | ||
print(json.loads(jsonstr)) | ||
conn.close() | ||
|
||
|
||
if __name__ == '__main__': | ||
main() | ||
``` |
File renamed without changes.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Oops, something went wrong.