使用SMTP发送邮件

一、发送文本型内容

代码如下:

 -*- coding: utf-8-*-  #没有这句话,发送不了中文

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = '发件地址@qq.com'
password = '客户端授权登陆密码'
to_addr = '收件地址@qq.com'
smtp_server = 'smtp.qq.com' 

msg = MIMEText('hello, send by ...', 'plain', 'utf-8')
msg['From'] = _format_addr('你猜我是谁 <%s>' % from_addr)
msg['To'] = _format_addr('笨蛋 <%s>' % to_addr)
msg['Subject'] = Header('来自温暖被窝的问候……', 'utf-8').encode()

server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

二、发送HTML格式邮件

msg = MIMEText('hello, send by ...', 'plain', 'utf-8')

替换为:

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
"""
msg = MIMEText(mail_msg, 'html', 'utf-8')

遇到的问题:

1、要确保自己的邮箱地址开启了smtp服务,开启服务的方法网上也有。

2、不同邮箱的smtp服务地址(smtp_server)不同,可以上网搜索。


3、如果不设置客户端授权登陆密码 :smtplib.SMTPAuthenticationError: (``530``, 'Error: A secure connection is requiered(such as ssl). More information at [http://service.mail.qq.com/cgi-bin/help?id=28](http://service.mail.qq.com/cgi-bin/help?id=28)'``)

程序报503错误
原因:需要一个安全的连接,例如SSL,因此我们要使用SSL的方式去登录

4、设置客户端授权登陆密码
打开qq邮箱,点击设置->
账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启IMAP/SMTP服务,然后根据要求使用手机发送到指定号码,获取授权码,
这个授权码就是你接下来登录要使用的密码,配置完成,上代码,另,QQ的授权码有效期为30天。

5、改了上面的SSL之后,运行报错
我原来的代码是server = smtplib.SMTP(smtp_server, 465)
后来改为:server = smtplib.SMTP_SSL(smtp_server, 465)即可。

6、注意,代码中的465代表端口号,不同的服务端口号不同。

推荐阅读更多精彩内容