首页 > 编程知识 正文

在阿里云用python发送邮件(Python自动发送邮件)

时间:2023-12-09 23:11:58 阅读:313874 作者:PTXK

本文目录一览:

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

''''' 

函数说明: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发邮件。出现以下问题,求解答

1、准备两个邮箱帐号,一个是常用的(接收端),另一个可以注册网易163邮箱或者foxmail邮箱也可(发送端),本次我使用两个QQ邮箱进行演示。

2、在邮箱的设置

3、账户中开启SMTP功能,如下图:

4、点击生成授权码,按照弹出窗口的提示发送短信,发送后单击我已发送按钮。

5、将生成的授权码复制下来以备接下来使用。如下图:

6、我们来编辑代码:

from email.header import Header

from email.mime.text import MIMEText

from email.utils import parseaddr,formataddr

import smtplib

def _format_addr(s):  

name,addr = parseaddr(s)  

return formataddr((Header(name,'utf-8').encode(),addr))

#发件人地址

from_addr = '10******10@qq.com'

#密码刚才复制的邮箱的授权码

password = 'u*******************g'

#收件人地址

to_addr =  '10********28@qq.com'

#邮箱服务器地址

smtp_server = 'smtp.qq.com'

#设置邮件信息

msg = MIMEText('Python爬虫运行异常,异常信息为遇到HTTP 403','plain','utf-8')

msg['From'] = _format_addr('Python爬虫一号%s'%from_addr)

msg['To'] = _format_addr('管理员%s'%to_addr)

msg['Subject'] = Header('一号爬虫运行异常.','utf-8').encode()

#发送邮件

server = smtplib.SMTP_SSL(smtp_server,465)

#打印出和SMTP服务器交互的所有信息

server.set_debuglevel(1)

#登录SMTP服务器

server.login(from_addr,password)

#sendmail():发送邮件,由于可以一次发给多个人,所以传入一个list邮件正文是一个str,as_string()把MIMEText对象变成str。

server.sendmail(from_addr,to_addr,msg.as_string())server.quit()print('邮件发送成功!')

7、登录接收端邮箱,查看是否发送成功,如下图:

8、如果能成功收到邮件的话就说明完成了。

python批量发送邮件--包括批量不同附件

小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。

一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。

所以,设计要点就是一个字—— 懒 。

恩,就酱。

经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:

(1) 邮件内容(content)不变,为固定的txt文本

(2) 附件(attch)为每个工长的结算账单(excel文件.xlsx),此文件命名为总账单中自动分割出来的名字(暂时不懂怎么分割出来的=.=),格式为:

(3) 邮件主题(Subject)为附件名(不带后缀名)

(4) 邮件接收对象(工长)的名单及其邮箱地址基本不变,偶尔变动

(5)

(1) 将工长及其邮箱地址存为CSV文件的两列,python中将其读取为字典形式,存储以供后续查询邮箱地址。

(2) 遍历文件夹中的附件(.xlsx类型文件),对其进行两种操作,一方面将其名字(不带路径和后缀)提取出来,作为邮件主题(Subject),并对Subject进一步划分,得到其中的人名(工长);另一方面,将其传入MIMEbase模块中转为邮件附件对象。

(3) 由上述得到的人名(name),在字典形式的通讯录中,查找相应的地址(value),即为收件人名称和地址

(4) 利用python中的email模块和smtp模块,登录自己的邮箱账号,再对每个附件,得到的收件人名和地址,添加附件,发送邮件。done

在设计过程中有几点需要注意

(1) 有时一个邮件地址对应两个人名,此时应该在CSV文件中分为两行存储,而不是将两个人名存为同一个键;

(2)有账单.xlsx文件,通讯录里却没存储此人记录,程序应该打印提示没有通讯记录的人名,且不能直接退出,要保证员工看到此提示,此第一版程序还有解决此问题;

(3)此程序发送的邮件内容为纯文本,若要求邮件内容有不同格式(如部分加粗,部分红色),还有小部分需要每次更改的地方(如邮件内容包含当前月份),如何解决?(这就是第二种邮件内容,“预算款”);

(4)重名的,暂时还没碰到,程序中也没给出解决方案。

第一版到此,20180830,待更新

第二版更新,20180904

第三版更新,20180909

转战CSDN博客,更多博客见传送门《 xiaozhou的博客主页 》

如何在python程序中发邮件

通过命令行发送邮件,功能强大

python ./mail -s $server -f $from -t $to -u $user -p $pass -S "$subject" -m "${mail_msg}" -F $file

Python 发送邮件可以添加附件:

#!/usr/bin/python

from email.MIMEText import MIMEText

from email.MIMEMultipart import MIMEMultipart

from email.MIMEBase import MIMEBase

from email import Utils, Encoders

import mimetypes, sys,smtplib,socket,getopt

class SendMail:

def __init__(self,smtp_server,from_addr,to_addr,user,passwd):

self.mailserver=smtp_server

self.from_addr=from_addr

self.to_addr=to_addr

self.username=user

self.password=passwd

def attachment(self,filename):

fd=open(filename,'rb')

filename=filename.split('/')

mimetype,mimeencoding=mimetypes.guess_type(filename[-1])

if (mimeencoding is None) or (mimetype is None):

mimetype='application/octet-stream'

maintype,subtype=mimetype.split('/')

if maintype=='text':

retval=MIMEText(fd.read(), _subtype=subtype, _charset='utf-8')

else:

retval=MIMEBase(maintype,subtype)

retval.set_payload(fd.read())

Encoders.encode_base64(retval)

retval.add_header('Content-Disposition','attachment',filename=filename[-1])

fd.close()

return retval

def msginfo(self,msg,subject,filename):

# message = """Hello, ALL

#This is test message.

#--Anonymous"""

message=msg

msg=MIMEMultipart()

msg['To'] = self.to_addr

msg['From'] = 'sa '+self.from_addr+''

msg['Date'] = Utils.formatdate(localtime=1)

msg['Message-ID'] = Utils.make_msgid()

if subject:

msg['Subject'] = subject

if message:

body=MIMEText(message,_subtype='plain')

msg.attach(body)

#for filename in sys.argv[1:]:

if filename:

msg.attach(self.attachment(filename))

return msg.as_string()

def send(self,msg=None,subject=None,filename=None):

try:

s=smtplib.SMTP(self.mailserver)

try:

s.login(self.username,self.password)

except smtplib.SMTPException,e:

print "Authentication failed:",e

sys.exit(1)

s.sendmail(self.from_addr,self.to_addr.split(','),self.msginfo(msg,subject,filename))

except (socket.gaierror,socket.error,socket.herror,smtplib.SMTPException),e:

print "*** Your message may not have been sent!"

print e

sys.exit(2)

else:

print "Message successfully sent to %d recipient(s)" %len(self.to_addr)

if __name__=='__main__':

def usage():

print """Useage:%s [-h] -s SMTP Server -f FROM_ADDRESS -t TO_ADDRESS -u USER_NAME -p PASSWORD [-S MAIL_SUBJECT -m MAIL_MESSAGE -F ATTACHMENT]

Mandatory arguments to long options are mandatory for short options too.

-f, --from= Sets the name of the "from" person (i.e., the envelope sender of the mail).

-t, --to= Addressee's address. -t "test@test.com,test1@test.com".

-u, --user= Login SMTP server username.

-p, --pass= Login SMTP server password.

-S, --subject= Mail subject.

-m, --msg= Mail message.-m "msg, ......."

-F, --file= Attachment file name.

-h, --help Help documen.

""" %sys.argv[0]

sys.exit(3)

try:

options,args=getopt.getopt(sys.argv[1:],"hs:f:t:u:p:S:m:F:","--help --server= --from= --to= --user= --pass= --subject= --msg= --file=",)

except getopt.GetoptError:

usage()

sys.exit(3)

server=None

from_addr=None

to_addr=None

username=None

password=None

subject=None

filename=None

msg=None

for name,value in options:

if name in ("-h","--help"):

usage()

if name in ("-s","--server"):

server=value

if name in ("-f","--from"):

from_addr=value

if name in ("-t","--to"):

to_addr=value

if name in ("-u","--user"):

username=value

if name in ("-p","--pass"):

password=value

if name in ("-S","--subject"):

subject=value

if name in ("-m","--msg"):

msg=value

if name in ("-F","--file"):

filename=value

if server and from_addr and to_addr and username and password:

test=SendMail(server,from_addr,to_addr,username,password)

test.send(msg,subject,filename)

else:

usage()

如何用python自动发送邮件

注意如果使用qq的smtp转发功能的话,需要在设置页面中将该功能打开,然后设定密码,改密码就是赋值给下文password中的。

开启smtp转发功能文档

[python] view plain copy

#from email.MIMEText import MIMEText    #old version cannot recongnize by new python

from email.MIMEText import MIMEText

from email.Header import Header

msg = MIMEText('hello, send by python','plain','utf-8');

from_addr = "*****@qq.com"   #email addresss include domain name

password = "******"        #password

to_addr = "****@qq.com"   # target email address

smtp_server = "smtp.qq.com"       #smtp sever domain for qq is smtp.qq.com

import smtplib

server = smtplib.SMTP(smtp_server,25);

server.set_debuglevel(1)

server.login(from_addr,password);

server.sendmail(from_addr,[to_addr], msg.as_string())

server.quit()

上面这个是没有主题的,有主题的话建议采用下面这个代码

下面是连续发送有主题的文件10封

[python] view plain copy

from email.Header import Header

from email.MIMEText import MIMEText

from email import encoders

from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):

name, addr = parseaddr(s)

return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = "*****@qq.com"   #email addresss include domain name

password = "******"        #password

to_addr = "****@qq.com"   # target email address

smtp_server = "smtp.qq.com"       #smtp sever domain for qq is smtp.qq.com

for num in range(1,11):

msg = MIMEText('hello, send by Tom', 'plain', 'utf-8');

msg['From'] = _format_addr('Tom %s' % from_addr)

msg['To'] = _format_addr('addministrator %s' % to_addr)

msg['Subject'] = Header('The greeting from Tom','utf-8').encode()

server = smtplib.SMTP(smtp_server,25)

server.set_debuglevel(1)

server.login(from_addr, password)

#server.sendmail(from_addr, [to_addr], msg.as_string())

server.sendmail(from_addr, [to_addr], msg.as_string())

server.quit()

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。