python stmp module 163邮箱发送邮件不成功

http://blog.csdn.net/lucahan/...
我照着这个的教程试了下,就卡在connect服务器上,一直连不上,我上网没有问题。
求教是什么原因!

阅读 19.3k
4 个回答

因为这很多教程都是过了N手的垃圾复制品, 转载者甚至都没做实际测试就转发了

我这段可以成功发送(Python3)

import smtplib
from email.mime.text import MIMEText

# 第三方 SMTP 服务
mail_host = "smtp.163.com"  # SMTP服务器
mail_user = "username"  # 用户名
mail_pass = "passwd"  # 密码

sender = 'user@163.com'  # 发件人邮箱(最好写全, 不然会失败)
receivers = ['to_someone@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱


content = '过期教程害死人!'
title = 'Python SMTP Mail Test'  # 邮件主题
message = MIMEText(content, 'plain', 'utf-8')  # 内容, 格式, 编码
message['From'] = "{}".format(sender)
message['To'] = ",".join(receivers)
message['Subject'] = title

try:
    smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信, 端口一般是465
    smtpObj.login(mail_user, mail_pass)  # 登录验证
    smtpObj.sendmail(sender, receivers, message.as_string())  # 发送
    print("mail has been send successfully.")
except smtplib.SMTPException as e:
    print(e)
    

发送结果如图:

clipboard.png

开发环境:
系统:Ubuntu 16.04 LTS
版本:python 3.5.2
邮箱服务器:stmp.126.com

注意:

1.不可正文群发带图,不然会被stmp.126.com认定为垃圾邮件,发不出去 - -!!! 也就是说该代码群发的话,只能用plain纯文本模式.

2.由于我的邮箱服务器是126的,所以建议也使用126邮箱测试,测试的前提是你需要开通客户端授权,开通后会让你设置密码,那个密码要记好,下面的passwd接收的是授权密码而不是邮箱密码!

3.代码中需要改的地方的地方: 发件人/授权密码/收件人/附件中图片的路径,以及下面的图片格式
若不需要发附件,把with:代码块隐藏即可

下面直接贴代码部分了,我自己已经测试过代码了,在以上环境运行没有问题,群发,单发,附件,邮件正文带图等等.

#!/usr/bin/python3
# coding:utf-8

#=========================================================================
# 加密SMTP
#
# 使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。  
#=========================================================================

    from email import encoders
    from email.header import Header
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr, formatdate
    
    import smtplib
    
    # return Alias_name <xxxx@example.com>
    
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    # 接收参数: 发件人地址
    from_addr = '你的邮箱地址'
    
    # 接收参数: 客户端授权密码
    passwd = '你的客户端授权密码'
    
    # 接收参数: 收件人地址,可多个
    to_addrs = ['ex@qq.com', 'ex@163.com', 'ex@gmail.com']
    
    # 接收参数: SMTP服务器(注意:是发件人的smtp服务器)
    smtp_server = 'smtp.126.com'
    
    
    # 接收参数: 邮件主题
    subject = '人生苦短'
    
    # 接收参数: 邮件正文
    plain = '我用python!'
    
    # 带附件邮件
    # 指定subtype为alternative,同时支持html和plain格式
    msg = MIMEMultipart('alternative')
    # 邮件正文中显示图片,同时附件的图片将不再显示
    # plain = 'Hello world and hello me!'
    msg.attach(MIMEText(str(plain), 'plain', 'utf-8'))       # 纯文本
    # html = '<html><body><h1>Hello</h1><p><img src="cid:0"></p></body></html>'
    # msg.attach(MIMEText(html, 'html', 'utf-8'))         # HTML
    # 添加附件:即关联一个MIMEBase,图片为本地读取
    with open('/home/uxeix/Pictures/icon/favicon (Jianshu).ico', 'rb') as f:
        # 设置附件中的MIME和文件名
        mime = MIMEBase('image', 'jpeg', filename='hot.jpg')
        # 加上必要的头信息
        mime.add_header('Content-Disposition', 'attachment',
                        filename='hot.jpg')
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来
        mime.set_payload(f.read())
        # 用Base64编码
        encoders.encode_base64(mime)
        # 添加到MIMEMultipart
        msg.attach(mime)
    
    # 未指定用户别名,则客户端会自动提取邮件地址中的名称作为邮件的用户别名
    msg['From'] = _format_addr(from_addr)
    # msg['To'] = _format_addr(to_addrs)
    msg['To'] = '%s' % ','.join([_format_addr('<%s>' % to_addr)
                                 for to_addr in to_addrs])
    msg['Subject'] = Header(str(subject), 'utf-8').encode()
    msg['Date'] = formatdate()
    
    
    #=========================================================================
    # 发送邮件
    #=========================================================================
    try:
        # SMTP服务器设置(地址,端口):
        server = smtplib.SMTP_SSL(smtp_server, 465)
        # server.set_debuglevel(1)
        # 连接SMTP服务器(发件人地址, 客户端授权密码)
        server.login(from_addr, passwd)
    
        # 发送邮件
        server.sendmail(from_addr, to_addrs, msg.as_string())
    
        print('邮件发送成功')
    
    except smtplib.SMTPException as e:
        print(e)
        print('邮件发送失败')
    
    finally:
        # 退出SMTP服务器
        server.quit()
#推荐一个发邮件库 envelopes 
from envelopes import Envelope
envelope = Envelope(
    from_addr=('from@example.com', 'From Example'),
    to_addr=('to@example.com', 'To Example'), 
    subject='Envelopes demo', 
    html_body='<h1>测试邮件</h1><h2>作者:sf</h2>', 
    text_body="这是一封测试邮件", 
    cc_addr='boss1@example.com', 
    bcc_addr='boss2@example.com',
    headers='',
    charset='',
)
envelope.add_attachment('test.jpg')#附件

envelope.send('smtp.163.com', login='from@example.com',password='password', tls=True)

Linux:Centos6.5

Python:2.7

我之前写过一个在生产环境跑起来的发送邮件脚本,使用stmp协议,见我的Github:
https://github.com/wing324/au...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题