首页 > 编程 > Python > 正文

python2.7实现邮件发送功能

2020-01-04 13:51:04
字体:
来源:转载
供稿:网友

要想实现一个能够发送带有文本、图片、附件的python程序,首先要熟悉两大模块:

email以及smtplib

然后对于MIME(邮件扩展)要有一定认知,因为有了扩展才能发送附件以及图片这些媒体或者非文本信息

最后一个比较细节的方法就是MIMEMultipart,要理解其用法以及对应参数所实现的功能区别

发送邮件三部曲:

创建协议对象
连接邮件服务器
登陆并发送邮件

 

from email.header import Headerfrom email.mime.base import MIMEBasefrom email.mime.text import MIMETextimport mimetypesfrom email.mime.multipart import MIMEMultipartimport osimport smtplibfrom email import Encoders as email_encodersclass Message(object): def __init__(self, from_addr, to_addr, subject="", html="", text=None, cc_addr=[], attachment=[]):  self.from_addr = from_addr  self.subject = subject  if to_addr:   if isinstance(to_addr, list):    self.to_addr = to_addr   else:    self.to_addr = [d for d in to_addr.split(',')]  else:   self.to_addr = []  if cc_addr:   if isinstance(cc_addr, list):    self.cc_addr = cc_addr   else:    self.cc_addr = [d for d in cc_addr.split(',')]  else:   self.cc_addr = []  if html is not None:   self.body = html   self.body_type = "html"  else:   self.body = text   self.body_type = "plain"  self.parts = []  if isinstance(attachment, list):   for file in attachment:    self.add_attachment(file) def add_attachment(self, file_path, mimetype=None):  """   If *mimetype* is not specified an attempt to guess it is made. If nothing   is guessed then `application/octet-stream` is used.  """  if not mimetype:   mimetype, _ = mimetypes.guess_type(file_path)  if mimetype is None:   mimetype = 'application/octet-stream'  type_maj, type_min = mimetype.split('/')  with open(file_path, 'rb') as fh:   part_data = fh.read()   part = MIMEBase(type_maj, type_min)   part.set_payload(part_data)   email_encoders.encode_base64(part)   part_filename = os.path.basename(file_path)   part.add_header('Content-Disposition', 'attachment; filename="%s"'       % part_filename)   part.add_header('Content-ID', part_filename)   self.parts.append(part) def __to_mime_message(self):  """Returns the message as  :py:class:`email.mime.multipart.MIMEMultipart`."""  ## To get the message work in iOS, you need use multipart/related, not the multipart/alternative  msg = MIMEMultipart('related')  msg['Subject'] = self.subject  msg['From'] = self.from_addr  msg['To'] = ','.join(self.to_addr)  if len(self.cc_addr) > 0:   msg['CC'] = ','.join(self.cc_addr)  body = MIMEText(self.body, self.body_type)  msg.attach(body)  # Add Attachment  for part in self.parts:   msg.attach(part)  return msg def send(self, smtp_server='localhost'):  smtp = smtplib.SMTP()  smtp.connect(smtp_server)  smtp.sendmail(from_addr=self.from_addr, to_addrs=self.to_addr + self.cc_addr, msg=self.__to_mime_message().as_string())  smtp.close()

对于实际发送程序,要注意个参数的类型,比如from_addr是字符串,to_addr和cc_addr以及attachment都是列表

 

from mail_base import Messageimport datetimefrom_addr = 'xxx'mail_to = 'xxx'def send_go(): time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') attach_files = ['testcsv.xlsm','test1.jpg','test2.jpg','test3.jpg'] mail_msg = """  <p>Hi Lockey:</p>  <p><img src="cid:test1.jpg"></p>####要特别注意这里,正文插入图片的特殊格式!!!  <hr/>  <p style="text-indent:16px">Here is the latest paper link from The Economist, you can click <a href="https://lockeycheng.github.io/iooi/index.html" rel="external nofollow" >Go</a> for a full view!</p>  <hr/>  <p>Best Regards</p>  <p>   Any question please mail to <a href='mailto:iooiooi23@163.com'>Lockey23</a>.  </p>  <p>Sent at {} PST</p>  """.format(time_now) subject = '[Halo] - ' + 'A new paper published!' msg = Message(from_addr=from_addr,     to_addr=[mail_to],     cc_addr=[mail_to],     subject=subject,     attachment=attach_files,     html=mail_msg     ) msg.send()if __name__ == '__main__': send_go()

对于测试程序我们命名为sendGo.py,运行测试程序

~$ python sendGo.py

python,邮件发送

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表