Python 发送邮件

SMTP发送邮件

SMTP是邮件发生的协议,Python内置对SMTP的支持,可以通过Pytho发送纯文本邮件、Html邮件以及带附件的邮件
其中PYthon对SMTP只有的有smtplib和email两个模块,email负责构造邮件,smtplib负责邮件发送

1.首先来一个纯文本邮件的demo

from email.mime.text import MIMEText
import smtplib
info = MIMEText('Hello World','plain','utf-8')
#构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,'plain'表示纯文本,最终MIME就是'text/plain',第三个为字符集 
#定义Email地址和密码
from_addr = 'xxx@xxx.com'
password = 'xxxxxx'
#收件人邮箱地址
to_user = 'xxxxx@xxx.com'
#SMTP邮件服务器地址
smtp_server = 'xxx.smtp.com'

s = smtplib.SMTP(smtp_server,25) #定义一个s对象
s.set_debuglevel(1) #打印debug日志
s.login(from_server,password) #auth发件人信息
server.sendmail(from_addr,to_addr,info.as_string())
s.quit()

测试下,OK可以收到邮件,但是这个邮件没有主题和发件人等信息,这样的邮件很容易被邮件管理系统标记为垃圾邮件甚至被直接拒绝,所以,我们需要对邮件进行添加主题等信息

2.对一个邮件添加主题等信息

#!/bin/env python
#-*- 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

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

msg = MIMEText('Hello 这封是带主题的', 'plain', 'utf-8')
msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()

s = smtplib.SMTP(smtp_addr,25) #定义一个s对象
s.set_debuglevel(1) #打印debug日志
s.login(from_addr,passwd) #auth发件人信息
s.sendmail(from_addr,to_addr,msg.as_string())
s.quit()

这里写了一个函数_format_addr()用来格式化邮件的地址

HTMl格式的邮件
msg = MIMEText('

Hello

' +
'

send by Python...

' +
'', 'html', 'utf-8')

3.大招 发送附件

#!/bin/env python
#-*- coding:utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
import smtplib

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

msg = MIMEMultipart()
msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/tmp/1.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='1.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment',
    filename='1.png')
    mime.add_header('Content-ID', '<0>')

同时支持HTML和Plain格式
如果发html格式邮件,收件人如果不支持就无法浏览,so可以选择同时支持

msg = MIMEMultipart('alternative')
msg['From'] = ...
msg['To'] = ...
msg['Subject'] = ...

msg.attach(MIMEText('hello', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html',     'utf-8'))
# 正常发送msg对象...

加密SMTP

smtp_server = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
# 剩下的代码和前面的一模一样:
server.set_debuglevel(1)

总结:
smtplib 只需要掌握构造方法 设置好邮件开头 就可以顺利发送邮件
构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

        Message
    +- MIMEBase
       +- MIMEMultipart
       +- MIMENonMultipart
          +- MIMEMessage
          +- MIMEText
          +- MIMEImage
原文地址:https://www.cnblogs.com/czalinux/p/7891905.html