python实现邮件自动发送


Posted in Python onAugust 10, 2019

本文实例为大家分享了python实现邮件自动发送的具体代码,供大家参考,具体内容如下

case 1:纯文本和HTML文件发送

# -*- coding: UTF-8 -*-


import smtplib
import traceback
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password):
 '''
 @subject:邮件主题
 @msg:邮件内容
 @toaddrs:收信人的邮箱地址
 @fromaddr:发信人的邮箱地址
 @smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
 @password:发信人的邮箱密码
 '''

 mail_msg = MIMEMultipart()
 if not isinstance(subject,unicode): #过滤或者不过滤貌似没啥影响
  subject = unicode(subject, 'utf-8')
 mail_msg['Subject'] = subject
 mail_msg['From'] =fromaddr
 mail_msg['To'] = ','.join(toaddrs)
 mail_msg.attach(MIMEText(msg, 'plain', 'utf-8')) #f发送文本文件
 #mail_msg.attach(MIMEText(msg, 'html', 'utf-8')) #发送html格式邮件
 try:
  s = smtplib.SMTP()
  s.connect(smtpaddr) #连接smtp服务器
  s.login(fromaddr,password) #登录邮箱
  s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) #发送邮件
  s.quit()
  print "邮件发送成功!"
 except Exception,e:
  print "Error: unable to send email"
  print traceback.format_exc()


if __name__ == '__main__':
 fromaddr = "h******m@126.com"
 smtpaddr = "smtp.126.com"
 toaddrs = ["83****789@qq.com","h******m@126.com"]
 subject = "Hello,我是邮件主题"
 password = "不能告诉你"
 #msg = "Hello,我是邮件内容 !!!"
 msg="""
 <p>Python 邮件发送测试...</p>
 <p><a href="http://www.runoob.com" >这是一个链接</a></p>
 """
 sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password)

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

# -*- coding: UTF-8 -*-

# 如何添加附件
import os


import smtplib
import traceback
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
os.chdir("C:\\Users\\h****m\\Desktop\\Auto_email")


def sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password):
 '''
 @subject:邮件主题
 @msg:邮件内容
 @toaddrs:收信人的邮箱地址
 @fromaddr:发信人的邮箱地址
 @smtpaddr:smtp服务地址,可以在邮箱看,比如163邮箱为smtp.163.com
 @password:发信人的邮箱密码
 '''


 mail_msg = MIMEMultipart()
 if not isinstance(subject,unicode): #过滤或者不过滤貌似没啥影响
  subject = unicode(subject, 'utf-8')
 mail_msg['Subject'] = subject
 mail_msg['From'] =fromaddr
 mail_msg['To'] = ','.join(toaddrs)
 #mail_msg.attach(MIMEText(msg, 'plain', 'utf-8')) #f发送文本文件
 mail_msg.attach(MIMEText(msg, 'html', 'utf-8')) #发送html格式邮件
 
 #构造附件1
 att1=MIMEText(open("test_file1.txt",'rb').read(),'base64','utf-8') #注意:直接读取中文文件名会报错 
 att1["Content-Type"] = 'application/octet-stream'
 att1["Content-Disposition"] = 'attachment; filename="test_file1.txt"'
 mail_msg.attach(att1)
 
 
 #构造附件2:添加中文附件名
 att2=MIMEText(open(u'测试文件2.docx','rb').read(),'base64','utf-8')
 att2["Content-Type"] = 'application/octet-stream'
 att2["Content-Disposition"] = 'attachment; filename="test_file2.docx"'
 mail_msg.attach(att2)
 
 try:
  s = smtplib.SMTP()
  s.connect(smtpaddr) #连接smtp服务器
  s.login(fromaddr,password) #登录邮箱
  s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) #发送邮件
  s.quit()
  print "邮件发送成功!"
 except Exception,e:
  print "Error: unable to send email"
  print traceback.format_exc()


if __name__ == '__main__':
 fromaddr = "h****m@126.com"
 smtpaddr = "smtp.126.com"
 toaddrs = ["83****789@qq.com","h****m@126.com"]
 subject = "Hello,我是邮件主题"
 password = "不能告诉你"
 #msg = "Hello,我是邮件内容 !!!"
 msg="""
 <p>Python 邮件发送测试...</p>
 <p><a href=http://www.runoob.com >这是一个链接</a></p>
 """
 sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password)

case 3: 发送图片(容易被判别为垃圾邮件,导致:SMTPDataError: (554, 'DT:SPM 126……错误)

# -*- coding: utf-8 -*-

fromaddr = "h****m@126.com"
smtpaddr = "smtp.126.com"
toaddrs = ["83****789@qq.com","h****m@126.com"]
subject = "Hello,我是邮件主题"
password = "不能告诉你"

#test3
msg = """
<p>Python 邮件发送添加图片测试...</p>
<p><a href="http://www.runoob.com" >菜鸟教程链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""

import os
import smtplib

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
os.chdir("C:\\Users\\h****m\\Desktop\\Auto_email")

msgRoot = MIMEMultipart('related')
if not isinstance(subject,unicode): #过滤或者不过滤貌似没啥影响
 subject = unicode(subject, 'utf-8')


msgRoot['Subject'] = subject
msgRoot['From'] =fromaddr
msgRoot['To'] = ','.join(toaddrs)


msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)

msg = """
<p>Python 邮件发送测试...</p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(msg, 'html', 'utf-8'))


fp = open('test.PNG', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

s = smtplib.SMTP()
s.connect(smtpaddr) #连接smtp服务器
s.login(fromaddr,password) #登录邮箱
s.sendmail(fromaddr, toaddrs, msgRoot.as_string()) #发送邮件
s.quit()
print "邮件发送成功!"

#邮件发送成功!

对于case3,发送很不稳定,时而发送得出,时而报 SMTPDataError: 554错误,等有空了,看有没有方法弄个稳定的版本。case1,case2在工作中基本够用了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pygame学习笔记(5):游戏精灵
Apr 15 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
python 数据库查询返回list或tuple实例
May 15 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
python单例模式的应用场景实例讲解
Feb 24 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 #Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 #Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 #Python
Python中的 sort 和 sorted的用法与区别
Aug 10 #Python
Python测试模块doctest使用解析
Aug 10 #Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 #Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 #Python
You might like
也谈php网站在线人数统计
2008/04/09 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
详解Python requests 超时和重试的方法
2018/12/18 Python
详解python编译器和解释器的区别
2019/06/24 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
pywinauto自动化操作记事本
2019/08/26 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
经典C++面试题一
2016/11/06 面试题
论文诚信承诺书
2014/05/23 职场文书
最常使用的求职信
2014/05/25 职场文书
电教室标语
2014/06/20 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书