[java] Gmail에서 첨부 파일이있는 모든 이메일을 다운로드하려면 어떻게해야합니까?

Gmail에 연결하고 첨부 파일이있는 메시지를 확인하려면 어떻게합니까? 그런 다음 각 첨부 파일을 다운로드하여 처리 할 때 각 메시지에 대해 제목 : 및 보낸 사람 :을 인쇄하고 싶습니다.



답변

어려운 것 🙂

import email, getpass, imaplib, os

detach_dir = '.' # directory where to save attachments (default: current)
user = raw_input("Enter your GMail username:")
pwd = getpass.getpass("Enter your password: ")

# connecting to the gmail imap server
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("[Gmail]/All Mail") # here you a can choose a mail box like INBOX instead
# use m.list() to get all the mailboxes

resp, items = m.search(None, "ALL") # you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp)
items = items[0].split() # getting the mails id

for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)") # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you can ask for headers only, etc
    email_body = data[0][1] # getting the mail content
    mail = email.message_from_string(email_body) # parsing the mail content to get a mail object

    #Check if any attachments at all
    if mail.get_content_maintype() != 'multipart':
        continue

    print "["+mail["From"]+"] :" + mail["Subject"]

    # we use walk to create a generator so we can iterate on the parts and forget about the recursive headach
    for part in mail.walk():
        # multipart are just containers, so we skip them
        if part.get_content_maintype() == 'multipart':
            continue

        # is this part an attachment ?
        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        counter = 1

        # if there is no filename, we create one with a counter to avoid duplicates
        if not filename:
            filename = 'part-%03d%s' % (counter, 'bin')
            counter += 1

        att_path = os.path.join(detach_dir, filename)

        #Check if its already there
        if not os.path.isfile(att_path) :
            # finally write the stuff
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

와우! 그것은 무언가였습니다. 😉 그러나 재미를 위해 자바에서도 똑같이 시도하십시오!

그건 그렇고, 쉘에서 테스트했기 때문에 약간의 오류가 남아있을 수 있습니다.

즐겨

편집하다:

사서함 이름은 한 국가에서 다른 국가로 변경 될 수 있기 때문에이 오류를 방지하기 위해 m.list()전에 항목을 선택하는 것이 좋습니다 m.select("the mailbox name").

imaplib.error : SEARCH 명령이 AUTH 상태에서 잘못되었습니다. SELECTED 상태에서만 허용됩니다.


답변

저는 Perl에 대한 전문가는 아니지만 Gmail은 완전히 표준 인 2 개의 프로토콜 인 IMAP 및 POP3를 지원하며이를 수행 할 수 있습니다.

시작하는 데 도움이 될 수 있습니다.


답변

#!/usr/bin/env python
"""Save all attachments for given gmail account."""
import os, sys
from libgmail import GmailAccount

ga = GmailAccount("your.account@gmail.com", "pA$$w0Rd_")
ga.login()

# folders: inbox, starred, all, drafts, sent, spam
for thread in ga.getMessagesByFolder('all', allPages=True):
    for msg in thread:
        sys.stdout.write('.')
        if msg.attachments:
           print "\n", msg.id, msg.number, msg.subject, msg.sender
           for att in msg.attachments:
               if att.filename and att.content:
                  attdir = os.path.join(thread.id, msg.id)
                  if not os.path.isdir(attdir):
                     os.makedirs(attdir)
                  with open(os.path.join(attdir, att.filename), 'wb') as f:
                       f.write(att.content)

테스트되지 않은

  1. TOS가 이러한 스크립트를 허용하는지 확인하십시오. 그렇지 않으면 계정이 일시 중지됩니다.
  2. 더 나은 옵션이있을 수 있습니다 : GMail 오프라인 모드, Thunderbird + ExtractExtensions, GmailFS, Gmail 드라이브 등.


답변

Mail :: Webmail :: Gmail을 살펴보십시오 .

첨부 파일 받기

첨부 파일을 얻는 방법에는 두 가지가 있습니다.

1-> 반환 된 특정 첨부 파일에 대한 참조를 보냅니다. get_indv_email

# Creates an array of references to every attachment in your account
my $messages = $gmail->get_messages();
my @attachments;

foreach ( @{ $messages } ) {
    my $email = $gmail->get_indv_email( msg => $_ );
    if ( defined( $email->{ $_->{ 'id' } }->{ 'attachments' } ) ) {
        foreach ( @{ $email->{ $_->{ 'id' } }->{ 'attachments' } } ) {
            push( @attachments, $gmail->get_attachment( attachment => $_ ) );
            if ( $gmail->error() ) {
                print $gmail->error_msg();
            }
        }
    }
}

2-> 또는 첨부 파일 ID 및 메시지 ID를 전송하여

#retrieve specific attachment
my $msgid = 'F000000000';
my $attachid = '0.1';
my $attach_ref = $gmail->get_attachment( attid => $attachid, msgid => $msgid );

(첨부 파일의 데이터를 보유하는 스칼라에 대한 참조를 반환합니다.)


답변

Gmail 내에서 “has : attachment”를 필터링하고이를 사용하여 테스트 할 때 받아야하는 메시지를 식별 할 수 있습니다. 파일이 첨부 된 메시지 (종이 클립 아이콘이 표시됨)와 인라인 첨부 이미지 (종이 클립이 표시되지 않음)를 모두 제공하는 것으로 보입니다.

Gmail API가 없으므로 IMAP 또는 POP가 유일한 실제 옵션입니다. JavaMail API는 일부 지원뿐만 아니라에서이 매우 간결한 글이 될 수 있습니다 펄을 사용하여 IMAP에서 다운로드 첨부 . 일부 이전 질문 SO에 여기 수도도 도움이됩니다.

PHP 예제 도 도움 이 될 수 있습니다. 아쉽게도 imap_header에 첨부 파일 정보가 포함되어 있지 않으므로 X-Attachment-Id 필드를 보려면 본문을 다운로드해야합니다. (누군가 나를 틀렸다는 것을 증명하십시오).


답변

Python 3.3으로 업데이트 한 사람이 있다면 여기 에서 2.7 스크립트를 가져와 3.3으로 업데이트했습니다. 또한 Gmail이 정보를 반환하는 방식과 관련된 몇 가지 문제를 해결했습니다.

# Something in lines of http://stackoverflow.com/questions/348630/how-can-i-download-all-emails-with-attachments-from-gmail
# Make sure you have IMAP enabled in your gmail settings.
# Right now it won't download same file name twice even if their contents are different.
# Gmail as of now returns in bytes but just in case they go back to string this line is left here.

import email
import getpass, imaplib
import os
import sys
import time

detach_dir = '.'
if 'attachments' not in os.listdir(detach_dir):
    os.mkdir('attachments')

userName = input('Enter your GMail username:\n')
passwd = getpass.getpass('Enter your password:\n')


try:
    imapSession = imaplib.IMAP4_SSL('imap.gmail.com',993)
    typ, accountDetails = imapSession.login(userName, passwd)
    if typ != 'OK':
        print ('Not able to sign in!')
        raise

    imapSession.select('Inbox')
    typ, data = imapSession.search(None, 'ALL')
    if typ != 'OK':
        print ('Error searching Inbox.')
        raise

    # Iterating over all emails
    for msgId in data[0].split():
        typ, messageParts = imapSession.fetch(msgId, '(RFC822)')

        if typ != 'OK':
            print ('Error fetching mail.')
            raise

        #print(type(emailBody))
        emailBody = messageParts[0][1]
        #mail = email.message_from_string(emailBody)
        mail = email.message_from_bytes(emailBody)

        for part in mail.walk():
            #print (part)
            if part.get_content_maintype() == 'multipart':
                # print part.as_string()
                continue
            if part.get('Content-Disposition') is None:
                # print part.as_string()
                continue

            fileName = part.get_filename()

            if bool(fileName):
                filePath = os.path.join(detach_dir, 'attachments', fileName)
                if not os.path.isfile(filePath) :
                    print (fileName)
                    fp = open(filePath, 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()

    imapSession.close()
    imapSession.logout()

except :
    print ('Not able to download all attachments.')
    time.sleep(3)


답변

질문은 꽤 오래되었고 당시 Gmail API를 사용할 수 없었습니다. 하지만 이제 Google은 IMAP에 액세스 할 수있는 Gmail API를 제공합니다. 여기에서 Google의 Gmail API를 참조 하세요 . pypi의 google-api-python-client 도 참조하세요 .