리눅스용 Rust 메일 클라이언트 Penguin Mail이 1.0을 공개했다

Hacker News3일 전

Penguin Mail 1.0.0이 공개됐다. x86_64 리눅스에서 돌아가는 데스크톱 메일 클라이언트로, GPL-3.0-or-later 조건의 자유 소프트웨어다. 메일과 캘린더, 연락처를 한 앱에 모으는 것을 목표로 하며, AI 기능은 기본적으로 꺼진 상태로 배포된다.

계정 지원 범위는 넓다. Gmail, Outlook.com·Hotmail·Live·Microsoft 365, Fastmail, iCloud, Yahoo는 물론 임의의 IMAP·POP3·SMTP 서버에 붙을 수 있다. 주소만 입력하면 서버 설정을 앱이 알아서 찾아준다. 여러 계정을 하나의 받은편지함에서 볼 수도 있고 계정별로 따로 볼 수도 있으며, 시스템 트레이에서 계속 동기화하면서 안읽음 개수와 알림을 띄운다.

캘린더는 일·주·월·안건 보기를 제공하고 Google, Microsoft, 제공자가 지원하는 경우 CalDAV를 통해 모든 계정의 일정을 보여준다. 초대장은 그것이 담겨 온 메일에서 바로 답할 수 있다. 연락처도 Google, Microsoft, CardDAV에서 가져오며 수신자를 입력하는 동안 자주 주고받은 사람을 후보로 제안한다. 서명과 암호화는 사용자의 GnuPG로 처리하고, 앱은 키를 보관하지도 암호문구를 묻지도 않는다.

규칙 관리도 눈에 띈다. Gmail 필터, Microsoft 받은편지함 규칙, 제공자가 지원하면 Sieve 규칙까지 평문으로 풀어서 보여주고 폼으로 새 규칙을 추가하게 한다. 목록 위의 분류 바는 Gmail 자체 카테고리를 이용해 Primary·Updates·Promotions·Social로 메일을 나누고, 발신자를 다른 분류로 옮기면 그 설정이 유지된다. 전송 예약을 걸어두면 앱이 실행 중인 동안 트레이에 있어도 제때 발송되며, 발송 직후에는 몇 초간 Undo 버튼이 남는다. 가입용 주소를 사이트마다 만들어주는 Hide My Email 기능도 있는데, 그 주소로 스팸이 오기 시작하면 해당 주소를 끄고 메일을 휴지통으로 보낼 수 있다.

AI 쪽은 사용자가 명시적으로 켜야 동작한다. 모델을 고르지 않으면 꺼져 있고, 켤 때도 LM Studio나 Ollama를 통해 자기 컴퓨터에서 돌리는 구성을 지원한다. 메일을 보내거나 설정을 바꾸기 전에는 반드시 먼저 확인을 요청한다. Ctrl+J를 누르면 자연어로 메일함에 질문할 수 있다. 답장이 안 온 발신 메일이 무엇인지, 프로모션함에 뭐가 있는지 같은 질문에 앱 자체 도구로 메일함을 읽어 답하며, 실행한 도구를 하나씩 화면에 드러낸다.

배경에는 두 흐름이 겹쳐 있다. 메일·캘린더·연락처가 클라우드 서비스로 흡수되면서 로컬 데스크톱 클라이언트의 자리는 줄었고, 동시에 Ollama나 LM Studio 같은 로컬 추론 런타임이 흔해지면서 데이터를 외부로 내보내지 않는 AI에 대한 요구가 커졌다. Penguin Mail은 자체 서버를 두지 않고 추적이나 광고도 넣지 않은 채, Gmail과 Google 캘린더 계정은 Google과, Microsoft 계정은 Microsoft Graph와 직접 통신하는 방식으로 이 둘을 묶는다.

개발자 입장에서 참고할 지점은 기능 목록보다 설계 태도다. 로컬 모델을 앱의 부가 기능으로 붙이되 모델 선택권을 사용자에게 넘기고, 에이전트가 어떤 도구를 호출했는지 UI에 노출하며, 되돌리기 어려운 동작 앞에 확인 단계를 두는 구성은 사내 도구나 데스크톱 앱에 AI를 얹을 때 그대로 차용할 만한 패턴이다. IMAP·POP3·SMTP, CalDAV, CardDAV, Sieve, GnuPG 같은 표준 프로토콜을 Rust로 직접 다룬 구현이라는 점도 프로토콜 클라이언트를 만지는 사람에게는 실질적인 참고 자료가 된다.

전제와 한계는 분명하다. 배포 대상은 x86_64 리눅스이며 버전은 1.0.0이다. AI 기능은 기본 비활성이고 쓰려면 사용자가 별도로 로컬 런타임과 모델을 준비해야 한다. 전송 예약은 Penguin Mail이 실행 중일 때만 제때 나간다는 조건이 붙는다.