Python发送邮件

Python发送邮件

python发邮件需要掌握两个模块的用法,smtplib和email。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

smtplib模块

from_addr:邮件发送者地址

to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'

msg:发送消息内容:

这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

connect(host,port):

  host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:

    新浪邮箱:smtp.sina.com,

    搜狐邮箱:smtp.sohu.com,

    163网易邮箱:smtp.163.com。

  port:指定连接服务器的端口号,默认为0.

login(user,password):

  user:登录邮箱的用户名。

  password:登录邮箱的密码

email模块

该mime包下常用的有三个模块:text,image,multpart

from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage
  • 如果构造一个MIMEText对象,就表示一个文本邮件对象
  • 如果构造一个MIMEImage对象,就表示一个作为附件的图片
  • 要把多个对象组合起来,就用MIMEMultipart对象

简单实例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText

mail_addr = '发件邮箱'
mail_pass = '密码'
to_mail = ‘收件人地址'

if __name__ == '__main__':
    smTp = smtplib.SMTP()
    smTp.connect('SMTP.163.com',25)
    # 打印debug日志
    smTp.set_debuglevel(1)
    smTp.login(mail_addr,mail_pass)
    info = MIMEText('hello word','plain','utf-8')
    smTp.sendmail(mail_addr,to_mail,info.as_string())
    smTp.close()

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

对邮件添加主题等信息

import smtplib
from email.mime.text import MIMEText
from email.header import Header

mail_addr = '发件邮箱'
mail_pass = '密码'
to_mail = '收件人'
# 邮件标题
mail_head = '邮件测试'
# 邮件内容
mail_content = '''
    This is an email
'''

if __name__ == '__main__':
    smTp = smtplib.SMTP()
    smTp.connect('SMTP.163.com',25)
    # 打印debug日志
    smTp.set_debuglevel(1)
    smTp.login(mail_addr,mail_pass)
    info = MIMEText(mail_content,'plain', 'utf-8')
    info['From'] = Header(mail_addr, 'utf-8')
    info['To'] = Header(to_mail)
    info['Subject'] = Header(mail_head)
    smTp.sendmail(mail_addr, to_mail, info.as_string())
    smTp.close()

使用Python发送HTML格式的邮件

 Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

mail_addr = '发件人账号'
mail_pass = '密码'
to_mail = '收件人邮箱'
# 邮件标题
mail_head = '邮件测试'
# 邮件内容
mail_content = '''
    <p>Python 邮件发送测试</p>
    <p><a href='https://www.baidu.com'>这是百度</a></p>
'''

if __name__ == '__main__':
    smTp = smtplib.SMTP()
    smTp.connect('SMTP.163.com',25)
    # 打印debug日志
    #smTp.set_debuglevel(1)
    smTp.login(mail_addr,mail_pass)
    info = MIMEText(mail_content,'html', 'utf-8')
    info['From'] = Header(mail_addr, 'utf-8')
    info['To'] = Header(to_mail)
    info['Subject'] = Header(mail_head)
    smTp.sendmail(mail_addr, to_mail, info.as_string())
    smTp.close()

Python 发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

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

# -------------------------------------------->
mail_addr = '发件人地址'
mail_pass = '密码'
to_mail = '收件人'
mail_head = 'test email 测试邮件'
mail_content = '''
    这是测试文件
'''
# 添加的附件
filepath = r'C:\Users\Administrator\Desktop\123.pdf'
# -------------------------------------------->
'''创建一个带附件的实例'''
message = MIMEMultipart()
message['From'] = Header(mail_addr)
message['To'] = Header(to_mail)
message['Subject'] = Header(mail_head, 'utf-8')
# 邮件正文内容
message.attach(MIMEText(mail_content, 'plain', 'utf-8'))
# 构建附件
att1 = MIMEText(open(filepath, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = "application/octet-stream"
att1["Content-Disposition"] = "attachment; filename=123.pdf"
print(os.path.basename(filepath))
message.attach(att1)

smTp = smtplib.SMTP()
smTp.connect('SMTP.163.com', 25)
# 打印debug日志
# smTp.set_debuglevel(1)
try:
    smTp.login(mail_addr, mail_pass)
except smtplib.SMTPAuthenticationError:
    print('用户认证失败!')
    exit()
smTp.sendmail(mail_addr, to_mail, message.as_string())
smTp.close()
posted @ 2019-12-13 16:49  杨灏  阅读(14)  评论(0编辑  收藏  举报