Python smtplib实现发送邮件功能


Posted in Python onMay 22, 2018

本文实例为大家分享了Python smtplib发送邮件功能的具体代码,供大家参考,具体内容如下

解决之前版本的问题,下面为最新版

#!/usr/bin/env python 
# coding:gbk 
 
""" 
FuncName: sendemail.py 
Desc: sendemail with text,image,audio,application... 
Date: 2016-06-20 10:30 
Home: http://blog.csdn.net/z_johnny 
Author: johnny 
""" 
 
from email.mime.multipart import MIMEMultipart 
from email.mime.application import MIMEApplication 
from email.utils import COMMASPACE 
from email.mime.text import MIMEText 
from email.mime.image import MIMEImage 
from email.mime.audio import MIMEAudio 
import ConfigParser 
import smtplib 
import os 
 
class MyEmail: 
 def __init__(self, email_config_path, email_attachment_path): 
  """ 
  init config 
  """ 
  config = ConfigParser.ConfigParser() 
  config.read(email_config_path) 
  self.attachment_path = email_attachment_path 
 
  self.smtp = smtplib.SMTP() 
  self.login_username = config.get('SMTP', 'login_username') 
  self.login_password = config.get('SMTP', 'login_password') 
  self.sender = config.get('SMTP', 'login_username') # same as login_username 
  self.receiver = config.get('SMTP', 'receiver') 
  self.host = config.get('SMTP', 'host') 
  #self.port = config.get('SMTP', 'port')  发现加入端口后有时候发邮件出现延迟,故暂时取消 
 
 def connect(self): 
  """ 
  connect server 
  """ 
  #self.smtp.connect(self.host, self.port) 
  self.smtp.connect(self.host) 
 
 def login(self): 
  """ 
  login email 
  """ 
  try: 
   self.smtp.login(self.login_username, self.login_password) 
  except: 
   raise AttributeError('Can not login smtp!!!') 
 
 def send(self, email_title, email_content): 
  """ 
  send email 
  """ 
  msg = MIMEMultipart()     # create MIMEMultipart 
  msg['From'] = self.sender    # sender 
  receiver = self.receiver.split(",")  # split receiver to send more user 
  msg['To'] = COMMASPACE.join(receiver) 
  msg['Subject'] = email_title   # email Subject 
  content = MIMEText(email_content, _charset='gbk') # add email content ,coding is gbk, becasue chinese exist 
  msg.attach(content) 
 
  for attachment_name in os.listdir(self.attachment_path): 
   attachment_file = os.path.join(self.attachment_path,attachment_name) 
 
   with open(attachment_file, 'rb') as attachment: 
    if 'application' == 'text': 
     attachment = MIMEText(attachment.read(), _subtype='octet-stream', _charset='GB2312') 
    elif 'application' == 'image': 
     attachment = MIMEImage(attachment.read(), _subtype='octet-stream') 
    elif 'application' == 'audio': 
     attachment = MIMEAudio(attachment.read(), _subtype='octet-stream') 
    else: 
     attachment = MIMEApplication(attachment.read(), _subtype='octet-stream') 
 
   attachment.add_header('Content-Disposition', 'attachment', filename = ('gbk', '', attachment_name)) 
   # make sure "attachment_name is chinese" right 
   msg.attach(attachment) 
 
  self.smtp.sendmail(self.sender, receiver, msg.as_string()) # format msg.as_string() 
 
 def quit(self): 
  self.smtp.quit() 
 
def send(): 
 import time 
 ISOTIMEFORMAT='_%Y-%m-%d_%A' 
 current_time =str(time.strftime(ISOTIMEFORMAT)) 
 
 email_config_path = './config/emailConfig.ini' # config path 
 email_attachment_path = './result'    # attachment path 
 email_tiltle = 'johnny test'+'%s'%current_time # as johnny test_2016-06-20_Monday ,it can choose only file when add time 
 email_content = 'python发送邮件测试,包含附件' 
 
 myemail = MyEmail(email_config_path,email_attachment_path) 
 myemail.connect() 
 myemail.login() 
 myemail.send(email_tiltle, email_content) 
 myemail.quit() 
 
if __name__ == "__main__": 
 # from sendemail import SendEmail 
 send()

配置文件emailConfig.ini

路径要与程序对应

;login_username : 登陆发件人用户名 
;login_password : 登陆发件人密码 
;host:port : 发件人邮箱对应的host和端口,如:smtp.163.com:25 和 smtp.qq.com:465 
;receiver : 收件人,支持多方发送,格式(注意英文逗号): 123456789@163.com,zxcvbnm@qq.com 

[SMTP] 
login_username = johnny@163.com 
login_password = johnny 
host = smtp.163.com 
port = 25 
receiver = johnny1@qq.com,johnny2@163.com,johnny3@gmail.com

之前版本出现的问题:

#!/usr/bin/env python 
#coding: utf-8 
 
''''' 
FuncName: smtplib_email.py 
Desc: 使用smtplib发送邮件 
Date: 2016-04-11 14:00 
Author: johnny 
''' 
 
import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.mime.base import MIMEBase 
from email.utils import COMMASPACE,formatdate 
from email import encoders 
 
def send_email_text(sender,receiver,host,subject,text,filename): 
  
 assert type(receiver) == list 
 
 msg = MIMEMultipart() 
 msg['From'] = sender 
 msg['To'] = COMMASPACE.join(receiver) 
 msg['Subject'] = subject 
 msg['Date'] = formatdate(localtime=True) 
 msg.attach(MIMEText(text))     #邮件正文内容 
 
 for file in filename:      #邮件附件 
  att = MIMEBase('application', 'octet-stream') 
  att.set_payload(open(file, 'rb').read()) 
  encoders.encode_base64(att) 
  if file.endswith('.html'):    # 若不加限定,jpg、html等格式附件是bin格式的 
   att.add_header('Content-Disposition', 'attachment; filename="今日测试结果.html"')   # 强制命名,名称未成功格式化,如果可以解决请联系我 
  elif file.endswith('.jpg') or file.endswith('.png') : 
   att.add_header('Content-Disposition', 'attachment; filename="pic.jpg"') 
  else: 
   att.add_header('Content-Disposition', 'attachment; filename="%s"' % file) 
  msg.attach(att) 
 
 smtp = smtplib.SMTP(host)   
 smtp.ehlo() 
 smtp.starttls() 
 smtp.ehlo() 
 smtp.login(username,password) 
 smtp.sendmail(sender,receiver, msg.as_string()) 
 smtp.close() 
 
if __name__=="__main__": 
 sender = 'qqq@163.com' 
 receiver = ['www@qq.com'] 
 subject = "测试" 
 text = "johnny'lab test" 
 filename = [u'测试报告.html','123.txt',u'获取的信息.jpg'] 
 host = 'smtp.163.com' 
 username = 'qqq@163.com' 
 password = 'qqq' 
 send_email_text(sender,receiver,host,subject,text,filename)

已测试通过,使用Header并没有变成“头”,故未使用

若能解决附件格式为(html、jpg、png)在邮箱附件中格式不为“bin”的请联系我,希望此对大家有所帮助,谢谢(已解决,见上面最新版

点击查看:Python 邮件smtplib发送示例 

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

Python 相关文章推荐
Python内置的字符串处理函数整理
Jan 29 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
python遍历小写英文字母的方法
Jan 02 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python 堆和优先队列的使用详解
Mar 05 Python
Django异步任务之Celery的基本使用
Mar 23 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
分享Python获取本机IP地址的几种方法
Mar 17 Python
linux下python使用sendmail发送邮件
May 22 #Python
Python实现的文本对比报告生成工具示例
May 22 #Python
python smtplib模块实现发送邮件带附件sendmail
May 22 #Python
点球小游戏python脚本
May 22 #Python
python smtplib模块自动收发邮件功能(二)
May 22 #Python
python smtplib模块自动收发邮件功能(一)
May 22 #Python
python模块smtplib学习
May 22 #Python
You might like
php获取英文姓名首字母的方法
2015/07/13 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
详解Python中expandtabs()方法的使用
2015/05/18 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Python类属性的延迟计算
2016/10/22 Python
Python3中使用PyMongo的方法详解
2017/07/28 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
机电专业毕业生求职信
2013/10/27 职场文书
四群教育工作实施方案
2014/03/26 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
采购部年度工作总结
2015/08/13 职场文书
学习委员竞选稿
2015/11/20 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL