Python がメールを読み取るときは、まずメールボックスで IMAP サービスまたは POP サービスを有効にする必要があります。これは通常、メールボックスの設定インターフェイスで有効にできますが、デフォルトでは有効になっていないようです。
IMAPとは何ですか? IMAP と POP の違いは何ですか? : https://open.work.weixin.qq.com/help2/pc/19887?person_id=1
Tencent メールボックスを例にとると、imap サービスが有効になっている同じインターフェイスに、関連する構成が表示されます。
接收服务器:
imap.exmail.qq.com(使用SSL,端口号993)
发送服务器:
smtp.exmail.qq.com(使用SSL,端口号465)
ここでは読み取りのみなので、対応する構成は次のとおりです。
import imaplib
email_value_config = {
'imap_server': 'imap.exmail.qq.com',
'username': '[email protected]',
'password': 'xxxxx',
}
email_server = imaplib.IMAP4_SSL(email_value_config['imap_server']) # 这样就已经链接到目标邮箱了
email_server.login(email_value_config["username"], email_value_config['password']) # 这里登录
その後の操作は次のとおりです。
-
[受信トレイ]や[ごみ箱]など、操作したいコンテンツを選択し、プログラムを使用します。
email_server.select('INBOX') # 选择【收件箱】
一般的に使用されるものは次のとおりです。
INBOX 收件箱 Sent Messages 已发送 Drafts 草稿箱 Deleted Messages 已删除 Junk 垃圾箱
-
フィルター条件に従って抽出したいメールを選択し、すべての抽出を使用できます
ALL
。その後、条件を満たすメール ID を返し、メール ID に従って一意のメールをロックします。
サンプルプログラム
import imaplib
import email
from email.utils import parsedate_to_datetime
from email.header import make_header, decode_header
email_value_config = {
'imap_server': 'imap.exmail.qq.com',
'username': '[email protected]',
'password': 'xxxxx',
}
def extract_email():
email_server = imaplib.IMAP4_SSL(email_value_config['imap_server'])
email_server.login(email_value_config["username"], email_value_config['password'])
email_server.select('INBOX') # 选择【收件箱】
# 选择收件箱
_typ, _search_data = email_server.search(None, 'ALL')
# 开始解析
mailidlist = _search_data[0].split() # 转成标准列表,获得所有邮件的ID
print(f'一共解析邮件数量:{
len(mailidlist)}')
# 解析内容:
for mail_id in mailidlist:
result, data = email_server.fetch(mail_id, '(RFC822)') # 通过邮件id获取邮件
email_message = email.message_from_bytes(data[0][1]) # 邮件内容(未解析)
subject = make_header(decode_header(email_message['SUBJECT'])) # 主题
mail_from = make_header(decode_header(email_message['From'])) # 发件人
mail_dt = parsedate_to_datetime(email_message['Date']).strftime("%Y-%m-%d %H:%M:%S") # 收件时间
email_info = {
"主题": str(subject),
"发件人": str(mail_from),
"收件时间": mail_dt,
}
print(email_info)
if __name__ == '__main__':
extract_email()
ps: オプションのメールボックスをすべて表示するには、次のプログラムを使用できます。
# 查看全部可选择的邮箱:
for i in email_server.list()[1]:
l = i.decode().split(' "/" ')
print(l[0] + " = " + l[1])