python发邮件函数 用python发送邮件

用Python发送邮件,可以群发,带有多个附件

''''' 

成都创新互联公司长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为久治企业提供专业的网站建设、成都网站制作,久治网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

函数说明:Send_email_text() 函数实现发送带有附件的邮件,可以群发,附件格式包括:xlsx,pdf,txt,jpg,mp3等 

参数说明: 

1. subject:邮件主题 

2. content:邮件正文 

3. filepath:附件的地址, 输入格式为["","",...] 

4. receive_email:收件人地址, 输入格式为["","",...] 

'''  

def Send_email_text(subject,content,filepath,receive_email):  

import smtplib  

from email.mime.multipart import MIMEMultipart   

from email.mime.text import MIMEText   

from email.mime.application import MIMEApplication  

sender = "发送方邮箱"  

passwd = "填入发送方密码"  

receivers = receive_email   #收件人邮箱  

msgRoot = MIMEMultipart()   

msgRoot['Subject'] = subject  

msgRoot['From'] = sender  

if len(receivers)1:  

msgRoot['To'] = ','.join(receivers) #群发邮件  

else:  

msgRoot['To'] = receivers[0]  

part = MIMEText(content)   

msgRoot.attach(part)  

##添加附件部分  

for path in filepath:  

if ".jpg" in path:  

#jpg类型附件  

jpg_name = path.split("\\")[-1]  

part = MIMEApplication(open(path,'rb').read())   

part.add_header('Content-Disposition', 'attachment', filename=jpg_name)  

msgRoot.attach(part)  

if ".pdf" in path:  

#pdf类型附件  

pdf_name = path.split("\\")[-1]  

part = MIMEApplication(open(path,'rb').read())   

part.add_header('Content-Disposition', 'attachment', filename=pdf_name)   

msgRoot.attach(part)  

if ".xlsx" in path:  

#xlsx类型附件  

xlsx_name = path.split("\\")[-1]  

part = MIMEApplication(open(path,'rb').read())   

part.add_header('Content-Disposition', 'attachment', filename=xlsx_name)  

msgRoot.attach(part)  

if ".txt" in path:  

#txt类型附件  

txt_name = path.split("\\")[-1]  

part = MIMEApplication(open(path,'rb').read())  

part.add_header('Content-Disposition', 'attachment', filename=txt_name)  

msgRoot.attach(part)  

if ".mp3" in path:  

#mp3类型附件  

mp3_name = path.split("\\")[-1]  

part = MIMEApplication(open(path,'rb').read())   

part.add_header('Content-Disposition', 'attachment', filename=mp3_name)   

msgRoot.attach(part)  

try:  

s = smtplib.SMTP()  

s.connect("smtp.mail.aliyun.com") #这里我使用的是阿里云邮箱,也可以使用163邮箱:smtp.163.com  

s.login(sender, passwd)  

s.sendmail(sender, receivers, msgRoot.as_string())  

print ("邮件发送成功")  

except smtplib.SMTPException as e:  

print("Error, 发送失败")  

finally:  

s.quit()

python电子邮件系列(三)之POP接收邮件

由上篇文章我们已经得知邮件从发送到接收的过程:

发件人-MUA-MTA-若干MTA-MDA-MUA-收件人

本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。

收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。

回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。

因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。

所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。

所以,邮件收取的流程就是:

由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:

纯文本:

str-bytes-base64-str-bytes

二进制文件:

binary code-base64-str-bytes

我们解析邮件也是按这个思路,逆序解析出内容。

这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。

先从上一节结构化的 msg 中取出信件头,打印出来。

如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。

不是 multipart 时,之后再依据 Content-Type 作不同处理:

如果是 text :

利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。

再 guess_charset 猜出编码方式,之后将其解码为字符显示。

如果不是 Text 对象,则为附件:

打印出附件的 Content-Type 。

如何通过python发送彩色标题的邮件

首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。

本文主要介绍利用'smtplib','email'两个模块来实现邮件的发送,可以如下查看两个模块的函数和方法:

smtplib模块简介:

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

  此为SMTP类构造函数,表示与SMTP服务器之间的连接,并根据这个连接向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件),且每个参数都是可选的。

其中最重要的参数:

host:smtp服务器主机名

port:smtp服务的端口,默认是25;

如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。

smtplib.SMTP还提供了如下方法:

SMTP.set_debuglevel(level):设置是否为调试模式

SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示 smpt主机和端口。

SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。

SMTP.helo([hostname]) :使用"helo"指令向服务器确认身份。

SMTP.login(user, password):登陆到smtp服务器。现在几乎所有smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。(重要!)

SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options]):发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。SMTP.quit() :断开与smtp服务器的连接,相当于发送"quit"指令。(重要!)

常用的函数方法:

email模块

1.class email.message.Message

__getitem__,__setitem__实现obj[key]形式的访问。

Msg.attach(playload): 向当前Msg添加playload。

Msg.set_playload(playload):

Msg.add_header(_name, _value, **_params): 添加邮件头字段。

2.class email.mime.base.MIMEBase(_maintype, _subtype, **_params)

所有MIME类的基类,是email.message.Message类的子类。

3.class email.mime.multipart.MIMEMultipart()

在3.0版本的email模块 (Python 2.3-Python 2.5) 中,这个类位于email.MIMEMultipart.MIMEMult ipart。这个类是MIMEBase的直接子类,用来生成包含多个部分的邮件体的MIME对象。

4.class email.mime.text.MIMEText(_text)

使用字符串_text来生成MIME对象的主体文本。

获得所需要使用的邮箱的host地址和port端口号,(本文使用的是163邮箱,对应的smtp服务器地址:mail.163.com,端口号25)

常用邮箱的smtp服务器地址和端口号如图:

编写程序如下:

#! /usr/bin/env python

import smtpli

from email.mime.text import MIMEText

mailto_list=['xxxx@xxx.com'] #收件人(列表)

mail_host="smtp.163.com" #使用的邮箱的smtp服务器地址

mail_user="name" #用户名

mail_pass="pwd" #密码

mail_postfix="postfix" #邮箱的后缀

def send_mail(to_list,sub,content):

me="hello"+""+mail_user+"@"+mail_postfix+""

msg = MIMEText(content,_subtype='plain')

msg['Subject'] = sub

msg['From'] = me

msg['To'] = ";".join(to_list) #将收件人列表以‘;’分隔

try:

server = smtplib.SMTP()

server.connect(mail_host) #连接服务器

server.login(mail_user,mail_pass) #登录操作

server.sendmail(me, to_list, msg.as_string())

server.close()

return True

except Exception, e:

print str(e)

return False

for i in range(5): #发送五封,不过会被拦截的。。。

if send_mail(mailto_list,"hello","haha!"): #邮件主题和邮件内容

print "done!"

else:

print "failed!"

最后,可以运行编写的py文件,可以得到如图所是的结果,代表邮件发送成功。

7

这样,就能成功实现用Python发送邮件啦!可以看到接收端接收到的邮件如:

python如何发送紧急级别的邮件?

引用头文件

#!/usr/bin/env python

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

import smtplib

import os

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders

创建“连接邮件服务器”函数

def smtp_connect( smtp_server, account, password, target ):

global smtp

global e_smtpserver

global e_account

global e_password

global e_target

global msg

e_smtpserver = smtp_server

e_account = account

e_password = password

e_target = target

try:

smtp = smtplib.SMTP()

smtp.connect(e_smtpserver)

smtp.login(e_account, e_password)

except Exception, e:

print 'Mail connect failed: %s' % e

exit( -1 )

msg = MIMEMultipart('related')

创建“写邮件内容”函数

def smtp_set_content( subject, main_body ):

global msg

msg['Subject'] = subject

body = MIMEText( main_body, 'plain', 'utf-8' )

msg.attach( body )

创建“添加附件”函数

def smtp_set_attachment( file_path ):

global msg

part = MIMEBase( 'application', 'octet-stream' )

part.set_payload( open(file_path,'rb').read() )

encoders.encode_base64(part)

part.add_header( 'Content-Disposition', 'attachment; filename=%s' % file_path.split('/')[-1] )

msg.attach(part)

创建“发送邮件”函数

def smtp_send():

global smtp

global e_smtpserver

global e_account

global e_password

global e_target

global msg

try:

smtp.sendmail( e_account, e_target, msg.as_string() )

except Exception, e:

print 'Mail send Failed: %s' % e

exit( -1 )

使用示例

if __name__ == '__main__':

smtp_connect( 'smtp.xxxx.com.cn', 'xxxx@xxxx.com.cn', 'password',

'xxxx@xxxx.com.cn' )

smtp_set_content( 'Test subject', 'Test_content' )

smtp_set_attachment( os.getcwd() + '/mail.py' )

smtp_send()

python中邮箱发送不了函数

在邮箱当中我们需要判断我们的使用工具,然后进行添加连接之后,再函数重新启动再次发送。


文章标题:python发邮件函数 用python发送邮件
链接URL:http://scyanting.com/article/doojoes.html