V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sakuoz
V2EX  ›  Python

求教!关于 Python3 SMTP 发送邮件的编码问题

  •  
  •   sakuoz · 2017-05-09 18:15:27 +08:00 · 3461 次点击
    这是一个创建于 2756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在跟着学习廖雪峰的 Python 教程,到发送邮件这一章出现了编码问题,搜索一直得不到解决,特来求助广大 V 友。

    以下是代码部分:

    from email.mime.text import MIMEText
    
    msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
    
    # 输入 Email 地址和口令:
    from_addr = input('From: ')
    password = input('Password: ')
    # 输入收件人地址:
    to_addr = input('To: ')
    # 输入 SMTP 服务器地址:
    smtp_server = input('SMTP server: ')
    
    import smtplib
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    

    报错:

    SMTP server: smtp.qq.com
    send: 'ehlo Sakuoz 丶.lan\r\n'
    Traceback (most recent call last):
      File "F:\github\pythonTest\pytest.py", line 16, in <module>
        server.login(from_addr, password)
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\smtplib.py", line 693, in login
        self.ehlo_or_helo_if_needed()
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\smtplib.py", line 599, in ehlo_or_helo_if_needed
        if not (200 <= self.ehlo()[0] <= 299):
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\smtplib.py", line 439, in ehlo
        self.putcmd(self.ehlo_msg, name or self.local_hostname)
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\smtplib.py", line 366, in putcmd
        self.send(str)
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\smtplib.py", line 351, in send
        s = s.encode(self.command_encoding)
    UnicodeEncodeError: 'ascii' codec can't encode character '\u4e36' in position 11: ordinal not in range(128)
    

    \u4e36 经过 unicode 转换为中文丶,我发送的邮件( QQ to 163 )昵称中也有个丶,所以怀疑可能与昵称有关,但是经过测试删掉昵称中的丶还是报同样的错误,萌新的我一直不知道错在什么地方。。。请问问题出在哪里,该怎么解决,谢谢大家!

    开发环境:

    • windows 10 64bit
    • python 3.5.2
    • atom
    5 条回复    2017-05-09 19:43:00 +08:00
    gulucn
        1
    gulucn  
       2017-05-09 18:42:04 +08:00 via Android   ❤️ 1
    self.putcmd(self.ehlo_msg, name or self.local_hostname)
    你的主机名有中文吧。
    TimePPT
        2
    TimePPT  
       2017-05-09 18:45:02 +08:00
    你输入的昵称出现在哪里? from_addr to_addr 都不允许直接传昵称
    sakuoz
        3
    sakuoz  
    OP
       2017-05-09 19:28:07 +08:00
    @gulucn 好像是,我最近无聊改过一次,我去试试


    @TimePPT 没有传,以上就是全部代码,没一句中文-_-||
    TimePPT
        4
    TimePPT  
       2017-05-09 19:28:58 +08:00   ❤️ 1
    @sakuoz 好吧……那有可能是主机名问题
    sakuoz
        5
    sakuoz  
    OP
       2017-05-09 19:43:00 +08:00
    @TimePPT
    @gulucn
    谢谢楼上二位,已解决,真的是主机名问题,一直都没往这个方向想,学习了,自己没事瞎改啥主机名(捂脸)
    结贴
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:15 · PVG 15:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.