用Python发送邮件

来源:互联网 发布:c语言sum是什么意思 编辑:程序博客网 时间:2024/04/30 22:24

转自:http://www.berlinix.com/python/email.php


用Python发送邮件

用Python发送邮件需要引入SMTP(smtplib.SMTP)包,如果要发送复杂邮件,可以用email包。

smtplib

smtplib包中的核心类:smtplib.SMTP、smtplib.SMTP_SSL等。构造SMTP:

SMTP(host = "", port = 0, local_hostname = None [, timeout])SMTP_SSL(host = "", port = 0, local_hostname = None, keyfile = None, certfile = None [, timeout])

发送邮件:

SMTP.sendmail(from_addr, to_addrs, msg, mail_opts = [], rctp_opts = [])SMTP.send_message(msg, from_addr = None, to_addrs = None, mail_opts = [], rcpt_opts = [])

参数中的msg是Message对象(email.message.Message)。

email包

Message类是email包的核心,它位于email.message模块。email包提供了多种不同类型的MIME对象,它们分别是:

  • email.mime.base.MIMEBase
  • email.mime.nonmultipart.MIMENonMultipart
  • email.mime.multipart.MIMEMultipart
  • email.mime.application.MIMEApplication
  • email.mime.audio.MIMEAudio
  • email.mime.image.MIMEImage
  • email.mime.message.MIMEMessage
  • email.mime.text.MIMEText

这些对象的继承关系如下:

MIMEBase    |-- MIMENonMultipart        |-- MIMEApplication        |-- MIMEAudio        |-- MIMEImage        |-- MIMEMessage        |-- MIMEText    |-- MIMEMultipart

最基础的MIMEBase则继承自Message。通常而言无需直接使用MIMEBase,而应该使用这些继承类。MIMENonMultipart是中间层,它的主要作用就是阻止attach()的使用。要使用attach(),则应该用MIMEMultipart。再看这些类的构造函数:

MIMEBase(_maintype, _subtype, **_params)MIMEMultipart(_subtype = "mixed", boundary = None, _subparts = None, **_params)MIMEApplication(_data, _subtype = "octet-stream", _encoder = encode_base64, **_params)MIMEAudio(_audiodata, _subtype = None, _encoder = encode_base64, **_params)MIMEAudio(_imagedata, _subtype = None, _encoder = encode_base64, **_params)MIMEMessage(_msg, _subtype = "rfc822")MIMEText(_text, _subtype = "plain", _charset = "us-ascii")

Python发送邮件实战

首先发送一份简单邮件:

import smtplibif __name__ == "__main__":    host = "smtp.gmail.com"    port = 465    user = "SENDER@gmail.com"    pwd = "MYPASSWD"    s = smtplib.SMTP_SSL(host, port);    s.login(user, pwd)    s.sendmail(user, "RECEIVER@gmail.com", "hello, berlinix!")

查看邮箱,收到一封没有title的邮件,内容是hello, berlinix!

接下来为邮件添加title,并丰富下邮件内容,这次我们用HTML格式作为邮件内容。

import smtplibfrom email.mime.text import MIMETextif __name__ == "__main__":    host = "smtp.gmail.com"    port = 465    sender = "SENDER@gmail.com"    pwd = "MYPASSWD"    receiver = "RECEIVER@gmail.com"    body  = "<h1>Welecome to Berlinix.com</h1>"    body += "<p>Here is my personal blog, include some technical notes.</p>"    msg = MIMEText(body, "html")    msg["subject"] = "Welcome to Berlinix.com"    msg["from"] = sender    msg["to"] = receiver    s = smtplib.SMTP_SSL(host, port);    s.set_debuglevel(1)    s.login(sender, pwd)    s.sendmail(sender, receiver, msg.as_string())

接下来,在邮件中内嵌一个图片并发送:

import smtplibfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartif __name__ == "__main__":    host = "smtp.gmail.com"    port = 465    sender = "SENDER@gmail.com"    pwd = "MYPASSWD"    receiver = "RECEIVER@gmail.com"    body  = "<h1>Welecome to Berlinix.com</h1>"    body += "<p>Here is my personal blog, include some technical notes.</p>"    body += "<p><img src='cid:pylogo' />Python Programming Language</p>"    msg_root = MIMEMultipart("related")    msg_root["subject"] = "Welcome to Berlinix.com";    msg_root["from"] = sender    msg_root["to"] = receiver    msg_html = MIMEText(body, "html")    msg_root.attach(msg_html)    imgfp = open("python-logo.gif", "rb")    msg_img = MIMEImage(imgfp.read())    msg_img.add_header("Content-ID", "")    msg_img.add_header("Content-Disposition", "inline", filename="python-logo.gif")    msg_root.attach(msg_img)    s = smtplib.SMTP_SSL(host, port);    s.set_debuglevel(1)    s.login(sender, pwd)    s.sendmail(sender, receiver, msg_root.as_string())

这段代码使用了MIMEMultipart,并且创建了2个MIME对象msg_html和msg_img,并将他们attach()上msg_root。以上注意嵌入图片的使用:<img src="cid:pylogo.gif">。如果我们只为邮件添加附件,而不是嵌入图片,代码将会是这样:

msg_attch = MIMEImage(open("python-logo.gif", "rb").read())msg_attch.add_header("Content-Disposition", "attachment", filename="python-big.gif")msg_root.attach(msg_attch)
0 0
原创粉丝点击