import smtplib import mimetypes import os from email import encoders from email.header import Header from email.message import Message from email.mime.audio import MIMEAudio from email.mime.base import MIMEBase from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText CONTENT_ENCODING = 'UTF-8' COMMASPACE = ',' def _header(s): if type(s) == str: return s elif type(s) == unicode: return Header(s.encode(CONTENT_ENCODING), CONTENT_ENCODING).encode() class MailSender(object): def __init__(self, smtp_host, username, password, verify_ssl, default_sender, timeout=30.0): self.set_smtp(smtp_host, username, password, verify_ssl) self.default_sender = default_sender self.timeout = timeout def set_smtp(self, smtp_host, username, password, verify_ssl): self.smtp_host = smtp_host self.username = username self.password = password self.verify_ssl = verify_ssl def sendmail(self, to_list, subject, text, cc_list=[], file_paths=[], bcc_list=[], sender=None): if not sender: sender = self.default_sender msg = self.compose_msg(to_list, subject, text, cc_list, file_paths, sender) to_addrs = to_list + cc_list + bcc_list server = smtplib.SMTP(self.smtp_host, timeout=self.timeout) if self.verify_ssl: server.ehlo() server.starttls() server.ehlo() else: server.ehlo() if self.username: server.login(self.username, self.password) server.sendmail(sender, to_addrs, msg) server.quit() def compose_msg(self, to_list, subject, text, cc_list=[], file_paths=[], sender=None): if not sender: sender = self.default_sender outer = MIMEMultipart() outer['Subject'] = _header(subject) outer['To'] = COMMASPACE.join(to_list) if cc_list: outer['CC'] = COMMASPACE.join(cc_list) outer['From'] = sender if type(text) == unicode: textpart = MIMEText(text.encode(CONTENT_ENCODING), 'plain', CONTENT_ENCODING) else: textpart = MIMEText(str(text), 'plain', CONTENT_ENCODING) outer.attach(textpart) for path in file_paths: file_name = os.path.basename(path) ctype, encoding = mimetypes.guess_type(path) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) fp = open(path, 'rb') data = fp.read() fp.close() if maintype == 'text': msg = MIMEText(data, _subtype=subtype) elif maintype == 'image': msg = MIMEImage(data, _subtype=subtype) elif maintype == 'audio': msg = MIMEAudio(data, _subtype=subtype) else: msg = MIMEBase(maintype, subtype) msg.set_payload(data) encoders.encode_base64(msg) if type(file_name) == unicode: #s_filename = ('utf-8', '', file_name.encode(CONTENT_ENCODING)) s_filename = file_name.encode(CONTENT_ENCODING) else: s_filename = str(file_name) msg.add_header('Content-Disposition', 'attachment', filename=s_filename) outer.attach(msg) return outer.as_string()
python写的一个邮件收发工具
最新推荐文章于 2021-11-16 18:41:26 发布