Automatiza o envio de arquivos novos de uma pasta do Google Drive para o Kindle, por e-mail, com controle local para evitar reenvio do mesmo arquivo.
O fluxo executado em app.py é:
- Inicializa um banco SQLite local (
sent_files) para registrar arquivos já enviados. - Autentica no Google Drive usando OAuth2 (
credentials.json+token.json). - Lista arquivos novos da pasta configurada (
FOLDER_ID) com MIME suportado:application/pdfapplication/epub+zip
- Faz download para
~/kindle-sync/downloads. - Envia por SMTP (Gmail) para o e-mail
@kindle.com. - Marca o arquivo como enviado no SQLite para não repetir.
- Linux (ou ambiente com Python 3 e
systemd --userpara automação por timer) - Python 3.10+
- Conta Google com API do Drive habilitada e OAuth Client configurado
- Conta de e-mail com senha de app (ex.: Gmail com 2FA)
- Endereço Send to Kindle ativo
Antes de seguir, veja o guia detalhado de configuração da conta Google e OAuth:
docs/google-drive-setup.md(explicação completa da config do Google para este projeto)
git clone https://github.com/gabriel04alves/auto-send-to-kindle
cd auto-send-to-kindle
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txtCrie o arquivo .env com base em .env.example:
cp .env.example .envValores esperados:
KINDLE_EMAIL: e-mail@kindle.comde destinoSMTP_USER: seu e-mail remetente (ex.: Gmail)SMTP_PASS: senha de app do e-mail remetente (veja a seçãoComo obter a SMTP_PASS (senha de app Google))FOLDER_ID: ID da pasta do Google Drive a ser monitorada
Exemplo:
export KINDLE_EMAIL="seu_endereco_send_to_kindle@kindle.com"
export SMTP_USER="seuemail@gmail.com"
export SMTP_PASS="sua_senha_de_app"
export FOLDER_ID="id_da_pasta"Use esta seção para preencher o valor de SMTP_PASS no .env.
- Acesse
https://myaccount.google.com/com a conta usada emSMTP_USER. - Entre em
Segurança. - Ative
Verificacao em duas etapas(obrigatorio para senha de app). - Volte para
Segurançae abraSenhas de app. - Em tipo de app, selecione
E-mail. - Em dispositivo, escolha um nome como
Auto Send To Kindle (Desktop). - Clique em
Gerare copie a senha exibida (16 caracteres). - Cole no
.envemSMTP_PASS.
Exemplo:
export SMTP_PASS="abcd efgh ijkl mnop"Notas:
- Nao use sua senha normal da conta Google.
- Se sua conta for Google Workspace, o admin pode bloquear senha de app.
- Trate
SMTP_PASScomo segredo e nunca publique em repositório.
Coloque o arquivo OAuth client em credentials.json.
Na primeira execução, o projeto abrirá o fluxo OAuth local para gerar/atualizar token.json.
Se quiser o passo a passo completo no Google Cloud Console, use:
Com ambiente virtual ativo:
python app.pyPrimeira execução (gera token.json):
- Execute localmente no terminal (nao via
systemd). - O navegador abrira para login Google e permissao OAuth.
- Se aparecer
app not verified, useAdvancede depoisContinue. - Ao concluir, o projeto cria automaticamente
token.json.
Esse token permite que as proximas execucoes acessem o Drive sem novo login interativo.
Saídas esperadas:
- conexão com banco local
- conexão com Google Drive
- listagem e processamento de arquivos novos
- confirmação de envio e registro
O script setup_timer.sh cria automaticamente:
~/.config/systemd/user/kindle-sync.service~/.config/systemd/user/kindle-sync.timer
chmod +x setup_timer.sh
./setup_timer.shPor padrão, roda diariamente às 17:54:50.
PROJECT_DIR(default: diretório atual)SERVICE_NAME(default:kindle-sync)VENV_DIR(default:$PROJECT_DIR/venv)PYTHON_BIN(default:$VENV_DIR/bin/python)RUN_TIME(default:17:54:50)SYSTEM_PYTHON(default:python3)
Exemplo com horário customizado:
RUN_TIME="08:00:00" ./setup_timer.shsystemctl --user list-timers
systemctl --user start kindle-sync.service
journalctl --user -u kindle-sync.service -n 50 --no-pager.
├── app.py # Orquestra o fluxo principal
├── variables.py # Variáveis de ambiente, caminhos e constantes
├── config/
│ └── config_google_auth.py # OAuth2 e cliente Google Drive
├── services/
│ ├── get_data_drive.py # Listagem de arquivos novos e download
│ └── send_to_kindle.py # Envio SMTP com anexo
├── db/
│ ├── init_db.py # Criação de tabela sent_files
│ ├── already_sent.py # Verifica se arquivo já foi enviado
│ └── mark_sent.py # Registra envio com timestamp UTC
├── utils/
│ └── sanitize_filename.py # Sanitiza nome de arquivo
├── setup_timer.sh # Configura service/timer no systemd user
└── requirements.txt
Arquivo SQLite padrão:
~/auto-send-to-kindle/data/state.db
Tabela criada automaticamente:
sent_files(file_id PRIMARY KEY, file_name, sent_at)
- Nunca versionar
.env,credentials.jsonetoken.jsonem repositórios públicos. - Use senha de app no SMTP (não use senha principal da conta).
- Se qualquer segredo já foi exposto no histórico Git, revogue e gere novos imediatamente.
-
Defina KINDLE_EMAIL, SMTP_USER e SMTP_PASS no ambiente.- Verifique se o
.envestá correto e carregado no shell/processo.
- Verifique se o
-
Erro: python3 nao encontrado no PATHdurantesetup_timer.sh- Instale Python 3 ou ajuste
SYSTEM_PYTHON.
- Instale Python 3 ou ajuste
-
Serviço
systemd --userfalha ao iniciar- Consulte logs com
journalctl --user -u kindle-sync.service -n 50 --no-pager. - Confirme que
ExecStartaponta para o Python dovenvcorreto.
- Consulte logs com
-
Arquivo não aparece para envio
- Confirme
FOLDER_ID. - Verifique se o MIME é PDF/EPUB.
- Cheque se o arquivo já está registrado em
sent_files.
- Confirme