掘金 后端 ( ) • 2024-04-10 10:27

邮件自动化:邮差不再敲门

"想象一下,你的邮件就像是自动寻找收件人的小精灵,不再需要你手动一封封发送。多了这份空闲,不妨泡杯咖啡,享受生活。"

嘿,小伙伴们,欢迎来到自动化的魔法世界!今天,我们要学习的是如何让我们的邮件成为聪明的小精灵,它们可以自动找到收件人,而不再需要我们手动一封封地发送了。想象一下,有了这么多的空闲时间,我们可以泡一杯香浓的咖啡,享受生活,是不是听起来就很棒?

发送和接收电子邮件协议

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)和POP3(Post Office Protocol 3rd Version,邮局协议第三版)是两种常见的、用于发送和接收电子邮件的协议。下面将分别对其进行理论介绍:

SMTP

SMTP是一种在互联网上发送电子邮件的协议,通常使用TCP端口号25。它是由发送者的电子邮件客户端到发送者的电子邮件服务器,以及从发送者的电子邮件服务器到接收者的电子邮件服务器的一种通信标准。SMTP只能用来发送邮件或发送抄送给服务器的邮件,不支持邮件的获取和存储,它依赖其他协议(如IMAP或POP3)从服务器下载邮件到客户端。

类比理解: SMTP 是电子邮件中类似邮递员的角色。当你想给朋友发信,你会递给邮递员,也就是 SMTP,它负责将你的信从你的电脑(也就是你的邮件客户端)通过网络将信送到你的朋友的信箱(也就是服务器)。邮递员只是单向投递,把信件送到目的地,但是如果你要查看你收到的信件,你需要依靠别的工具。

POP3

POP3是一种用于客户端取回服务器上存储的电子邮件的协议,通常使用TCP端口号110。它具有良好的向后兼容性,是目前使用最广泛的邮件访问协议。使用POP3,邮件会被下载到本地机器,并在服务器上删除(尽管有些邮件客户端有保留服务器副本的选项),这意味着只有在使用POP3接收邮件的同一设备上,才能看到之前的邮件记录。

类比理解: 而 POP3 则像是你的私人邮政信箱。这个信箱是你从邮局(也就是邮件服务器)收信的地方。每当你想查看信件,你会打开这个信箱,下载所有的信件到你的电脑上。下载下来的信件会从你的信箱里删除掉(除非设置不删除),就像你取出信件后,信箱就会变空一样。这样使得你的信件在一台电脑上有备份,但在别的电脑上就看不到旧信件。

SMTP 和 POP3通常会一起工作。使用SMTP协议发送邮件,然后通过POP3协议接收和下载邮件。有些现代的电子邮件客户端和服务可能会使用更复杂的协议,如 IMAP,它允许在多个设备上同步邮件记录。

邮件自动化的魔法书:SMTP发送邮件

SMTP(简单邮件传输协议)是一种在互联网上发送电子邮件的标准,它就像是邮件小精灵的魔法棒,帮助它们快速找到收件人。

如何让邮件小精灵出发

首先,我们需要一个魔法工具库smtp。Python通过SMTPlib模块提供了一种很方便的方式来发送邮件。让我们一起来看一个例子,教你如何发送一封简单的邮件:

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

# 邮件小精灵的配置
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('这是我用Python自动发送的邮件哦!', 'plain', 'utf-8')
message['From'] = Header("Python大魔导师", 'utf-8')
message['To'] = Header("未来的Python小魔导师", 'utf-8')
message['Subject'] = Header('Python自动邮件发送测试', 'utf-8')

# 使用SMTP魔法
try:
    smtpObj = smtplib.SMTP('smtp.example.com')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功,快去检查你的邮箱吧!")
except smtplib.SMTPException:
    print("邮件发送失败,小精灵遇到了麻烦!")

记得替换[email protected][email protected]smtp.example.com为真实的邮件地址和SMTP服务器地址哦!

QQ 邮箱发送示例

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


# 第三方 SMTP 服务
smtpserver = 'smtp.qq.com'
username = '[email protected]'
password = 'cixzzzouyttoibvc'  # 这是你QQ邮箱的SMTP授权码,不是QQ密码或邮箱密码,获取的参考文档:https://cloud.tencent.com/developer/article/1570585
receiver = '[email protected]'

# 邮件内容
message = MIMEText('这是我用Python自动发送的邮件哦!', 'plain', 'utf-8')
message['From'] = Header("昵称+空格+<[email protected]>") # 昵称+空格+<邮箱地址>,参考文档:https://service.mail.qq.com/detail/124/995
message['To'] = Header("昵称+空格+<[email protected]>") # 昵称+空格+<邮箱地址>,参考文档:https://service.mail.qq.com/detail/124/995
message['Subject'] = Header('Python自动邮件发送测试', 'utf-8')

# 发送邮件
try:
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(username, password)
    smtp.sendmail(username, receiver, message.as_string())
    print("邮件发送成功,快去检查你的邮箱吧!")
except smtplib.SMTPException:
    print("邮件发送失败,小精灵遇到了麻烦!")
finally:
    smtp.quit()

邮件收取的魔法:POP3收取邮件

POP3(邮局协议第三版)则是邮件小精灵回家的路线图,它帮助我们从邮件服务器上收取邮件。

如何迎接邮件小精灵的归来

Python中的poplib模块提供了操作POP3协议的方法,让我们可以接收邮件。来看看怎么做:

import poplib
from email.parser import Parser

# 邮件小精灵的家门钥匙
email = '[email protected]'
password = 'your_password'
pop3_server = 'pop.example.com'

# 开启家门,迎接小精灵
server = poplib.POP3(pop3_server)
server.user(email)
server.pass_(password)

# 读取邮件
resp, mails, octets = server.list()
index = len(mails)
resp, lines, octets = server.retr(index)

# 把邮件内容拼接到一起
msg_content = b'\r\n'.join(lines).decode('utf-8')
msg = Parser().parsestr(msg_content)

print(msg)
server.quit()

记得把[email protected]your_passwordpop.example.com换成你自己的信息哦!

QQ 邮箱接收示例

import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

# 解析邮件头
def parse_msg(msg):
  for header in ['From', 'To', 'Subject']: # 遍历获取发件人,收件人,主题的相关信息
    value = msg.get(header, '') # 获取邮件头的内容
    if value:
      if header=='Subject': # 获取主题的信息,并解码
        value = decode_str(value) # 解码字符串
      else:
        hdr, addr = parseaddr(value) # 解析字符串中的邮件地址
        name = decode_str(hdr) # 解码字符串
        value = '%s <%s>' % (name, addr)
    print('%s: %s' % (header, value))


# 解码字符串
def decode_str(s): 
  value, charset = decode_header(s)[0]
  if charset:
    value = value.decode(charset)
  return value


# 邮件小精灵的家门钥匙
email = '[email protected]'
password = 'cixzzzouyttoibvc'
pop3_server = 'pop.qq.com'

# 开启家门,迎接小精灵
server = poplib.POP3(pop3_server)
server.user(email)
server.pass_(password)

# 读取邮件
resp, mails, octets = server.list()
index = len(mails)
resp, lines, octets = server.retr(index)

# 把邮件内容拼接到一起
msg_content = b'\r\n'.join(lines).decode('utf-8')
msg = Parser().parsestr(msg_content)

print(msg) # 邮件原始文本
print(parse_msg(msg)) # 解析的文本
server.quit()

小精灵的冒险对比

虽然SMTP和POP3都是邮件的魔法,但他们的使命不同。SMTP是专门用来发送邮件的,就像是小精灵出发的魔法;而POP3则是用来接收邮件的,像是小精灵归家的路径。在现代的魔法世界里,还有一种叫做IMAP的魔法,它可以让邮件小精灵即使不回家,也能让你看到它们收集到的所有宝藏。

朋友们,是不是觉得自动化发送和接收邮件就像是进行一场魔法冒险呢?现在,你们也可以尝试成为一个邮件魔法师了,不再需要手动一封封发送邮件,把更多的时间留给自己,享受美好的生活吧!

附件与内容处理:邮件里的小秘密

"处理邮件附件和内容就像是拆礼物一样,每次打开都充满期待和惊喜。Python让这一切变得简单又有趣。"

好的,朋友们,让我们继续我们的魔法之旅,深入探索自动化邮件的另一个神奇角落——邮件里的小秘密:附件和内容处理。打开邮件就像是拆开一份精心包装的礼物,你永远不知道里面会有什么惊喜等着你。而Python,这位强大的魔法师,将会帮助我们轻松地揭开这些秘密。

邮件内容的魔法解读

首先,我们来看看如何使用Python的魔法来读取和处理邮件的内容。邮件的内容不仅仅是文字,它还可以包含HTML格式的丰富文本,让我们的邮件更加生动有趣。

读取纯文本邮件内容

假设你收到了一封纯文本格式的邮件,我们可以使用email模块来解析邮件内容:

from email.parser import Parser

# 假设邮件内容保存在这个字符串里
email_text = """
From: Python大魔导师 <[email protected]>
To: 小魔法师 <[email protected]>
Subject: Python魔法课

欢迎来到Python魔法世界!
"""

# 解析邮件内容
message = Parser().parsestr(email_text)
print(message.get_payload())

解析HTML格式的邮件内容

如果邮件内容是以HTML格式发送的,我们同样可以使用email模块来解析,不过处理方式会稍有不同:

from email.parser import Parser

# 假设邮件内容保存在这个字符串里,且为HTML格式
email_text = """
From: Python大魔导师 <[email protected]>
To: 小魔法师 <[email protected]>
Subject: Python魔法课
Content-Type: text/html

<p>欢迎来到<b>Python魔法世界</b>!</p>
"""

# 解析邮件内容
message = Parser().parsestr(email_text.strip())
if message.get_content_type() == 'text/html':
    print(message.get_payload())

邮件附件的魔法拆解

邮件附件就像是藏在邮件里的宝藏,拆解它们需要一点小技巧。但别担心,Python的魔法同样可以帮助我们轻松地处理它们。

发送带有附件的邮件

要发送一个带有附件的邮件,我们可以使用email模块中的MIMEMultipart类来构建邮件,然后添加附件:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

sender_email = "[email protected]"
receiver_email = "[email protected]"
password = "your_password"  # 发件人邮箱密码

# 创建带有附件的邮件
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = "一个带有附件的魔法信件"

# 邮件正文内容
message.attach(MIMEText('这是邮件正文,附件在下面。', 'plain', 'utf-8'))

# 添加附件
file = "path/to/your/file.txt"  # 文件路径
attachment = open(file, "rb")

p = MIMEBase('application', 'octet-stream')
p.set_payload((attachment).read())
encoders.encode_base64(p)

p.add_header('Content-Disposition', "attachment; filename= %s" % file)

message.attach(p)

# 使用SMTP魔法发送邮件
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
server.login(sender_email, password)
text = message.as_string()
server.sendmail(sender_email, receiver_email, text)
server.quit()

QQ 邮箱发送附件示例

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

sender_email = "[email protected]"
receiver_email = "[email protected]"
password = "cixzzzouyttoibvc"  # 发件人邮箱密码

# 创建带有附件的邮件
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = "一个带有附件的魔法信件"

# 邮件正文内容
message.attach(MIMEText('这是邮件正文,附件在下面。', 'plain', 'utf-8'))

# 添加附件
file = "path/to/your/file.txt"  # 文件路径
attachment = open(file, "rb")

p = MIMEBase('application', 'octet-stream')
p.set_payload((attachment).read())
encoders.encode_base64(p)

p.add_header('Content-Disposition', "attachment; filename= %s" % file)

message.attach(p)

# 使用SMTP魔法发送邮件
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls()
server.login(sender_email, password)
text = message.as_string()
server.sendmail(sender_email, receiver_email, text)
server.quit()

接收并提取附件

接收邮件并提取附件同样简单,我们可以检查邮件的每个部分,找到附件并保存下来:

# 假设我们已经用之前的方法连接到了邮箱并获取了邮件
for part in message.walk():
    # 如果是附件
    if part.get_content_maintype() == 'multipart' or part.get('Content-Disposition') is None:
        continue
    filename = part.get_filename()
    if not(filename): continue

    # 保存附件
    with open(filename, 'wb') as f:
        f.write(part.get_payload(decode=True))

朋友们,看到没有,无论是处理邮件的内容还是附件,Python都能让这一切变得简单又有趣。现在,你们也可以尝试成为邮件处理的小魔法师了,用Python的力量去探索和发现邮件世界里的每一个小秘密吧!

解析邮件:拆信的艺术

"用Python来解析邮件,就像是掌握了一门拆信的艺术,无论是什么密码,都能轻松破解,一探究竟。"

小伙伴们,拿起你们的魔法棒,我们即将学习一门非常酷的艺术——拆信的艺术!在这个电子邮件遍布的时代,用Python来解析邮件,就像是成为了一名密码破解高手,无论信件里藏着什么秘密,我们都能一探究竟。

解析邮件:拆信的艺术

当你的电子邮箱里塞满了各种邮件时,Python就能派上用场了。它可以帮你像处理普通文本一样处理这些邮件,无论是读取邮件内容、提取附件,还是解析邮件头部信息,Python都能轻松搞定。

使用email模块解析邮件

Python的email模块提供了一套非常强大的工具,可以帮助我们解析和处理电子邮件。首先,让我们看看如何读取邮件的基本信息:

import email

msg = email.message_from_string('From: Python大魔导师 <[email protected]>\nTo: 小魔法师 <[email protected]>\nSubject: 掌握拆信的艺术\n\nHello, this is a test.')

print(msg['From'])
print(msg['To'])
print(msg['Subject'])
print(msg.get_payload())

解析复杂邮件结构

现代的电子邮件可能包含多种不同类型的内容,包括纯文本、HTML和各种附件。Python可以帮助我们轻松处理这些复杂的邮件结构:

from email.parser import Parser

# 假设邮件内容以字符串形式给出,包含多种类型的内容
email_content = """
From: Python大魔导师 <[email protected]>
To: 小魔法师 <[email protected]>
Subject: 掌握拆信的艺术
Content-Type: multipart/mixed; boundary=boundary-example

--boundary-example
Content-Type: text/plain

欢迎来到Python解析邮件的魔法世界!

--boundary-example
Content-Type: text/html

<html>
<body>
<h1>欢迎来到Python解析邮件的魔法世界!</h1>
</body>
</html>

--boundary-example--
"""

message = Parser().parsestr(email_content)

# 递归遍历邮件内容
def walk_message(msg):
    if msg.is_multipart():
        for part in msg.get_payload():
            walk_message(part)
    else:
        print(f"内容类型: {msg.get_content_type()}")
        if msg.get_content_type() == 'text/plain':
            print(msg.get_payload())

walk_message(message)

提取邮件附件

提取邮件附件也是解析邮件中一个非常实用的功能。Python让这一切变得简单:

from email.parser import Parser

# 继续使用上面定义的walk_message函数
# 假设我们已经解析了一个邮件对象到message中

def extract_attachments(msg):
    for part in msg.walk():
        content_disposition = str(part.get("Content-Disposition"))
        if "attachment" in content_disposition:
            filename = part.get_filename()
            payload = part.get_payload(decode=True)
            # 保存附件
            with open(filename, "wb") as f:
                f.write(payload)
            print(f"附件 {filename} 已保存。")

extract_attachments(message)

小结

通过今天的学习,你们已经掌握了拆信的艺术,成为了真正的邮件解析大师!无论是家人的温馨便条,还是老师的重要通知,甚至是朋友的秘密消息,都能轻松拆解,一探究竟。

记住,小伙伴们,学习Python就是要不断探索和尝试,通过实践来解锁更多的魔法技能。现在,让我们一起把新学到的魔法应用到日常生活中,告别手动处理邮件的日子,享受自动化带来的便捷和乐趣吧!

** 欢迎关注微信公众号【千练极客】,尽享更多干货文章!**

** 欢迎关注微信公众号【千练极客】,尽享更多干货文章!**

** 欢迎关注微信公众号【千练极客】,尽享更多干货文章!**

本文由博客一文多发平台 OpenWrite 发布!