使用python发送邮件

594 阅读4分钟

发送邮件这个功能非常实用,比如你写了一个爬虫,可以通过邮件来接收程序异常或者任务完成的通知,再比如你搭了一个网站,别人只需留下他的邮箱,你就可以自动给他发送邮件。

总之我觉得邮件通知非常适合那些处理批量、大量任务,你可以不用守在电脑前等待处理结果,在程序里配置好邮件通知后,只需留意邮箱通知就好了。

下面我们一起来看看如何使用 python 来实现邮件发送,邮件一般分为纯文本邮件、html 邮件、以及带附件邮件,今天我们使用 python 来分别实现这三种邮件的发送。

在 python 实现发送邮件需要两个模块,分别是 smtplib 和 email,这两个模块都是内置的,不需要自己安装,直接 import 导入即可。

email 主要是用来构建邮件的,比如邮件收发人、邮件标题、邮件正文以及附件啥的,smtplib 则是用来发送邮件的。

这里我们使用 qq 邮箱来作为发件邮箱,在使用前,需要简单的配置下 qq 邮箱。

打开 qq 邮箱,依次找到 设置 -> 账户,然后检查 POP3/SMTP 服 务是否开启。

如果没开启则开启,根据提示开启之后我们需要获取授权码,这个授权码下面我们会要用到的,这一步只要获取到授权码就行了。

我们先来实现一个简单的纯文本邮件发送,我这里只把一些关键的代码解释一下,文章最后面再附上完整的源码。

  • 纯文本邮件

首先就是使用 email 模块构建邮件,plain 即代表文本邮件,邮件构建完后,再使用 smtplib 发送邮件。

#构建纯文本邮件
from email.mime.text import MIMEText  
from email.header import Header
msg = MIMEText('我是邮件正文...', 'plain', 'utf-8') # plain 表示纯文本邮件  
msg['From'] = "这里是发件者邮箱"
msg['To'] = "这里是收件者邮箱"
msg['Subject'] = Header("我是邮件的标题", 'utf-8') #邮件标题

#使用smtplib模块发送邮件
email_client = smtplib.SMTP("smtp.qq.com")
email_client.login("这里是发件者邮箱", "这里就是上面提到获取到的授权码")
email_client.sendmail("这里是发件者邮箱", "这里是收件件者邮箱", msg.as_string())
email_client.quit()

发送邮件的时候有两个需要注意的地方,一个是 smtplib.SMTP 的邮件服务器设置。

这里我们用的 qq 邮箱作为发件邮箱,所以设置为 smtp.qq.com,如果是其他邮箱如网易邮箱,则需要设置为 smtp.163.com。

再一个需要注意的就是 login 方法了,这个登录方法里的第二个参数是指上面提到的授权码,并不是你发件邮箱的登录密码。

  • html 邮件

html 邮件主要是可以给邮件内容定义更丰富的样式,而且可以很方便的插入链接。html 邮件和纯文本邮件大同小异,把完整的 html 内容作为文本内容就行,再把 plain 改为 html 类型即可。

#构建html邮件
content = '<html><body><h3>Hello,这是一封 html 邮件,点击链接可以去看我的博客哈。</h3>' + '<p><a href="www.weatherfood.com">谭某人的博客</a></p>' + '</body></html>'
puretext = MIMEText(content, 'html', 'utf-8')  
  • 附件邮件

附件邮件稍微麻烦一些,在构建邮件对象的时候,就需要声明构建一个附件邮件对象,msg = MIMEMultipart(),然后再添加 MIMEText 作为邮件正文,最后再把 MIMEApplication 作为附件加入即可。

  • 完整源码

最后我再附上一份完整的带图片附件且正文为 html 的邮件发送源码,注意把源码中的发件邮箱改成你自己的邮箱,并获取发件邮箱的授权码。

# coding=utf-8

import smtplib  
from email.mime.text import MIMEText  
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart  


#邮件发送函数
#SMTPHost 邮件服务器
#fromAccount 发件邮箱
#fromPasswd 发件邮件授权码,注意并不是邮箱登录密码
#toAccount 收件邮箱
#subject 邮件标题
#content 邮件正文

def sendMail(SMTPHost, fromAccount, fromPasswd, toAccount, subject, content):    

    #构建邮件
    msg = MIMEMultipart()
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = fromAccount
    msg['To'] = toAccount

    content = '<html><body><h3>Hello,这是一封 html 邮件,点击链接可以去看我的博客哈。</h3>' + '<p><a href="www.weatherfood.com">谭某人的博客</a></p>' + '</body></html>'
    puretext = MIMEText(content, 'html', 'utf-8')

    msg.attach(puretext)


    # 附件
    xlsxpart = MIMEApplication(open('tim.jpg', 'rb').read()) #这里填写你自己目录下的附件文件
    xlsxpart.add_header('Content-Disposition', 'attachment', filename='tim.jpg')
    msg.attach(xlsxpart)

    #使用smtplib模块发送邮件
    email_client = smtplib.SMTP(SMTPHost)
    email_client.login(fromAccount, fromPasswd)
    email_client.sendmail(fromAccount, toAccount, msg.as_string())
    email_client.quit()


#主函数
if __name__ == '__main__':
   sendMail(
       'smtp.qq.com',
       '********@qq.com',#你的邮箱
       '**********',#授权码
       'playactors@163.com',
       '很开心你来看我的文章了,欢迎关注哦。',
       '文章中有疑问的地方,欢迎留言与我联系哈,感谢你的支持!'
    )

有问题欢迎在下面留言交流,也欢迎关注,如果觉得对你有帮助就点个赞吧,感谢支持。