SMTP是发送邮件的协议,python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

python对SMTP支持有smtplib和email两个模块。email负责构造邮件,smtplib负责发送邮件。

from email.mime.text import MIMEText
import smtplib

#构造邮件发送内容
msg=MIMEText('hello,my name is xjm.this send by python','plain','utf-8')

from_addr='1510261589@qq.com'   #发送者
password='jghwkwogclzahcjd'              #密码(授权码)
to_addr='946271805@qq.com'      #接收者
smtp_server='smtp.qq.com'       #smtp服务器地址

server=smtplib.SMTP(smtp_server,25)
server.set_debuglevel(1)

#不加者两个发不出去,不知道为啥。第二个是建立安全连接
server.ehlo()
server.starttls()

server.login(from_addr,password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

 

 可以去自己的邮箱看已发送:

仔细观察,有问题。

  • 邮件没有主题
  • 收件人的名字没有显示友好的名字

这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把FromToSubject添加到MIMEText中,才是一封完整的邮件:

 

from email.mime.text import MIMEText
from email import encoders
from email.header import Header
from email.utils import parseaddr,formataddr
import smtplib

#格式化邮件地址
def _format_addr(s):
    name, addr=parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(),addr))

from_addr='1510261589@qq.com'   #输入发送者
password='jghwkwogclzahcjd'              #密码
to_addr='946271805@qq.com'      #接收者
smtp_server='smtp.qq.com'       #smtp服务器地址

#构造邮件
msg=MIMEText('hello,my name is xjm.this send by python','plain','utf-8')
msg['From']=_format_addr('王者小喵喵<%s>'%from_addr)
msg['To']=_format_addr(to_addr)
msg['Subject']=Header('来自小喵喵的问候……','utf-8').encode()

server=smtplib.SMTP(smtp_server,25)
server.set_debuglevel(1)
server.ehlo()
server.starttls()
server.login(from_addr,password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

 修改了代码之后可以正常显示了:

说明:

  我们编写了一个函数_format_addr()来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>,因为如果包含中文,需要通过Header对象进行编码。

msg['To']接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可。

再发送一遍邮件,就可以在收件人邮箱中看到正确的标题、发件人和收件人。

发送HTML邮件

我们要发送HTML邮件,不是普通的纯文本怎么办。在构造MIMEText对象时,把HTML字符串穿进去,再把第二个参数plain变为HTML就可以:

msg=MIMEText('<html><body><h1>(⊙o⊙)哦!hello,my name is xjm.</h1>'+'<p>this send by <a href="http://www.python.org">py
thon</a>...</p>
'+'</body></html>','html','utf-8')

 发送附件

如果Email中要加上附件怎么办?带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可:

效果:

 

修改代码:

 

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase

#邮件对象
msg=MIMEMultipart()

#邮件正文
msg.attach(MIMEText('<html><body><h1>(⊙o⊙)哦!hello,my name is xjm.</h1>'+'<p>this send by <a href="http://www.python.org">python</a>...</p>'+'</body></html>','html','utf-8'))

#附件 MIMEBase
with open(r'C:\Users\20152\Desktop\一加\IMG_20180519_225021_8508021882695333767.jpg','rb') as f:
    #设置附件的MIME和文件名,这里是jpg类型:
    mime=MIMEBase('image','jpg',filename='IMG_20180519_225021_8508021882695333767.jpg')
    #加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='IMG_20180519_225021_8508021882695333767.jpg')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    #把附件的内容读出来:
    mime.set_payload(f.read())
    #用base64编码:
    encoders.encode_base64(mime)
    #添加到MIMEmultipart:
    msg.attach(mime)

 

版权声明:本文为xjmlove原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xjmlove/p/9132081.html