Skip to content

获取邮箱前5条消息

Before...

Q:咦?在此之前呢??
A:太简单了不需要在此之前(bushi) 当然不是! 需要对一个协议做了解!! ta是: IMAP协议! IMAP(Internet Message Access Protocol)即互联网消息访问协议,它是一种邮件获取协议,用于从邮件服务器上访问邮件盒中的邮件。与POP3(邮局协议版本3)相比,IMAP提供了更为丰富的操作,允许用户在服务器上直接管理邮件,而不是像POP3那样通常将邮件下载到本地计算机。 以下是IMAP协议的一些主要特点:

  1. 服务器端管理:IMAP允许用户在服务器上创建、管理以及删除邮件文件夹,并且可以随时查看服务器上不同文件夹中的邮件。
  2. 只读与读写模式:用户可以选择以只读方式打开邮件,也可以以读写方式打开邮件,这意味着可以在服务器上直接对邮件进行标记、移动和删除等操作。
  3. 多文件夹支持:IMAP支持多个文件夹,用户可以根据需要组织邮件。
  4. 邮件搜索:用户可以在服务器上执行搜索操作,以查找特定邮件。
  5. 持久连接:IMAP客户端通常保持与服务器的长时间连接,这样用户对邮件的操作可以实时反映到服务器上。
  6. 安全性:IMAP协议支持加密连接,通常通过IMAPS(IMAP over SSL)实现,以增强通信的安全性。
  7. 同步:使用IMAP,用户可以在多个设备上访问邮件账户,并保持邮件状态的一致性,例如在手机上阅读了一封邮件,在电脑上该邮件也会显示为已读。 IMAP协议的标准化工作始于1986年,目前的最新版本是IMAP4rev1,定义在RFC 3501中。 在使用IMAP协议时,通常需要以下信息来配置邮件客户端:
  • IMAP服务器地址:例如,imap.example.com
  • 端口号:普通IMAP使用端口143,而加密的IMAPS使用端口993
  • 用户名:您的邮件账户用户名
  • 密码:您的邮件账户密码 IMAP因其高级特性和灵活性,在现代电子邮件客户端中被广泛使用。

也因如此,选择使用IMAP协议连接服务器比较好。

切入正题

我们要用python进行对邮件服务器的请求获取邮箱内的前五份邮件
先给大家放出连接模块

连接模块 get_all_mails.py

python
_server = 'outlook.office365.com'
def get_five(imap_server,username,password):
	# 连接到IMAP服务器
	mail = imaplib.IMAP4_SSL(imap_server)
	# 登录邮箱
	mail.login(username, password)

	# 选择收件箱
	mail.select('inbox')

	# 搜索所有邮件
	status, email_ids = mail.search(None, 'ALL')

	# email_ids是一个字节字符串,其中包含所有邮件的ID
	# 我们需要将其转换为列表,并遍历每一个邮件ID
	email_ids = email_ids[0].split()

	time = 0
	# 遍历所有邮件ID并获取邮件内容
	for e_id in email_ids:
		if time <= 5:
			# 获取邮件的详细内容
			status, data = mail.fetch(e_id, '(RFC822)')
			# 解析邮件内容
			raw_email = data[0][1]
			email_message = email.message_from_bytes(raw_email)

			# 解码邮件主题
			subject = decode_header(email_message['subject'])[0][0]
			if isinstance(subject, bytes):
				# 如果主题是字节串,尝试使用GB2312解码
				subject = subject.decode('gb2312', 'ignore')
			print('标题:', subject)
			from_header = email_message['From']
			from_address = email.utils.parseaddr(from_header)[1]  # 提取邮箱地址
			print('来自于:', from_address)

			# 如果邮件是multipart类型,我们需要遍历每个部分
			if email_message.is_multipart():
				for part in email_message.walk():
					# 如果邮件部分是文本类型
					if part.get_content_type() == 'text/plain' or part.get_content_type() == 'text/html':
						# 尝试获取编码信息
						content_charset = part.get_content_charset()
						if content_charset is None:
							content_charset = 'utf-8'
						# 尝试使用指定的编码解码
						try:
							payload = part.get_payload(decode=True).decode(content_charset)
						except UnicodeDecodeError:
							# 如果指定编码解码失败,尝试使用'latin1'作为备选编码
							payload = part.get_payload(decode=True).decode('latin1', 'ignore')
						print(payload)
						print('-------------------------------------分界线---------------------------------------')
						break
			else:
				# 对于非multipart邮件,直接打印正文
				try:
					content_charset = email_message.get_content_charset()
					if content_charset is None:
						content_charset = 'utf-8'
					print(email_message.get_payload(decode=True).decode(content_charset))
				except UnicodeDecodeError:
					# 如果指定编码解码失败,尝试使用'latin1'作为备选编码
					print(email_message.get_payload(decode=True).decode('latin1', 'ignore'))
					print('-------------------------------------分界线---------------------------------------')
			time += 1
		else:
			break
	# 断开连接
	mail.logout()

可以看到的是,在get_five函数中def get_five(imap_server,username,password):有三个函数,分别是IMAP服务器的ip地址、用户名(即你的邮箱)、(登录)密码

提示

qq邮箱需根据网站中指引使用
在此处的password应填写qq邮箱的IMAP服务授权码

在使用时可以使用

python
import get_all_mails

# 主程序内容

get_all_mails.get_five(xxx,xxx,xxx)

以下是演示的主程序内容

主程序 main.py (使用outlook进行演示)

python
import get_all_mails
get_all_mails.get_five('outlook.office365.com','username@outlook.com','example123')

以上的参数解释:

  1. outlook.office365.com: outlook邮箱IMAP服务器地址
  2. username@outlook.com: 更改为你的邮箱地址
  3. example123: 更改为你的邮箱登录密码

LAST WORD...

在这里我要嘲笑某位C姓用户,给我发了半天邮件一个不差全被outlook扔垃圾邮件里面去了哈哈哈哈哈哈