Python 发送带附件的邮件详解编程语言

[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 "[email protected],[email protected]". 
     -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() 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/8104.html

(0)
上一篇 2021年7月18日 19:18
下一篇 2021年7月18日 19:18

相关推荐

发表回复

登录后才能评论