使用 Python 实现 SMTP 协议发送邮件

说在前面:
        SMTP:SMTP 是发送邮件的协议,Python 内置了对 SMTP 的操作,可以发送 Text,HTML以及带附件的邮件

Python 中有 smtplibemail 两个模块对 SMTP 进行操作

  • smtplib:负责发送邮件
  • email:负责构建邮件

步入正题:
        网上很多教程,在此记录我操作的步骤;

  • 首先我们需要一个可以发送邮件的邮箱作为发送邮件的一方,一开始我使用的是网易的 163 邮箱,但是在后面发现 163 的邮箱限制比较多,卡了一段时间,如果是一开始的话建议直接使用 QQ 邮箱。

  • 需要打开邮箱的 SMTP 服务
    smtp
    拿 QQ 邮件来举例
    qq_email_setup
    由于我以前开启过这个服务,其中有些东西不再重复操作
    set_smtp
    记住最后生成的授权码,后期会使用到
    到这里发送邮件的邮箱就搞定了

  • 开始 Python 的操作

    #/usr/bin/python3
    # -*- encoding: utf-8 -*-
    
    import smtplib
    from email import encoders
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.header import Header
    from email.utils import formataddr, parseaddr
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr([ \
            Header(name, 'utf-8').encode(), \
            addr.encode('utf-8') if isinstance(addr, bytes) else addr])
    
    from_addr = 'xxxxxx@qq.com'
    password = 'xxxxxxxxxxxxxx'		# 在上面获取的授权码
    smtp_server = 'smtp.qq.com'		# 这个都是一样的
    to_addr = 'xxxxxxx@163.com'		# 收邮件的邮箱
    
    # 创建邮件对象
    msg = MIMEMultipart()
    
    # msg = MIMEText('Python SMTP Test...', 'plain', 'utf-8')
    msg.attach(MIMEText('<html><body><h1>SMTP</h1>'
                   '<p>send by<a href="http://www.python.org">Python</a>...</p>'
                   '</body></html>', 'html', 'utf-8'))
    msg['From'] = _format_addr(u'Python <%s>' % from_addr)
    # 如果有多个邮件对象,最后的结果会有问题,但不影响使用,可以将其写死,不对其进行格式化
    msg['To'] = _format_addr(u'my_python <%s>' % to_addr)
    # msg['To'] = Header('my_python', 'utf-8')
    msg['Subject'] = Header(u'Python SMTP TEST......', 'utf-8').encode()
    
    # 添加附件
    with open('./smtp_mail.py', 'rb') as f:
        mime = MIMEBase('text', 'py', filename='smtp.py')
        # filename 表示的是邮件中显示的附件名称
        mime.add_header('Content-Disposition', 'attachment', filename = 'smtp.py')
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        mime.set_payload(f.read())
        encoders.encode_base64(mime)
        msg.attach(mime)
    
    # 正式发送
    try:
        server = smtplib.SMTP(smtp_server, 25)
        server.set_debuglevel(1)    # 输出发送时候的具体操作
        server.login(from_addr, password)
        # split 返回的是 list 所以不需要再加中括号
        server.sendmail(from_addr, to_addr.split(','), msg.as_string())
        server.quit()
        print('邮件发送成功!')
    except smtplib.SMTPException as e:
        print('邮件发送失败!')
        print(e)
    

    很杂,还有一种附件显示的部分没有做

    在写文章的时候想到一个很重要的问题:
            我们实现的群发实际上是分成多个邮件发给不同的人,而不是一封邮件抄送给不同的人,值得思考。

    参考: 廖雪峰的官方网站

End

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值