email.message_from_string 和 email.message_from_bytes

博客讲述了在处理电子邮件时遇到的编码问题,特别是从腾讯企业邮箱收到的一封异地登录提醒邮件。原始代码尝试使用'utf-8'解码邮件内容,但遇到了错误。通过引入`chardet`库检测邮件的编码,然后使用`email.message_from_string`成功解码。然而,当尝试使用`email.message_from_bytes`时,又遇到了`Header`对象没有长度的问题。邮件的编码为ISO-8859-1。最终,作者选择了继续使用`message_from_string`来避免问题。

在网上找到的案例代码都是使用

msg = email.message_from_string(data[0][1].decode('utf-8'))  # 转换为email.message对象

今天其中一个邮件遇到报错  'utf-8' codec can't decode byte 0xcc in position 6: invalid continuation byte’

于是用

charset=chardet.detect(data[0][1])['encoding']
msg = email.message_from_string(data[0][1].decode(charset))

问题解决了,顺便查了一下啊message_from_string的官方说明,发现还有email.message_from_bytes。

于是把代码进一步改为改为 :

msg = email.message_from_bytes(data[0][1])

普通邮件正常,当读到刚才报错的那封邮件时居然又报错了,提示:

object of type 'Header' has no len()

报错位置:

email.utils.parseaddr(msg.get('from'))

没有时间折腾,暂时先用message_from_string把

PS:

报错的邮件是腾讯企业邮箱发出的异地登录提醒:

encoding:ISO-8859-1

Subject: 异地登录提醒
From: 10000@exmail.weixin.qq.com

import sys import smtplib import imaplib import email from email.mime.text import MIMEText from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QTabWidget, QFormLayout ) class EmailClient(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("简易邮箱客户端") self.setGeometry(100, 100, 600, 400) self.tabs = QTabWidget() self.setCentralWidget(self.tabs) self.send_tab = QWidget() self.receive_tab = QWidget() self.tabs.addTab(self.send_tab, "发送邮件") self.tabs.addTab(self.receive_tab, "接收邮件") self.create_send_tab() self.create_receive_tab() def create_send_tab(self): layout = QFormLayout() self.to_input = QLineEdit() self.subject_input = QLineEdit() self.body_input = QTextEdit() send_button = QPushButton("发送邮件") send_button.clicked.connect(self.send_email) layout.addRow("收件人:", self.to_input) layout.addRow("主题:", self.subject_input) layout.addRow("内容:", self.body_input) layout.addRow(send_button) self.send_tab.setLayout(layout) def create_receive_tab(self): layout = QVBoxLayout() self.email_list = QTextEdit() self.email_list.setReadOnly(True) fetch_button = QPushButton("获取邮件") fetch_button.clicked.connect(self.fetch_emails) layout.addWidget(QLabel("最近邮件内容:")) layout.addWidget(self.email_list) layout.addWidget(fetch_button) self.receive_tab.setLayout(layout) def send_email(self): sender = "your_email@example.com" password = "your_password" recipient = self.to_input.text() subject = self.subject_input.text() body = self.body_input.toPlainText() if not (sender and password and recipient and subject and body): return msg = MIMEText(body) msg["Subject"] = subject msg["From"] = sender msg["To"] = recipient try: with smtplib.SMTP("smtp.example.com", 587) as server: server.starttls() server.login(sender, password) server.sendmail(sender, recipient, msg.as_string()) self.to_input.clear() self.subject_input.clear() self.body_input.clear() print("邮件发送成功!") except Exception as e: print("发送失败:", e) def fetch_emails(self): email_user = "your_email@example.com" email_pass = "your_password" try: with imaplib.IMAP4_SSL("imap.example.com") as mail: mail.login(email_user, email_pass) mail.select("inbox") _, data = mail.search(None, "ALL") mail_ids = data[0].split() for num in mail_ids[-5:]: # 获取最近5封邮件 _, data = mail.fetch(num, "(RFC822)") raw_email = data[0][1] msg = email.message_from_bytes(raw_email) from_ = msg["From"] subject = msg["Subject"] self.email_list.append(f"发件人: {from_}\n主题: {subject}\n{'-'*40}\n") except Exception as e: print("获取邮件失败:", e) if __name__ == "__main__": app = QApplication(sys.argv) window = EmailClient() window.show() sys.exit(app.exec()) 改成pop3系统
最新发布
08-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值