代码之家  ›  专栏  ›  技术社区  ›  Karn Kumar

python将mailBody附加到电子邮件中不起作用

  •  0
  • Karn Kumar  · 技术社区  · 6 年前

    我有一个下面的脚本可以很好地用于rsync,这个脚本实际上将文件从远程主机拉到它运行的服务器 dest

    然而 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 包含消息的变量 msg = message + "rsync process completed" 那是不是得到发送休息邮件与主题是工作,问题似乎是与 味精 未正确调用或打开的部分。

    只是另一种方式!

    当我应用下面的方法时 To 地址, Subject 和信息ie Rsync Process Completed Successfully. 它可以工作,并发送电子邮件,但真正的问题仍然是一样的,如果我想包括 味精 或者说想透露 味精 分开这里,怎么能这样!

    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)
    
    3 回复  |  直到 4 年前
        1
  •  1
  •   Serge Ballesta    6 年前

    问题是 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")
    
        2
  •  1
  •   Vijay Anand Pandian    6 年前

    你能试着用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))
    
        3
  •  0
  •   Karn Kumar    6 年前

    只是冒昧地把这封邮件放在这里,它为我工作的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))