Python学习之发邮件

本文改写于2019年5月30日

前言

借助于本篇学习了解python如何去利用SMTP发送邮件,实操部分用的是阿里云的邮件推送服务。每天可以有200封免费邮件发送。

本文涉及到的库有:smtplib、email、yagmail

一、基本语法

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

Python创建 SMTP 对象语法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host:为可选参数,一般为服务器本机ip地址或者是域名
  • port:在给出host后,指定SMTP的端口号,,一般为25端口
  • local_hostname:若本机发送邮件,填写:localhost即可

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

简单实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #口令 
 
 
sender = '[email protected]'
receivers = ['[email protected]']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
 
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
 
 
try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

二、实操部分

2.1 准备工作

  • 登入阿里云账号选择邮件推送产品
  • 设置发信域名按要求添加一个域名(最好备案)
  • 域名解析的地方按配置要求解析
  • 解析完成后验证
  • 设置发信域名新建发信地址发信类型选择触发回信地址不用填
  • 设置SMTP密码大写字母,小写字母,数字都要有!

2.2 纯文本内容或者超文本(html)发送

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 设置账户
ali_username = '你设置的SMTP发件地址'
ali_password = 'SMTP密码'
# 发送者
sender = '设置的发件地址'
# 接收者,最多限制30个
receiver =['收件人邮箱']

# 构造邮件消息
# 邮件正文(纯文本)
mail_content = '这里填写你要发送邮件的正文内容'
msg = MIMEText(mail_content, 'plain', 'utf-8')
# 邮件正文(超文本(html))
# mail_content = r'

这是个测试邮件

我在测试发送html,这是一个超级链接百度

' # msg = MIMEText(mail_content, 'html', 'utf-8') # 邮件主题 mail_title = '这里填写邮件主题' msg['Subject'] = Header(mail_title, 'utf-8') # 中文需要编码 msg['From'] = sender msg['To'] = ';'.join(receiver) # 将收件人列表转成;分割的字符串 # 连接SMTP服务端,用的SSL方式,端口465 try: smtp = smtplib.SMTP_SSL('smtpdm.aliyun.com') # 设置debug调试,0关闭,1开启,2带有时间戳(v3.5+) smtp.set_debuglevel(0) smtp.login(ali_username, ali_password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败:'+ str(e))
  • 构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。
  • msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

2.3 发送图像、文本、附件混合

该部分内容详情见:参考文章3
multpart说明:

  • 常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。
  • 邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。
  • 邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。
  • 邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication


# 设置账户
ali_username = '你设置的SMTP发件地址'
ali_password = 'SMTP密码'
# 发送者
sender = '设置的发件地址'
# 接收者,最多限制30个
receiver =['收件人信箱']

# 构造邮件对象MIMEMultipart对象,支持图片、附件、文本、超文本
msg = MIMEMultipart()

# 邮件主题
mail_title = '这里填写邮件主题'
msg['Subject'] = Header(mail_title, 'utf-8')  # 中文需要编码
msg['From'] = sender
msg['To'] = ';'.join(receiver)

# 邮件正文
# 构造文字内容
# text = 'Hi!\n 我在测试发送邮件。\n这是你要的连接:https://www.baidu.com\n '
# text_plain = MIMEText(text, 'plain','utf-8')
# msg.attach(text_plain)

# 构造图片链接,将图片放置正文
with open('./test.png', 'rb') as imagefile:
    sendimagefile = imagefile.read()
image = MIMEImage(sendimagefile)
# image.add_header('Content-Disposition', 'attachment', filename = 'test.png')
# 添加图片附件,不能和正文添加图片共存
image.add_header('Content-ID', '')
msg.attach(image)

# 构造正文html,不能和文本共存
html = """
  
    
    
    

Hi!
How are you?
Here is the link you wanted.



""" text_html = MIMEText(html,'html', 'utf-8') # text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' # 作为附件添加需加此条语句 msg.attach(text_html) # 构造附件 with open('./test.py','rb') as uploadfile: sendfile = uploadfile.read() sendfile_part = MIMEApplication(sendfile) # 用MIMEApplication支持多种文件类型 sendfile_part.add_header('Content-Disposition', 'attachment', filename="test.py") msg.attach(sendfile_part) # 连接SMTP服务端,用的SSL方式,端口465 try: smtp = smtplib.SMTP_SSL('smtpdm.aliyun.com') # 设置debug调试,0关闭,1开启,2带有时间戳(v3.5+) smtp.set_debuglevel(0) smtp.login(ali_username, ali_password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit() print('邮件发送成功!') except Exception as e: print('邮件发送失败:'+ str(e))

三、人生苦短,我用Python

Python为啥伟大,不就是因为有众多的第三方库么。接下来介绍下发邮件的库:yagmail,用了这个,那么你就哈哈哈哈哈~~~~~~

任何库请学会看官方文档

官方文档:传送门

使用前请先安装yagmail

import yagmail

username = '你设置的SMTP发件地址'
password = 'SMTP密码'
receiver = ['收件人']
subject = '这是一个测试主题文件'
content = ['这是正文文本及html加图片测试,这是文本','这是html 链接 you wanted.',yagmail.inline('./test.png'),{'./test.png':'a.png'}]
# 只有图片可以用字典显示别名
# yagmail.inline()可以将图片嵌入正文
# 将正文全部以文本输出用yagmail.raw(),否则会自动判别类型

try:
    yag = yagmail.SMTP(user=username, password=password, host='smtpdm.aliyun.com', port=465)
    yag.send(to=receiver,subject=subject, contents=content, attachments=['./proxy.txt'])
    print('邮件发送成功')
except Exception as e:
    print(e)

参考文章

1、http://www.runoob.com/python/python-email.html

2、https://www.jianshu.com/p/abb2d6e91c1f

3、https://www.cnblogs.com/yufeihlf/p/5726619.html

4、https://www.docs4dev.com/docs/zh/python/3.7.2rc1/all/library-smtplib.html

5、https://blog.csdn.net/zhouxuan623/article/details/52595933

6、https://github.com/kootenpv/yagmail

7、https://www.cnblogs.com/fnng/p/7967213.html

8、https://www.jianshu.com/p/7db6af151e6c

你可能感兴趣的:(Python学习之发邮件)