python发送邮件学习

一个简单的邮件发送的例子,代码如下:

import smtplib
from email.mime.text import MIMEText

smtp_server = 'smtp.qq.com'

email_user = 'xxxxxxxxxx@qq.com'
email_pass = ''()

sender = email_user
receiver = 'xxxxxxxxx@qq.com'

msg = MIMEText(u'test')

server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
server.login(email_user, email_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
print('finish')

但是我在自己电脑上面执行这个代码的时候竟然报错了
这里写图片描述
从错误信息上来看是因为我的代码里面有中文字符串导致编码格式有问题,但是本身这个代码里面是没有任何中文输入输出的,所以只能单步调试,调试哪里出现了中文入参。
当调试到:

fqdn = socket.getfqdn()

这里下一步的时候会跳转到这里
这里写图片描述
并且input入参里面有中文名,查看前后文发现这里是获取了我的计算机名。然后在这里抛出异常

 try:
        hostname, aliases, ipaddrs = gethostbyaddr(name)
 except error:
        pass

因为我后面又写了一段测试程序来验证这个问题:

import socket

a = socket.gethostname()
print(a)
b = socket.gethostbyaddr(a)
print(b)

执行出来的结果和上面的一直,socket.gethostaddr()的时候传入的中文字符串会抛出错误。
这里写图片描述
这里可以看出来socket.gethostbyaddr是直接将 张彬彬 三个汉字直接作为入参传入的,而没有经过编码处理,所以我改了socket.py里面的代码,有两个改法:
1、hostname, aliases, ipaddrs = gethostbyaddr(name.encode())
传入编码后的值,这样下面识别的时候还是识别张彬彬这三个汉字,只是编码过后的结果而已。
2、hostname, aliases, ipaddrs = gethostbyaddr(repr(name))
使用repr方法将name转为机器可以识别的字符串格式,这里就可以很明显的区分str和repr的区别,使用repr之后结果正常,而是用str()则不可行,我的猜想是gethostbyaddr就已经是面向底层的东西了,所以需要编码过后的或者面向底层的格式才可以,所以repr返回的结果可以被接受,而str不可行。因为gethostbyaddr()这个方法的实现我已经找不到了,所以猜测是调用的底层库。

这点欢迎大家讨论,我只是用python3.6.3测试出来的结果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值