讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

使用Python和IMAPLIB在Gmail中创建HTML邮件草稿的教程

冬墨同学_1404

冬墨同学_1404

发布时间:2025-11-23 14:28:37

|

836人浏览过

|

来源于php中文网

原创

使用Python和IMAPLIB在Gmail中创建HTML邮件草稿的教程

本教程详细介绍了如何使用python的`imaplib`库在gmail中创建可正确渲染的html邮件草稿。核心在于通过设置邮件消息的`content-type`头部为`text/html;charset=utf-8`,确保html内容在gmail草稿中被解析而非显示为纯文本。文章将提供完整的代码示例,并解析关键步骤与注意事项,帮助开发者高效实现此功能。

一、理解IMAP协议与Gmail草稿管理

IMAP(Internet Message Access Protocol)是一种用于从邮件服务器检索和管理邮件的协议。Python的imaplib库提供了与IMAP服务器交互的能力,包括读取邮件、移动邮件以及本教程重点——创建邮件草稿。

Gmail将草稿存储在一个特定的IMAP文件夹中,通常是"[Google Mail]/Drafts"或"Drafts"(具体名称可能因语言设置而异)。通过imaplib的append方法,我们可以将一个格式化的邮件消息作为草稿添加到这个文件夹。

二、创建纯文本邮件草稿的局限性

在尝试创建HTML邮件草稿时,开发者常遇到的问题是,即使邮件正文包含了HTML标签,Gmail也将其视为纯文本显示。这是因为邮件客户端需要一个明确的指示来知道如何解析邮件内容。

以下是一个创建纯文本草稿的示例,它无法正确渲染HTML:

立即学习“Python免费学习笔记(深入)”;

from email.message import Message
import imaplib
import time
import ssl

# 假设 imap_ssl 已经是一个连接到Gmail的IMAP SSL对象
# 例如:
# imap_ssl = imaplib.IMAP4_SSL("imap.gmail.com", 993)
# imap_ssl.login("your_email@gmail.com", "your_app_password")

def create_plaintext_draft(imap_ssl_conn):
    message = Message()
    message["To"] = "recipient@example.com"
    message["Subject"] = "纯文本草稿示例"
    # 包含HTML标签,但未指定Content-Type
    message.set_payload("这是一个包含 <b>HTML</b> 标签的邮件 <a href='https://www.example.com'>正文</a>。")

    # 将消息编码为UTF-8字节串
    utf8_message = str(message).encode("utf-8")

    # 将邮件追加到草稿箱
    # 注意: Gmail的草稿文件夹路径可能是 "[Google Mail]/Drafts" 或 "Drafts"
    try:
        status, data = imap_ssl_conn.append('"[Google Mail]/Drafts"', "", imaplib.Time2Internaldate(time.time()), utf8_message)
        if status == 'OK':
            print("纯文本草稿创建成功!")
        else:
            print(f"创建纯文本草稿失败: {status} - {data}")
    except Exception as e:
        print(f"发生错误: {e}")

# 示例调用 (需要替换实际的IMAP连接)
# try:
#     imap_ssl = imaplib.IMAP4_SSL("imap.gmail.com", 993)
#     imap_ssl.login("your_email@gmail.com", "your_app_password") # 使用应用密码
#     create_plaintext_draft(imap_ssl)
# finally:
#     if 'imap_ssl' in locals() and imap_ssl.state == 'AUTH':
#         imap_ssl.logout()

运行上述代码,在Gmail草稿箱中,您会看到邮件内容直接显示为:这是一个包含 HTML 标签的邮件 正文。,而不是渲染后的样式。

三、核心解决方案:设置Content-Type头部

要让Gmail正确解析HTML内容,关键在于在邮件消息中添加一个Content-Type头部,明确指出邮件正文的MIME类型是text/html,并指定字符集为UTF-8。

只需在构建email.message.Message对象时,添加以下一行代码:

message["Content-Type"] = "text/html;charset=UTF-8"

四、完整示例:创建HTML邮件草稿

现在,我们将结合上述解决方案,提供一个完整的Python代码示例,演示如何在Gmail中创建可正确渲染的HTML邮件草稿。

import imaplib
import time
from email.message import Message
import ssl # 用于创建SSL上下文,确保连接安全

# --- 配置信息 ---
IMAP_SERVER = "imap.gmail.com"
IMAP_PORT = 993
EMAIL_ADDRESS = "your_email@gmail.com" # 你的Gmail邮箱地址
APP_PASSWORD = "your_app_password" # 你的Gmail应用密码 (强烈推荐使用,而非主密码)
DRAFT_FOLDER = '"[Google Mail]/Drafts"' # Gmail草稿文件夹路径

def create_html_email_draft(recipient_email, subject, html_body):
    """
    使用imaplib在Gmail中创建HTML邮件草稿。

    Args:
        recipient_email (str): 邮件接收者地址。
        subject (str): 邮件主题。
        html_body (str): 邮件的HTML正文内容。
    """
    imap_ssl_conn = None
    try:
        # 1. 建立IMAP SSL连接
        # 使用ssl.create_default_context()来获取安全的SSL上下文
        context = ssl.create_default_context()
        imap_ssl_conn = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT, ssl_context=context)
        print(f"成功连接到IMAP服务器: {IMAP_SERVER}")

        # 2. 登录Gmail账户
        imap_ssl_conn.login(EMAIL_ADDRESS, APP_PASSWORD)
        print(f"成功登录账户: {EMAIL_ADDRESS}")

        # 3. 构建邮件消息
        message = Message()
        message["To"] = recipient_email
        message["Subject"] = subject

        # 核心:设置Content-Type头部为HTML
        message["Content-Type"] = "text/html;charset=UTF-8"

        message.set_payload(html_body)

        # 4. 将消息编码为UTF-8字节串
        # str(message) 将 Message 对象转换为符合RFC 2822的字符串
        utf8_message = str(message).encode("utf-8")

        # 5. 将邮件追加到Gmail草稿箱
        # imaplib.Time2Internaldate() 将Python时间戳转换为IMAP内部日期格式
        status, data = imap_ssl_conn.append(DRAFT_FOLDER, "", imaplib.Time2Internaldate(time.time()), utf8_message)

        if status == 'OK':
            print("HTML邮件草稿创建成功!请检查您的Gmail草稿箱。")
        else:
            print(f"创建HTML邮件草稿失败。状态: {status}, 数据: {data}")

    except imaplib.IMAP4.error as e:
        print(f"IMAP连接或登录错误: {e}")
    except Exception as e:
        print(f"发生未知错误: {e}")
    finally:
        # 6. 登出并关闭连接
        if imap_ssl_conn and imap_ssl_conn.state == 'AUTH':
            imap_ssl_conn.logout()
            print("已从IMAP服务器登出。")
        elif imap_ssl_conn:
            # 如果未成功登录,可能不需要logout,但为了健壮性可以尝试关闭
            try:
                imap_ssl_conn.close()
            except Exception:
                pass # 忽略关闭时的错误

# --- 调用示例 ---
if __name__ == "__main__":
    # 请替换为你的实际收件人邮箱、主题和HTML内容
    test_recipient = "another_email@example.com"
    test_subject = "Python IMAPLIB HTML 草稿测试"
    test_html_body = """
    <html>
    <head></head>
    <body>
        <p>您好!</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/skill11921" title="SEO Keyword Density"><img
                                                                                src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="SEO Keyword Density" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/skill11921" title="SEO Keyword Density">SEO Keyword Density</a>
                                                                        <p>SEO关键词密度优化与页面审计技能。使用场景:①提供页面路径与关键词进行SEO优化;②提升页面关键词密度;③提升搜索引擎排名;④进行SEO审计(meta标签、OG、hreflang等)。触发词:关键词密度、SEO优化、关键词优化等。</p>
                                                                </div>
                                                                <a href="/xiazai/skill11921" title="SEO Keyword Density" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
        <p>这是一封由 <b>Python</b> 的 <code>imaplib</code> 库创建的 
        <span style="color: blue;">HTML</span> 邮件草稿。</p>
        <p>点击这里访问:<a href="https://www.python.org" style="color: green;">Python 官方网站</a></p>
        <p>感谢您的查阅!</p>
    </body>
    </html>
    """

    create_html_email_draft(test_recipient, test_subject, test_html_body)

在运行此代码前,请确保:

  1. 将EMAIL_ADDRESS替换为您的Gmail邮箱。
  2. 将APP_PASSWORD替换为您为Python应用程序生成的Gmail应用密码。为了账户安全,切勿使用您的主Gmail密码。您可以在Google账户安全设置中生成应用密码。
  3. 根据需要修改test_recipient、test_subject和test_html_body。

五、代码解析与注意事项

  1. email.message.Message对象: email.message.Message类提供了一个通用的容器来创建邮件消息。对于简单的单部分邮件,它非常适用。如果需要创建包含附件或多部分(如纯文本和HTML同时存在)的邮件,email.mime.text.MIMEText或email.mime.multipart.MIMEMultipart会是更合适的选择,它们会自动处理Content-Type等头部。然而,对于本教程中仅需发送HTML内容的情况,直接在Message对象上设置Content-Type是简洁有效的。

  2. Content-Type: text/html;charset=UTF-8:

    • text/html: 告知邮件客户端邮件内容是HTML格式。
    • charset=UTF-8: 指定邮件内容的字符编码为UTF-8,确保各种语言字符都能正确显示。这是最佳实践。
  3. Gmail草稿文件夹路径: "[Google Mail]/Drafts"是Gmail英文版通常的草稿箱路径。如果您的Gmail是其他语言版本,或者遇到路径错误,可以尝试使用"Drafts"或通过imap_ssl_conn.list()命令查看所有文件夹列表来确认正确的路径。

  4. IMAP连接与认证:

    • 始终使用IMAP4_SSL建立安全连接(端口993)。
    • 应用密码(App Password): 强烈建议为自动化脚本使用Gmail应用密码。这比直接使用您的主账户密码更安全,并且在双重验证开启时是必须的。您可以在Google账户的安全设置中生成应用密码。
  5. 错误处理: 代码中包含了try...except...finally块,用于捕获IMAP操作可能遇到的错误,并确保在程序结束时登出IMAP服务器,释放资源。

  6. HTML内容:

    • 确保html_body是一个结构良好、有效的HTML字符串。
    • 如果HTML内容是动态生成的,请注意进行适当的HTML转义,以防止跨站脚本(XSS)等安全问题。
    • 邮件客户端对CSS和JavaScript的支持有限,通常只支持内联CSS或

六、总结

通过本教程,您应该已经掌握了使用Python的imaplib库在Gmail中创建HTML邮件草稿的核心技术。关键在于正确设置邮件消息的Content-Type头部为text/html;charset=UTF-8。结合IMAP协议的连接、认证和邮件追加操作,您可以自动化地在Gmail中生成符合预期的HTML格式草稿,这对于需要预设邮件模板或进行邮件营销测试的场景非常有用。请务必遵循安全最佳实践,使用Gmail应用密码进行认证。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1898

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3104

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6344

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6409

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7954

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

12214

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

6339

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

7067

2025.08.07

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn