本文目錄一覽:
- 1、用Python發送郵件,可以群發,帶有多個附件
- 2、我用python發郵件。出現以下問題,求解答
- 3、python批量發送郵件–包括批量不同附件
- 4、如何在python程序中發郵件
- 5、如何用python自動發送郵件
用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()
原創文章,作者:RWMVB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/129770.html