Python smtplib实现发送邮件功能

本文实例为大家分享了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发送示例

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

(0)

相关推荐

  • python利用smtplib实现QQ邮箱发送邮件

    python的smtplib提供了一种很方便的途径发送电子邮件.它对smtp协议进行了简单的封装. 下面是一个利用smtplib,实现QQ邮箱发送邮件的例子. 首先必须要打开QQ邮箱的smtp服务,在QQ邮箱个人主页的  设置-账户 中开启.如图: 成功开启后点击生成授权码 ,得到的密码为smtp发送邮件时的登录密码. 一个发送邮件的简单实例: from smtplib import SMTP_SSL from email.mime.text import MIMEText from email

  • python3利用smtplib通过qq邮箱发送邮件方法示例

    前言 本文主要给大家介绍了关于python3 smtplib通过qq邮箱发送邮件的相关内容, smtplib模块是smtp简单邮件传输协议客户端的实现,为了通用性,有时候发送邮件的时候要带附件或图片,用email.mime来装载内容. 详细代码参考说明:Python3 SMTP发送邮件 0.了解qq邮箱的SMTP QQ邮箱 POP3 和 SMTP 服务器地址设置如下: 邮箱 POP3服务器(端口995) SMTP服务器(端口465或587) qq.com pop.qq.com smtp.qq.c

  • Python 使用SMTP发送邮件的代码小结

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一种很方便的途径发送电子邮件.它对smtp协议进行了简单的封装. Python创建 SMTP 对象语法如下: import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] ) 参数说明: host: SMTP 服务器

  • python3使用smtplib实现发送邮件功能

    在之前的工作中,业务方做了一些调整,提出了对一部分核心指标做更细致的拆分并定期产出的需求.出于某些原因,这部分数据不太方便在报表上呈现,因此就考虑通过邮件的方式定期给业务方发送数据. 当时本来使用的是linux自带的mail命令来实现,然而某一天开始,突然发现服务器上的邮件服务不可用了,于是就将脚本迁移到本地,并准备使用Python3中的smtplib搭配crontab来实现. 首先,我们需要导入Python3标准库中的smtplib包和email包来实现邮件的构造和发送. import smt

  • Python实现SMTP发送邮件详细教程

    简介 Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详细的环境调试导致,所以今天特出一个详细的教程,一步一步从环境调试到代码实现整一个教程,希望对还在苦苦寻找解决方法却迟迟不能得到有效解决的人员一点帮助. SMTP协议 首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用

  • Python基于smtplib实现异步发送邮件服务

    基于smtplib包制作而成,但在实践中发现一个不知道算不算是smtplib留的一个坑,在网络断开的情况下发送邮件时会抛出一个socket.gaierror的异常,但是smtplib中并没有捕获这个异常,导致程序会因这个异常终止,因此代码中针对这部分的异常进行处理,确保不会异常终止. #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Zoa Chou' # see http://www.mudoom.com/Article/s

  • python3实现SMTP发送邮件详细教程

    简介   Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详细的环境调试导致,所以今天特出一个详细的教程,一步一步从环境调试到代码实现整一个教程,希望对还在苦苦寻找解决方法却迟迟不能得到有效解决的朋友们一点帮助. SMTP协议   首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮

  • Python基于SMTP协议实现发送邮件功能详解

    本文实例讲述了Python基于SMTP协议实现发送邮件功能.分享给大家供大家参考,具体如下: SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它是一组由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件. Python创建SMTP语法如下: imp

  • python中使用smtplib和email模块发送邮件实例

    SMTP模块 这么多已定义的类中,我们最常用的的还是smtplib.SMTP类,就具体看看该类的用法:smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间.在一般的调用过程中,应该遵connetc().sendmail().quit()步骤. SMTP模块主要方法 下面我们来

  • python3实现163邮箱SMTP发送邮件

    SMTP协议 首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议.SMTP协议的默认TCP端口号是25. 发送邮件之前的配置: 上面说了是使用SMTP协议发送的邮件,所以需要先查看你的发件人邮箱是否有开启SMTP协议,如没有,则需要开启,我测试使用的是163.com的邮箱作为发信人邮箱,在设置中开启SMTP协议如下图所示.   测试的前提是你需要开通客户

  • 用smtplib和email封装python发送邮件模块类分享

    复制代码 代码如下: #!/usr/bin/python# encoding=utf-8# Filename: send_email.pyfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText  import smtplib class SendEmail:    # 构造函数:初始化基本信息    def __

随机推荐