Python发邮件

通过SMTP发邮件

首先要了解几个协议:

  • SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。它定义了邮件客户端和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
  • POP3(Post Office Protocol),邮局协议,它定义了邮件客户端软件和POP3邮件服务器的通信规则。
  • IMAP(Internet Message Access Protocol),消息访问协议,它是POP3协议的一种扩展。
  • Exchange Server 是微软公司的一套电子邮件服务组件,是个消息与协作系统。 简单而言,Exchange server可以被用来构架应用于企业、学校的邮件系统。
  • CardDAV是一种通讯录同步的开放协议。使用 CardDAV 同步的通讯录可以编辑、修改或者删除,并且你在手机上的这些操作也同样会和服务器同步,并同时同步到你的其他设备上。

下图演示了用户A从QQ邮箱发送邮件到用户B的163邮箱的过程:

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

一般的,我们可以在本地搭建支持SMTP的服务,如sendmail,但为了省事,我们可以使用其他的邮件服务商的SMTP服务访问,如QQ、网易等。

这里以QQ邮箱为例,首先要拿到授权码,这里登录你的QQ邮箱,在设置中,选择账号选项,下拉到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务项,获取授权码。

然后手机发送短信验证。

发送普通文本邮件

代码示例:

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

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 获取授权码
sender = '1206180814@qq.com'  # 发件人账号
receivers = ['1206180814@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
send_content = 'Python 邮件发送测试...'
message = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容,第二个设置文本格式,第三个设置编码
message['From'] = Header("我是发件人", 'utf-8')  # 发件人
message['To'] = Header("我是收件人", 'utf-8')   # 收件人

subject = '邮件大标题'
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: 无法发送邮件")

运行结果如下:

发送HTML格式邮件

授权码都不变,只需将MIMEText的第二个参数的文本类型改一下即可:

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

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = '1206180814@qq.com'
receivers = ['1206180814@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
send_content = """
<h1>天不生我李淳罡</h1>
<h1>剑道万古如长夜</h1>
<p>小二上酒</p>
<img src="https://ss0.baidu.com/73t1bjeh1BF3odCf/it/u=858168512,2130327819&fm=85&s=2E4020DF1CD035FBDC9D940A0300F0F3">
<div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
"""
message = MIMEText(send_content, 'html', 'utf-8')  # 第一个参数为邮件内容
message['From'] = Header("我是发件人", 'utf-8')  # 发件人
message['To'] = Header("我是收件人", 'utf-8')  # 收件人

subject = '雪中悍刀行'
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: 无法发送邮件")

运行结果展示:

发送HTML中带本地图片的邮件

上一个示例中的图片,是一个远程连接,那么我们要发送本地的图片,就要采用下面的方式了:

import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = '1206180814@qq.com'
receivers = ['1206180814@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEMultipart('related')
message['From'] = Header("我是发件人", 'utf-8')  # 发件人
message['To'] = Header("我是收件人", 'utf-8')  # 收件人

subject = '雪中悍刀行--本地图片版'
message['Subject'] = Header(subject, 'utf-8')

msg = MIMEMultipart('alternative')
message.attach(msg)


send_content = """
<h1>天不生我李淳罡</h1>
<h1>剑道万古如长夜</h1>
<p>小二上酒</p>
<img src="cid:image">
<div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
"""
msg.attach(MIMEText(send_content, 'html', 'utf-8'))  # 第一个参数为邮件内容

# 读取当前目录下的图片
f = open('img.jpg', 'rb')
img_msg = MIMEImage(f.read())
f.close()

# 定义图片在HTML文本中的位置
img_msg.add_header('Content-ID', '<image>')   # 根据id定位
message.attach(img_msg)


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: 无法发送邮件")

运行结果:

发送带各式类型附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart实例,然后在构建附件,如果有多个附件的话,可依次构建,最后利用smtplib.smtp发送:

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

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = '1206180814@qq.com'
receivers = ['1206180814@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("我是发件人", 'utf-8')  # 发件人
message['To'] = Header("我是收件人", 'utf-8')   # 收件人

subject = 'Python发送带附件的邮件示例'
message['Subject'] = Header(subject, 'utf-8')

# 邮件正文内容
send_content = 'hi man,你收到附件了吗?'
content_obj = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容
message.attach(content_obj)

# 构造附件1,发送当前目录下的 t1.txt 文件
att1 = MIMEText(open('t1.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="t1.txt"'
message.attach(att1)

# 构造附件2,发送当前目录下的 t2.py 文件
att2 = MIMEText(open('t2.py', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="t2.py"'
message.attach(att2)
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: 无法发送邮件")

运行结果如下:

如果要发送其他类型的,如果PDF、doc、xls、MP3格式的,我们都可以通过MIMEApplication来完成,MIMEApplication默认子类型是application/octet-stream,而application/octet-stream表明这是个二进制文件,但愿接收方知道怎么处理!!!,然后客户端收到这个声明后会根据文件扩展名来猜测。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = '1206180814@qq.com'
receivers = ['1206180814@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("我是发件人", 'utf-8')  # 发件人
message['To'] = Header("我是收件人", 'utf-8')   # 收件人

subject = 'Python发送带附件的邮件示例'
message['Subject'] = Header(subject, 'utf-8')

# 邮件正文内容
send_content = 'hi man,你收到附件了吗?'
content_obj = MIMEText(send_content, 'plain', 'utf-8')  # 第一个参数为邮件内容
message.attach(content_obj)

# 构造附件1,发送当前目录下的 t1.txt 文件
part1 = MIMEApplication(open('t1.txt', 'rb').read())
part1.add_header('Content-Disposition', 'attachment', filename='t1.txt')
message.attach(part1)


# 构造附件2,发送当前目录下的 bg.mp3 文件
part2 = MIMEApplication(open('bg.mp3', 'rb').read())
part2.add_header('Content-Disposition', 'attachment', filename='bg.mp3')
message.attach(part2)


# 构造附件3,发送当前目录下的 t3.xls 文件
part3 = MIMEApplication(open('t3.xls', 'rb').read())
part3.add_header('Content-Disposition', 'attachment', filename='t3.xls')
message.attach(part3)

# 构造附件4,发送当前目录下的 t4.doc 文件
part4 = MIMEApplication(open('t4.doc', 'rb').read())
part4.add_header('Content-Disposition', 'attachment', filename='t4.doc')
message.attach(part4)


# 构造附件5,发送当前目录下的 t5.pdf 文件
part5 = MIMEApplication(open('t5.pdf', 'rb').read())
part5.add_header('Content-Disposition', 'attachment', filename='t5.pdf')
message.attach(part5)

# 构造附件6,发送当前目录下的 img.jpg 文件
part6 = MIMEApplication(open('img.jpg', 'rb').read())
part6.add_header('Content-Disposition', 'attachment', filename='img.jpg')
message.attach(part6)

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: 无法发送邮件")

结果如下:

通过smtplib.SMTP_SSL发送邮件

import smtplib
from email.utils import formataddr
from email.mime.text import MIMEText

# 通过smtplib.SMTP_SSL发送邮件
mail_host = "smtp.163.com"  # 网易邮箱服务器
mail_user = "tingyuweilou@163.com"  # 账号
mail_token = "WLWFMHNAYBCARUTP"  # 获取的授权码
sender = "1206180814@qq.com"  # 发件人邮件
# 收件人可以写一个
to = "1206180814@qq.com"
# 如果是多个收件人,就以列表的形式发送就行了
to_list = ["1206180814@qq.com", "tingyuweilou@163.com"]
msg = MIMEText("邮件正文内容", "html", "utf-8")  # # 第一个参数为邮件内容,第二个设置文本格式,第三个设置编码
msg["From"] = formataddr(["张开", sender])
msg['To'] = to
msg["Subject"] = "邮件大标题"

server = smtplib.SMTP_SSL(mail_host)
server.login(mail_user, mail_token)
server.sendmail(mail_user, to_list, msg.as_string())
server.quit()
 

Selenium - 自动发送163邮件

import time
import datetime
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def login(user, pwd):
    """ 登录163邮箱 """
    # 由于可以扫码登录,而我们选择用户名和密码登录,所以,要点击 密码登录
    time.sleep(1)
    wait.until(EC.presence_of_element_located((By.ID, 'switchAccountLogin'))).click()
    # 进入iframe,因为有多个iframe,所以获取的是数组,在分析页面后,数组0索引的iframe是登陆的iframe
    time.sleep(3)
    iframe = driver.find_elements_by_tag_name('iframe')
    # print(iframe)
    '''
    [
        <selenium.webdriver.remote.webelement.WebElement (session="3f92dbd96e72746e7d27d64e6b412318", element="0.855888743369456-2")>, 
        <selenium.webdriver.remote.webelement.WebElement (session="3f92dbd96e72746e7d27d64e6b412318", element="0.855888743369456-3")>, 
        <selenium.webdriver.remote.webelement.WebElement (session="3f92dbd96e72746e7d27d64e6b412318", element="0.855888743369456-4")>, 
        <selenium.webdriver.remote.webelement.WebElement (session="3f92dbd96e72746e7d27d64e6b412318", element="0.855888743369456-5")>
    ]
    '''
    driver.switch_to.frame(iframe[0])

    # 获取用户名和密码标签,并输入对应的值
    time.sleep(1)
    driver.find_element_by_class_name('dlemail').send_keys(user)
    time.sleep(2)
    driver.find_element_by_class_name('dlpwd').send_keys(pwd)
    time.sleep(2)
    driver.find_element_by_id('dologin').click()


def send_mail():
    """ 发送163邮件,需要传递163的用户名和密码,收件人和内容 """

    try:
        # 第1步,执行登陆
        login(user, pwd)

        # 第2步,点击写信按钮
        wait.until(EC.presence_of_element_located((By.ID, '_mail_component_24_24'))).click()
        # driver.find_element_by_id('_mail_component_24_24').click()

        # 第3步,获取收件人,主题,内容框标签,写入内容
        time.sleep(1)
        # 3.1 填写收件人
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nui-editableAddr-ipt'))).send_keys(addr)  # 收件人
        time.sleep(2)
        # 3.2 填写主题
        title = driver.find_elements_by_class_name('nui-ipt-input')
        # print(11111, title)
        title[2].send_keys(theme)  # 主题
        # title.send_keys(theme)  # 主题

        # 3.3 进入content所在iframe,填写内容
        time.sleep(1)
        content_iframe = driver.find_element_by_class_name('APP-editor-iframe')
        driver.switch_to.frame(content_iframe)
        # 虽然nui-scroll这个类名在整个网页中有多个,但是这个iframe中只有一个,所以我们直接send_keys就行
        nui_scroll = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nui-scroll')))
        # print(22222222, nui_scroll)  # <selenium.webdriver.remote.webelement.WebElement (session="106a6f5778c14568827014435ddcfcd9", element="0.07847410617283446-1")>
        nui_scroll.send_keys(content)

        # 第4步,因为发送按钮不在此时的iframe中,所以要先退出iframe,才能点击发送按钮
        # 4.1 退出iframe
        time.sleep(1)
        driver.switch_to.default_content()
        # 4.2 点击发送按钮
        time.sleep(1)
        # 这个发送按钮的类名有多个,最好for循环一下,因为有坑,发送按钮是第3个,前面还有两个空标签,但是前端检查中看不到
        driver.find_elements_by_class_name('nui-btn-text')[2].click()



    finally:
        # 关闭浏览器
        time.sleep(3)
        driver.quit()
        # 截止2019-6-11,代码无误


if __name__ == '__main__':
    
    from getpass import getpass
    user = input("邮箱: ").strip()  # 填写你的163账号
    pwd = getpass('密码: ')  # 填写你的163密码
    # 获取driver
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 10)
    # driver.maximize_window()
    # 发请求
    driver.get('https://mail.163.com/')

    addr = "1206180814@qq.com"  # 收件人
    theme = '我是你爸爸'  # 主题
    content = '天不生我李淳罡,剑道万古如长夜 ————\n{}'.format(datetime.datetime.now())  # 发送内容
    send_mail()
View Code
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
try:
    driver.get('https://mail.163.com/')
    driver.maximize_window()
    time.sleep(2)
    wait.until(EC.presence_of_element_located((By.ID, 'switchAccountLogin'))).click()
    time.sleep(1)
    iframe_obj = driver.find_elements_by_tag_name('iframe')
    # print(iframe_obj)
    driver.switch_to.frame(iframe_obj[0])
    driver.find_element_by_class_name('dlemail').send_keys('你的账号')
    time.sleep(1)
    driver.find_element_by_class_name('dlpwd').send_keys('你的密码')
    time.sleep(1)
    driver.find_element_by_id('dologin').click()
    wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="_mail_component_24_24"]/span[2]'))).click()
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nui-editableAddr-ipt'))).send_keys('1206180814@qq.com')
    theme = driver.find_elements_by_class_name('nui-ipt-input')

    # print(theme)
    theme[2].send_keys('邮件主题')
    content = driver.find_element_by_class_name('APP-editor-iframe')
    driver.switch_to.frame(content)
    driver.find_element_by_class_name('nui-scroll').send_keys('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
    driver.switch_to.default_content()

    driver.find_element_by_class_name('nui-ico-sent').click()




finally:   #  无论如何,都要关闭浏览器
    time.sleep(10)
    driver.quit()
其他1
import time
from getpass import getpass
from selenium import webdriver



def worker():
    driver.get(url)
    driver.find_element_by_id('switchAccountLogin').click()
    iframe = driver.find_elements_by_tag_name('iframe')
    driver.switch_to.frame(iframe[0])
    driver.find_element_by_class_name('dlemail').send_keys(user)
    driver.find_element_by_class_name('dlpwd').send_keys(pwd)
    driver.find_element_by_id('dologin').click()
    driver.find_element_by_id('_mail_component_19_19').click()
    driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(to)
    driver.find_elements_by_class_name('nui-ipt-input')[2].send_keys(theme)
    driver.find_element_by_class_name('nui-close').click()
    content_iframe = driver.find_element_by_class_name('APP-editor-iframe')
    driver.switch_to.frame(content_iframe)
    driver.find_element_by_class_name('nui-scroll').send_keys(content)
    driver.switch_to.default_content()
    driver.find_element_by_class_name('nui-mainBtn-hasIcon').click()

if __name__ == '__main__':

    url = 'https://mail.163.com/'
    theme = '测试邮件'
    to = '1206180814@qq.com'
    content = '测试邮件内容.................................'
    user = input('用户名: ').strip()
    pwd = getpass("密码: ")
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    try:
        worker()
    except Exception as e:
        print(e)
    finally:
        time.sleep(20)
        driver.quit()
    # 截止2019-12-14,代码无误
其他2

使用Django内置邮件功能发邮件

我们在Django中会碰到发送邮件的需求,Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、QQ,下面以163邮件为例。

思路

使用Django发送邮件就相当于,事先准备好一个可用的邮箱账户,并设置好POP3/SMTP/IMAP。然后去该邮箱获得授权码,Django在发邮件时通过授权码登录该邮箱,然后通过这个邮箱向指定的一个或多个账号发送邮件。

获取授权码

首先要有一个163邮箱的账号!然后登录进去选择设置 ▶ POP3/SMTP/IMAP

然后,如下图,勾选IMAP/SMTP服务

我们进入客户端授权码,选择开启

然后,进入手机验证程序,我们获取验证码并输入,然后点击确认。

请牢记你的授权码,它只会在页面中显示一次,不过,目前的策略是会给你绑定的手机号发这个授权码,如果忘了,就重新获取吧

发送简单邮件示例

这个示例可以应用于一封邮件发送给一个或多个收件人。但不能带附件。

settings配置

现在,我们进入Django的settings中设置:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True  # 是否使用TLS安全传输协议(用于在两个通信应用程序之间提供保密性和数据完整性。)
EMAIL_USE_SSL = False  # 是否使用SSL加密,qq企业邮箱要求使用
EMAIL_HOST = 'smtp.163.com'  # 发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱
EMAIL_PORT = 25  # 发件箱的SMTP服务器端口
EMAIL_HOST_USER = 'tingyuweilou@163.com'  # 发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = 'xxxxxx'  # 发送邮件的邮箱密码(这里使用的是授权码)
EMAIL_TO_USER_LIST = ['xxxx@foxmail.com', 'xxx@qq.com']   # 此字段是可选的,用来配置收件人列表

注意,EMAIL_USE_TLSEMAIL_USE_SSL是互斥的,也就是说,不能同时为True

views配置

from django.core.mail import send_mail
def send_email(request):
    send_mail(
        subject='这里是邮件标题',
        message='这里是邮件内容',
        from_email='tingyuweilou@163.com',
        recipient_list=['1206180814@qq.com'],
        fail_silently=False
    )
    return HttpResponse('OK')    

send_mail各参数如下:

  • subject,邮件标题
  • message,发送邮件内容
  • from_email,发件人
  • recipient_list,收件人,可以是多个
  • fail_silently,如果为False时,发送失败抛出错误

现在,有了上述这些关键代码之后,我们就可以向指定的邮箱发邮件了,如果收不到邮件,可有去看垃圾邮件中找找,可能被当成了垃圾邮件(我在qq邮箱中遇到这情况,解决办法是,点开这个邮件,点击我不是垃圾邮件,就好了)。

多封邮件发送多个收件人

有时候会遇到多封邮件同时发送多个人,怎么办呢?settings配置不变,修改views中代码即可:

from django.core.mail import send_mail, send_mass_mail
def send_email(request):
    message1 = ('邮件标题1', '内容1', 'tingyuweilou@163.com', ['1206180814@qq.com'])
    message2 = ('邮件标题2', '内容2', 'tingyuweilou@163.com', ['1206180814@qq.com'])
    send_mass_mail((message1, message2), fail_silently=False)
    return HttpResponse('OK')

当发送多封邮件时,就要使用send_mass_mail了。上例中的列表内,也可以填写多个收件人。

这里简要说下send_mailsend_mass_mail的区别:

send_mail每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail

发送带附件的邮件

这里需要导入EmailMessage来完成。

from django.shortcuts import render, HttpResponse
from django.core.mail import EmailMessage
def send_email(request):
   msg = EmailMessage(
        subject='这是带附件的邮件标题',
        body='这是带附件的邮件内容',
        from_email='tingyuweilou@163.com',  # 也可以从settings中获取
        to=['1206180814@qq.com']
    )
    msg.attach_file('t2.xls')
    msg.send(fail_silently=False)
    return HttpResponse('OK')

上例中,attach_file使用当前文件系统下的某个文件做为附件。调用时,传入某个文件的完整路径,以及该附件的MIME类型(可选的)。 忽略MIME类型的话,Django会自动根据附件文件名来推测MIME类型。最简单的用法如下:

message.attach_file('/images/weather_map.png')

另外的,我们还可以使用attach传递三个参数:filenamecontent 和 mimetype. filename 是出现在邮件中的附件文件的名称,content 是附件的内容,而 mimetype 是附件所使用的MIME类型。 如果忽略 mimetype, Django会自动根据附件文件名来推测MIME内容类型。
例如:

message.attach('design.png', img_data, 'image/png')
 

 

posted @ 2022-08-23 02:39  silencio。  阅读(384)  评论(0)    收藏  举报