암호 걸린 명세서를 메일에서 꺼내 읽게 했다

리스료 차액 글에서 명세서를 봐야 항목을 나눌 수 있다고 썼다. 그런 일이 매달 있다. 명세서, 청구서, 거래내역서가 메일로 오는데 대부분 암호가 걸린 첨부다. 내려받고 암호를 넣고 열어서 필요한 숫자를 옮겨 적는다. 한 통이면 별것 아닌데 매달 여러 통이다.

거래내역 자동 분류를 만들고 나니 이 앞단이 걸렸다. 파일을 사람이 날라야 한다면 그 뒤가 아무리 자동이어도 매달 사람이 붙어 있어야 한다.

메일에서 첨부만 꺼내 온다

서버가 메일을 읽기 전용으로 조회해서 첨부만 바이트로 내려받는다. 파일을 챗에 올리는 방식은 큰 파일에 약하고 매번 사람이 개입해야 하는데, 서버가 직접 가져오면 그게 없다.

읽음 처리는 하지 않는다. 이건 신경 써서 막았다. 프로그램이 훑고 지나가면서 읽음 표시를 남기면, 내가 아직 안 본 메일이 읽은 것처럼 보인다. 그러면 사람이 놓친다.

암호는 발신자 주소별로 매핑해 둔다. 어디서 온 메일이냐에 따라 어떤 암호를 넣을지 정해져 있으니, 자동으로 열린다.

암호 걸린 엑셀은 직접 풀어야 했다

PDF는 외부 도구에 암호를 넘기면 열린다. 그런데 엑셀에는 그런 도구가 없었다. 은행에서 오는 거래내역이 암호 걸린 엑셀로 오는 경우가 있어서 직접 구현했다.

구조를 알고 나면 단순하다. 암호가 걸리면 파일 전체가 컨테이너로 감싸이고, 그 안에 암호화 파라미터와 암호화된 원본이 따로 들어간다. 파라미터를 읽어 열쇠를 만들고 원본을 풀면 평문 파일이 나오고, 그때부터는 원래 쓰던 파서로 읽으면 된다.

여기서 반나절을 썼다. 열쇠를 유도할 때 쓰는 고정값의 길이를 잘못 잡았는데, 하필 암호가 맞는지 검증하는 쪽 값은 제대로 맞춰놨었다. 그래서 "암호는 맞다고 나오는데 파일은 안 풀리는" 상태가 됐다. 암호를 의심하느라 한참 헤맸다. 검증이 통과했다고 그 뒤가 다 맞는 건 아니었다.

숫자가 안 뽑히는 PDF

더 이상했던 건 어느 은행 거래내역서였다. 텍스트 추출 도구를 세 개 바꿔가며 돌려도 숫자 자리가 전부 빈칸으로 나왔다. 눈으로는 멀쩡히 보이는데 뽑으면 아무것도 없다.

파일을 뜯어보니 숫자를 일반 문자 코드가 아니라 사설 영역 코드로 넣고, 그 코드가 무슨 글자인지 알려주는 표를 빼둔 상태였다. 도구 입장에서는 읽을 수는 있는데 무슨 글자인지 알 방법이 없다.

대신 파일에 박혀 있는 글꼴 안에 글리프 이름이 남아 있었다. 그 이름을 따라가면 원래 숫자가 복원된다. 글꼴을 파싱해서 코드와 글자를 잇는 표를 직접 만들고, 그다음에 글자들의 좌표를 보고 열을 나눠 표로 다시 조립했다.

이런 처리는 조용히 실패하는 게 제일 위험하다. 절반만 읽고 나머지를 빈칸으로 채운 채 넘어가면 그게 그대로 장부에 들어간다. 그래서 읽어낸 뒤에 날짜와 금액 형식을 검사하고, 잔액이 줄에서 줄로 이어지는지도 확인한다. 하나라도 어긋나면 빈 결과를 내지 않고 그 자리에서 멈추게 했다.

정리

사람이 하는 일은 "이번 달 명세서 보여줘"라고 말하는 것뿐이다. 파일이 메일함 어디에 있는지, 암호가 뭐였는지 기억하지 않아도 된다.

만들면서 남은 교훈은 두 가지다. 검증이 통과했다고 그 뒤 단계가 맞는 건 아니라는 것, 그리고 읽어들이는 코드는 실패할 때 반드시 시끄럽게 실패해야 한다는 것이다. 조용히 절반만 읽은 자료는 틀린 장부가 되어 몇 달 뒤에 발견된다.

세무 판단은 세무사와 국세청이 최종이다. 이 글은 내가 내 장부를 어떻게 넣는지의 기록이지, 이렇게 하라는 안내가 아니다.