[英]python attaching mailBody into the e-mail not working
我有一個下面的腳本,它對於rsync正常工作,該腳本實際上將文件從遠程主機拉到服務器,該文件從其在dest
Folder下運行。
但是rsync
可以正常工作,但是郵件部分msg = 'message + "rsync process completed"'
基本上不作為電子郵件發送。
不知何故我不知道我在做什么錯!
import os
import sys
import subprocess
import argparse
import smtplib
#Dir Structure
dst = "/infralogs/external_dns_logs"
rsync_user = "root"
mailFrom = 'robo@helisis.com'
mailTo = 'robo@helisis.com'
mailSub = 'Rsync status'
msg = ""
parser = argparse.ArgumentParser()
parser.add_argument("-n","--hosts",dest="hosts",help="enter remote host/hosts name, comma seperated",metavar="HOSTS")
parser.add_argument("-s","--src",dest="source",help="source file/directory",metavar="SOURCE")
parser.add_argument("-e","--exclude",dest="exclude",help="Exclude files/Directories, comma seperated list",metavar="EXCLUDE")
if len(sys.argv) < 7:
print(len(sys.argv))
parser.print_help()
parser.exit()
args = parser.parse_args()
def sync(host,dst):
exclude = ""
if not os.path.exists(dst):
os.mkdir(dst)
if ',' in args.exclude:
for excl in args.exclude.split(','):
exclude = exclude + " --exclude " + excl
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz %s %s@%s:%s %s/"%(exclude,rsync_user,host,args.source,dst)
else:
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dst)
print(cmd)
message = cmd
p = subprocess.Popen(cmd,shell=True)
p.wait()
print("DONE")
msg = message + "rsync process completed"
mailBody = "From: %s\nTo: %s\nSubject: %s\n\n%s" %(mailFrom,mailTo,mailSub,msg)
if ',' in args.hosts:
for host in args.hosts.split(','):
dest = dst + "/" + host
sync(host,dest)
else:
dest = dst + "/" + args.hosts
sync(args.hosts,dest)
try:
Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
Mail.sendmail(mailFrom,mailTo,mailBody,msg)
print("Mail Sent to %s" %(mailTo))
except:
print("Mail Failed")
從上面的腳本在終端上輸出結果:
$ ./log_rsync -n remote_Server -s /var/log/infoSec/ -e "null" bind.log 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=7/9) default.log 12769 100% 12.18MB/s 0:00:00 (xfer#2, to-check=6/9) general.log 9553 100% 4.56MB/s 0:00:00 (xfer#3, to-check=5/9) lame-servers.log 663 100% 129.49kB/s 0:00:00 (xfer#4, to-check=4/9) network.log 0 100% 0.00kB/s 0:00:00 (xfer#5, to-check=3/9) notify.log 3286 100% 356.55kB/s 0:00:00 (xfer#6, to-check=2/9) queries.log 578 100% 47.04kB/s 0:00:00 (xfer#7, to-check=1/9) query-errors.log 0 100% 0.00kB/s 0:00:00 (xfer#8, to-check=0/9) sent 176 bytes received 4303 bytes 814.36 bytes/sec total size is 26849 speedup is 5.99 DONE Mail Sent to robo@helisis.com
郵件服務工作正常,但是包含消息msg = message + "rsync process completed"
的msg
變量未正常發送帶有主題的剩余電子郵件,該問題似乎正在起作用,問題似乎出在msg
部分未正確調用或打開的地方。
只是另一種方式!
當我使用下面的方法時,其中包含了To
address, Subject
和Message即Rsync Process Completed Successfully.
可以正常工作並發送電子郵件,但如果我想包含msg
或說要在此處公開msg
部分,那么真正的問題仍然是相同的,那怎么辦!
EmailSender="robo@localhost.helisis.com" EmailReceiver="robo@helisis.com" msgBody='''From: dnsmailer <netrobo@helisis.com> To: To Person <robo@helisis.com> Subject: rsync Status from infra-syslog Rsync Process Completed Succesfully. ''' if ',' in args.hosts: for host in args.hosts.split(','): dest = dst + "/" + host sync(host,dest) else: dest = dst + "/" + args.hosts sync(args.hosts,dest) try: smtpobj=smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com') smtpobj.sendmail(EmailSender,EmailReceiver,msgBody) except Exception as e: print(e)
您能否嘗試使用MIMEMultipart發送消息。 我應該這樣工作。
import smtplib
from email.mime.multipart import MIMEMultipart
EmailSender = "robo@localhost.helisis.com"
EmailReceiver = "robo@helisis.com"
msgBody = '''From: dnsmailer <netrobo@helisis.com>
To: To Person <robo@helisis.com>
Subject: rsync Status from infra-syslog
Rsync Process Completed Succesfully.
'''
try:
Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
mail_obj = MIMEMultipart()
mail_obj["From"] = EmailSender
mail_obj["To"] = EmailReceiver
mail_obj["Subject"] = "rsync Status from infra-syslog."
mail_obj.preamble = "rsync Status from infra-syslog. "
msgBody = "Rsync Process Completed Successfully!" # Message body
mail_obj.attach(MIMEText(message, 'plain'))
Mail.sendmail(from_addr=[EmailSender], to_addrs=[EmailReceiver], msg=mail_obj.as_string())
print("Mail Sent to %s" % (EmailReceiver))
except Exception as error:
print("Mail Failed - {}".format(error))
問題在於, msg
是在sync
函數內部計算的(可以在循環中調用),然后被遺忘(意味着未存儲)。
因此,當您想在郵件正文中使用它時,它將不再可用。 您必須在可用時使用它並直接調整郵件正文,或者更好地將其存儲在列表中,然后使用它來構建郵件正文。 代碼可能變成:
...
def sync(host,dst):
...
message = cmd
p = subprocess.Popen(cmd,shell=True)
p.wait()
print("DONE")
return message + " rsync process completed" # returns the msg to the caller
msglist = [] # a list to store the messages for the mail body
if ',' in args.hosts:
for host in args.hosts.split(','):
dest = dst + "/" + host
msglist.append(sync(host,dest))
else:
dest = dst + "/" + args.hosts
msglist.append(sync(args.hosts,dest))
msg = "\n".join(msglist) # combine all messages, one per line
mailBody = "From: %s\nTo: %s\nSubject: %s\n\n%s" %(mailFrom,mailTo,mailSub,msg)
try:
Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
Mail.sendmail(mailFrom,mailTo,mailBody,msg)
print("Mail Sent to %s" %(mailTo))
Mail.bye() # cleaner to say goodbye to server...
Mail.close()
except:
print("Mail Failed")
只是隨便放一點對我有用的電子郵件,因為smtplib拋出了我較早應用的一些錯誤,下面是有效的電子郵件部分,可能有人會在找一樣的東西:-)
非常感謝@Serge和@Vijay對此提供幫助。
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
email_sender = "syslogger@helisis.com"
email_receiver = "robo@helisis.com, robo01@helisis.com, robo02@helisis.com"
try:
Mail = smtplib.SMTP('mailserver.global.helisis.com', 25, 'localhost.helisis.com')
mail_obj = MIMEMultipart('alternative')
mail_obj["From"] = email_sender
mail_obj["To"] = email_receiver
mail_obj["Cc"] = "someone@helisis.com"
mail_obj["Subject"] = "rsync Status from infra-syslog."
mail_obj.preamble = "rsync Status from infra-syslog. "
msgBody = "Rsync Process Completed Successfully!" # Message body
mail_obj.attach(MIMEText(msg, 'plain'))
Mail.sendmail(from_addr=[email_sender], to_addrs=[email_receiver],msg=mail_obj.as_string())
print("Mail Sent to %s" % (email_sender))
except Exception as error:
print("Mail Failed - {}".format(error))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.