python 发送邮件 可带附件:
#!/usr/bin/python
# -*- coding:utf-8-*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header
from email.utils import formataddr,parseaddr
from email import encoders
import os
import logging
import argparse
logging.getLogger(__name__)
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S %p"
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)
class SendEmail(object):
def __init__(self, **params):
self.servermail = "smtp.163.com"
self.serverport = 465
self.sender = "187xxx@163.com"
self.password = params["password"]
self.receivers = params["receivers"]
self.subject = params["subject"]
self.title_name = params["title_name"]
self.message = params["message"]
self.attachmentfile = params["attachment"]
def __format_addr(self, s):
name, addr = parseaddr(s)
return formataddr((Header(name,'utf-8').encode(), addr))
def send_email(self):
message = MIMEMultipart()
message['From'] = self.__format_addr(f"sender <{self.sender}>")
message['To'] = self.__format_addr(f"receivers <{self.receivers}>")
message['Subject'] = Header(self.subject, 'utf-8').encode()
message.attach(MIMEText(self.message,'html', 'utf-8')) #if self.message is html
# message.attach(MIMEText(self.message, 'plain', 'utf-8')) #if self.message is txt
if self.attachmentfile:
attachment = open(self.attachmentfile, "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f"attachment; filename= {os.path.basename(self.attachmentfile)}")
message.attach(part)
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(self.servermail,self.serverport)
smtpObj.login(self.sender, self.password)
smtpObj.sendmail(self.sender, self.receivers.split(","), message.as_string())
logging.info(f"sendmail success: {self.receivers}")
smtpObj.quit()
except smtpObj.SMTPException:
logging.error("Error, sendmail failed")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Process some args')
parser.add_argument('-pw', '--password', dest=None, type=str, help='password')
parser.add_argument('-er', '--email_receivers', dest=None, type=str, help='email_receivers')
parser.add_argument('-s', '--subject', dest=None, type=str, help='subject')
parser.add_argument('-t', '--title_name', dest=None, type=str, help='title_name')
parser.add_argument('-m', '--message', dest=None, type=str, help='message')
parser.add_argument('-a', '--attachment', dest=None, type=str, help='attachment')
args = parser.parse_args()
sendemail = SendEmail(
password=args.password,
receivers=args.email_receivers,
subject=args.subject,
title_name=args.title_name,
message=args.message,
attachment=args.attachment
)
sendemail.send_email()
调用以及文内想使用html格式demo:
txt直接写文本就行
#!/usr/bin/python
# -*- coding:utf-8-*-
from send_email_with_attach import *
import os
def get_html_message(title_name, content):
message = "<html>"
message = message + f'<head> <meta charset="UTF-8"> <title>{title_name}</title> </head>'
message = message + '<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">'
message = message + '<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tonoma, Arial, Helvetica, sans-serif">'
message = message + '<tr>本邮件由xxx发出!<br/></tr>'
message = message + '<tr> <td><br /> <b><font color="#0B610B">Attention</font></b> <hr size="2" width="100%" align="center" /> </td> </tr>'
message = message + f'<tr> <td> <ul><li>Info : <br/> {content} </li> </ul> <!-- <hr size="2" width="100%" /> --> </td> </tr>'
message = message + '</table>'
message = message + "</body>"+"<br/>"
message = message + "</html>"+"<br/>"
return message
def send_email():
file_path = os.path.join(os.getcwd(), "xxx.txt")
sendemail = SendEmail(
password="xxx",
receivers="xxx.163.com",
subject="test",
title_name="test",
message=get_html_message("xxx", "xxx"),
attachment=file_path
)
sendemail.send_email()
sendemail()