Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用IMAP在python中将gmail中的电子邮件从一个标签传输到另一个标签_Python_Gmail_Imap - Fatal编程技术网

使用IMAP在python中将gmail中的电子邮件从一个标签传输到另一个标签

使用IMAP在python中将gmail中的电子邮件从一个标签传输到另一个标签,python,gmail,imap,Python,Gmail,Imap,我有一些邮件会被gmail设置标记为“测试”。我在运行时编写的这个脚本下载该标签中的任何附件,然后将所有这些电子邮件移动到另一个名为“已检查”的标签(以保持该标签清晰) 我已经完成了下载和解析部分,但我似乎无法管理移动电子邮件 以下是课程的完整部分: import imaplib import email import os import base64 #import Const user = 'email@gmail.com' password = 'imnottellingyou' ima

我有一些邮件会被gmail设置标记为“测试”。我在运行时编写的这个脚本下载该标签中的任何附件,然后将所有这些电子邮件移动到另一个名为“已检查”的标签(以保持该标签清晰)

我已经完成了下载和解析部分,但我似乎无法管理移动电子邮件

以下是课程的完整部分:

import imaplib
import email
import os
import base64
#import Const

user = 'email@gmail.com'
password = 'imnottellingyou'
imap_url = 'imap.gmail.com'

def auth(user, password, imap_url):
    con = imaplib.IMAP4_SSL(imap_url)
    con.login(user, password)
    return con

con = auth(user, password, imap_url)
con.select('Test')

type, data = con.search(None, 'ALL')
mail_ids = data[0]
id_list = mail_ids.split()
print(id_list)
print(mail_ids)

for num in data[0].split():
    typ, data = con.fetch(num, '(RFC822)')
    raw_email = data[0][1]
    # converts byte literal to string removing b''
    raw_email_string = raw_email.decode('utf-8')
    email_message = email.message_from_string(raw_email_string)

    for part in email_message.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue
        fileName = part.get_filename()

        if bool(fileName):
            filePath = os.path.join(
                'C:/Users/User/Desktop/test', fileName)
            if not os.path.isfile(filePath):
                fp = open(filePath, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
for uid in id_list:
    con.uid('STORE', uid, '+X-GM-LABELS', 'Checked')
    con.uid('STORE', uid, '-X-GM-LABELS', 'Test')
#after emails in label have been checked for attachments and downloaded
#emails will be transferred to a "checked" labe

for uid in id_list:
    con.uid('STORE', uid, '+X-GM-LABELS', 'Checked')
    con.uid('STORE', uid, '-X-GM-LABELS', 'Test')
这里是麻烦的地方。这就是我尝试过的:

import imaplib
import email
import os
import base64
#import Const

user = 'email@gmail.com'
password = 'imnottellingyou'
imap_url = 'imap.gmail.com'

def auth(user, password, imap_url):
    con = imaplib.IMAP4_SSL(imap_url)
    con.login(user, password)
    return con

con = auth(user, password, imap_url)
con.select('Test')

type, data = con.search(None, 'ALL')
mail_ids = data[0]
id_list = mail_ids.split()
print(id_list)
print(mail_ids)

for num in data[0].split():
    typ, data = con.fetch(num, '(RFC822)')
    raw_email = data[0][1]
    # converts byte literal to string removing b''
    raw_email_string = raw_email.decode('utf-8')
    email_message = email.message_from_string(raw_email_string)

    for part in email_message.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue
        fileName = part.get_filename()

        if bool(fileName):
            filePath = os.path.join(
                'C:/Users/User/Desktop/test', fileName)
            if not os.path.isfile(filePath):
                fp = open(filePath, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
for uid in id_list:
    con.uid('STORE', uid, '+X-GM-LABELS', 'Checked')
    con.uid('STORE', uid, '-X-GM-LABELS', 'Test')
#after emails in label have been checked for attachments and downloaded
#emails will be transferred to a "checked" labe

for uid in id_list:
    con.uid('STORE', uid, '+X-GM-LABELS', 'Checked')
    con.uid('STORE', uid, '-X-GM-LABELS', 'Test')

该程序运行良好,没有出现错误消息,但我的gmail收件箱中没有任何更改。

终于找到了解决方案

for uid in id_list:
    #adds the checked label (new label) to all emails that are in the id list
    con.store(uid, '+X-GM-LABELS', '(Checked)')
    #instead of "removing" original label it deletes the email from the label
    #since labels act like folders in gmail
    con.store(uid,'+FLAGS', '\\Deleted')

可能是个愚蠢的问题,但你重新加载了gmail的web用户界面吗?IMAP更改需要一些时间才能传播到webui,web ui也会缓存信息。@Max是的,我尝试了几种代码变体,并多次重新加载gmail网页。我只是仔细检查了一下。这个扩展没有合适的规范,但我注意到使用了parens
con.uid('STORE',uid',X-GM-LABELS','(选中)
可能吗?@arnt我试过了,但还是没有改变con.uid('STORE',uid',X-GM-LABELS','(选中)'con.uid('STORE',uid',X-GM LABELS','(Test我怀疑你的问题是MSN/uid混淆,真的。.store()函数不接受UID作为参数。