def test_printable_chars(self): for code in range(32, 127): if code == 38: # & continue self.assertEqual(bytes((code, )), imap_utf7.encode(chr(code))) self.assertEqual(chr(code), imap_utf7.decode(bytes((code, )))) self.assertEqual(imap_utf7.encode('&'), b'&-') self.assertEqual(imap_utf7.decode(b'&-'), '&')
def get_email_folders(email_info): # connect to host using SSL and login to server imap = imaplib.IMAP4_SSL(email_info.host) imap.login(email_info.login, email_info.password) # Get the folders raw_folders = [decode(folder) for folder in imap.list()[1]] folders = [folder.split(' "/" ')[1].replace('"','') for folder in raw_folders] return folders
def get_mailbox_folders(): LOP_PASS = '******' LOP_LOGIN = '******' LOP_HOST = 'mail.gandi.net' imap = imaplib.IMAP4_SSL(LOP_HOST) imap.login(LOP_LOGIN, LOP_PASS) # Get the folders raw_folders = [decode(folder) for folder in imap.list()[1]] folders = [ folder.split(' "/" ')[1].replace('"', '') for folder in raw_folders ] return folders
def subdirectory(obj, name): test, folders = obj.list('""', '"' + name + '/*"') sub_folders = [] for item in folders: if item is None: print('Subdirectory is None') break # imap utf7 타입으로 디코딩 flags, separator, name = parse_mailbox(bytes.decode(item)) name_decodeing = imap_utf7.decode(name.encode()) # 폴더 리스트 추가 sub_folders.append(name_decodeing) return sub_folders
def create_email_imap(imap_srv, imap_port, imap_id, imap_pw, mail_box, get_count, output_file): # define mail config config_email = dict() config_email['imap_srv'] = imap_srv config_email['imap_port'] = imap_port config_email['id'] = imap_id config_email['pw'] = imap_pw config_email['mail_box'] = mail_box config_email['get_count'] = get_count config_email['output_file'] = output_file try: # imap server 접속 imapsrv = config_email['imap_srv'] imapserver = imaplib.IMAP4_SSL(imapsrv, int(config_email['imap_port'])) imapserver.login(config_email['id'], config_email['pw']) # mail box 폴더 목록 얻기 root_folders = [] res, mail_boxs = imapserver.list('""', '*') for mbox in mail_boxs: flags, separator, name = parse_mailbox(bytes.decode(mbox)) # imap utf7 타입으로 디코딩 name_decodeing = imap_utf7.decode(name.encode()) # print(f'{name_decodeing} {name} : [Flags = {flags}; Separator = {separator}') # 폴더명 구분 # if len(name.split('/')) > 1: # 폴더 리스트 추가 root_folders.append(name_decodeing) # 서브 디렉토리 탐색 # sub = subdirectory(imapserver, name) # print('sub:', sub) # 메일 박스 리스트 출력 확인 # print('root:', root_folders) # 메일 박스 확인 if config_email['mail_box'] == '전체메일': selected_mail_box = 'INBOX' else: if config_email['mail_box'] not in root_folders: print(f"[EMAIL] \"{config_email['mail_box']}\" 메일함이 없습니다.") return False else: print(f"[EMAIL] \"{config_email['mail_box']}\" 메일함이 선택되었습니다.") selected_mail_box = imap_utf7.encode(config_email['mail_box']) # 획득 할 메일 폴더 설정 imapserver.select(selected_mail_box) # 메일 리스트 획득 res, unseen_data = imapserver.search(None, 'ALL') ids = unseen_data[0] id_list = ids.split() email_count = -int(config_email['get_count']) latest_email_id = id_list[email_count:] latest_email_id.reverse() except Exception as ex: print('[메일 서버 오류] : ', ex) return True # 이메일 수량 확인 if len(latest_email_id) == 0: print('수신된 메일이 없습니다.') return True # 메일 리스트 리스트 email_list = "" # 템플릿 로드 f = open("./template_table.html", 'r', encoding="utf-8") template_table_html = f.read() f.close() # 카운트 cnt = 1 # 메일리스트를 받아서 내용을 파일로 저장하는 함수 for each_mail in latest_email_id: # 메일 raw 데이터 수신 처리 # fetch the email body (RFC822) for the given ID result, data = imapserver.fetch(each_mail, "(RFC822)") raw_email = data[0][1] email_message = email.message_from_bytes(raw_email) # 메일의 key 값 출력 # print(list(email_message.keys())) # print(email_message['Received']) # 메일 데이터 email_decoding = dict() # 수신자 데이터 파싱 try: to_data = email_message['To'].replace('"', '') to_data = to_data.split("<") to_data[0] = to_data[0].strip() if len(to_data) > 1: to_data[1] = to_data[1].replace(">", "") else: to_data.append("") except Exception as ex: print('[error] :', ex, 'email data[To]', email_message['To']) to_data = ['', ''] # 발신자 데이터 파싱 try: from_data = email_message['From'].replace('"', '') from_data = from_data.split("<") from_data[0] = from_data[0].strip() if len(from_data) > 1: from_data[1] = from_data[1].replace(">", "") else: from_data.append("") except Exception as ex: print('[error] :', ex, 'email data[From] > ', email_message['From']) from_data = ['', ''] # print('email To:', email_message['To']) # print('email to data0:', to_data[0], 'email to data1:', to_data[1]) # print('') # print('email from:', email_message['From']) # print('email from data0:', from_data[0], 'email from data1:', from_data[1]) # print('email Date', email_message['Date']) # print(from_data[0]) # print(from_data[1]) # 메일 데이터 재정의 email_decoding['FromName'] = get_encoding_msg(from_data[0]) email_decoding['FromEmail'] = from_data[1] email_decoding['ToName'] = get_encoding_msg(to_data[0]) email_decoding['ToEmail'] = to_data[1] email_decoding['Subject'] = get_encoding_msg(email_message['Subject']) email_decoding['Date'] = email_message['Date'] # print('ToName:', email_decoding['ToName']) # print('Subject:', email_decoding['Subject']) # print('Date:', email_decoding['Date']) # print('=============================') # 시간 데이터 구조 문자열 배열화 if email_decoding['Date'] is not None: date_type1 = email_message['Date'].split(" ") date_type2 = [s.replace(',', '') for s in date_type1] date_myformat = f'{date_type2[1]} {date_type2[2]} {date_type2[3]} {date_type2[4]}' # 시간 포멧 데이터 변환 try: email_decoding['Date'] = f"{datetime.datetime.strptime(date_myformat, '%d %b %Y %H:%M:%S')}" except Exception as ex: email_decoding['Date'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print('[error] :', ex) else: email_decoding['Date'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 출력 테스트 # email_data = email_decoding['Date'] + " / " # email_data = email_data + email_decoding['FromName'] + email_decoding['FromEmail'] + " / " # email_data = email_data + email_decoding['Subject'] # print(email_data) # print(email_decoding['Date']) # HTML 변환 data_table = '' if email_decoding['Date'] is not None and \ email_decoding['FromName'] is not None and \ email_decoding['FromEmail'] is not None and \ email_decoding['Subject'] is not None: data_table = template_table_html data_table = data_table.replace("##No##", str(cnt)) data_table = data_table.replace("##Date##", email_decoding['Date']) data_table = data_table.replace("##FromName##", email_decoding['FromName']) data_table = data_table.replace("##FromEmail##", email_decoding['FromEmail']) data_table = data_table.replace("##Subject##", email_decoding['Subject']) # print(data_table) # 메일 리스트 추가 email_list = email_list + data_table + "\n" # 카운트 cnt = cnt + 1 # email HTML 생성 # read template f = open("./template_main.html", 'r', encoding="utf-8") data_main = f.read() f.close() # 메인 HTML 적용 data_main = data_main.replace("##table_list##", email_list) # 최종 결과 출력 # print(data_main) # 파일 저장 f = open(config_email['output_file'], "w", encoding="utf-8") f.write(data_main) f.close() # 메일 연결 종료 imapserver.close() imapserver.logout() return True
def test_decode(self): for string, code in self.data: self.assertEqual(string, imap_utf7.decode(code))