Dina mejl innehåller sanningen. Problemet är att den är inlåst i Gmail, utspridd över trådar, etiketter och bilagor som försvinner i “var sparade vi det?”-kaos.
Driftsansvariga märker det när en kundtvist dyker upp. Compliance-ansvariga får ta smällen vid revisioner. Och om du driver en byrå eller ett litet team har du förmodligen testat (och övergett) minst en idé om “Gmail PostgreSQL sync” eftersom den lät för teknisk för att hålla stabil över tid.
Det här arbetsflödet gör Gmail till ett hållbart arkiv: mejl lagras i PostgreSQL för sökning och rapportering, och bilagor lagras säkert i S3/MinIO. Du får se hur det fungerar, vad du behöver och vad du ska se upp med.
Så fungerar den här automatiseringen
Här är hela arbetsflödet du kommer att sätta upp:
n8n Workflow Template: Gmail till PostgreSQL, ett sökbart e-postarkiv
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Process Items Loop", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract Binary Metadata"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Link Email Attachments"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Structure Fields", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Final Merge"]
n5@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Attachments", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>Insert or Update Database"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Binary Data Filter", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/s3.png' width='40' height='40' /></div><br/>Upload to Storage"]
n9@{ icon: "mdi:cog", form: "rounded", label: "Flow Convergence", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "End Loop", pos: "b", h: 48 }
n11@{ icon: "mdi:message-outline", form: "rounded", label: "Get Individual Message", pos: "b", h: 48 }
n12@{ icon: "mdi:message-outline", form: "rounded", label: "Get Many Sent", pos: "b", h: 48 }
n13@{ icon: "mdi:message-outline", form: "rounded", label: "Get Many Inbox", pos: "b", h: 48 }
n14@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n15@{ icon: "mdi:play-circle", form: "rounded", label: "Gmail Trigger", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Email to PostgreSQL Transform"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Attachments", pos: "b", h: 48 }
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge Attachments"]
n4 --> n2
n12 --> n9
n15 --> n11
n13 --> n9
n9 --> n7
n9 --> n18
n9 --> n16
n14 --> n12
n14 --> n13
n3 --> n5
n18 --> n8
n17 --> n18
n8 --> n3
n7 --> n1
n0 --> n10
n0 --> n6
n5 --> n4
n11 --> n9
n2 --> n0
n1 --> n17
n6 --> n0
n16 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n14,n15 trigger
class n7 decision
class n6 database
class n1,n2,n16 code
classDef customIcon fill:none,stroke:none
class n1,n2,n4,n6,n8,n16,n18 customIcon
Varför det här spelar roll: mejlhistorik som du faktiskt kan söka i
Gmail är bra för att skicka och ta emot, men det är ett uselt system of record. Sökningen funkar tills du behöver “alla meddelanden från den här leverantören förra kvartalet med faktura-PDF:en bifogad” eller du försöker bevisa vad som skickades, när och av vem. Då blir det skärmdumpar, vidarebefordrade trådar och någon som manuellt laddar ner bilagor till en mapp som heter “Viktigt (2)”. Det är tid du aldrig får tillbaka. Än värre: det skapar luckor, och luckor är precis vad revisioner och tvister älskar att hitta.
Det blir snabbt mycket. Här är var det faller isär i verkliga team.
- Folk exporterar mejl en gång, glömmer att göra det igen, och ditt “arkiv” slutar i tysthet att vara aktuellt.
- Bilagor sparas inkonsekvent, vilket gör att du inte pålitligt kan koppla en fil tillbaka till meddelandet som skickade den.
- När du behöver rapportering (volym per avsändare, svarsmönster, etiketttrender) motarbetar Gmails gränssnitt dig i varje steg.
- Dubbletter smyger sig in när du kombinerar manuella exporter, vidarebefordringsregler och ad-hoc-skript som inte hanterar uppdateringar.
Vad du bygger: Gmail → Postgres-arkiv med bilagor i S3
Den här automatiseringen fångar dina Gmail-meddelanden på två sätt: den lyssnar på nya inkommande mejl i realtid och kör också enligt schema för att hämta senaste mejlen i bulk (praktiskt när triggers missar något eller när du vill ha ett stabilt “ikapp”-jobb). Varje meddelande normaliseras till ett databasvänligt format, inklusive avsändare/mottagare, etiketter, tidsstämplar och en sökbar textversion av innehållet. Om mejlet har bilagor extraherar arbetsflödet filuppgifter, laddar upp filerna till S3/MinIO med en organiserad sökvägsstruktur och sparar sedan bilagereferenserna tillsammans med mejlposten. Till sist lagrar PostgreSQL allt med en UPSERT, så att om samma meddelande processas igen skapas inga dubbletter.
Arbetsflödet startar med Gmail-triggers (direkt och schemalagd). Därefter separeras meddelanden med binärt innehåll så att filer kan hanteras korrekt. Sedan konsolideras mejlets payload och bilagemetadata till en enda post och upsertas i Postgres, redo för sökning, dashboards och revisioner.
Det du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att ditt team behöver arkivera cirka 50 mejl per dag och att ungefär 10 av dem har bilagor. Manuellt ser även en “snabb” process ut som 2 minuter för att öppna, 1 minut för att kopiera nyckelfält och kanske 3 minuter för att ladda ner och arkivera bilagor, så du hamnar nära 2 timmar per dag när du räknar med kontextbyten. Med det här arbetsflödet lägger du cirka 15 minuter på att få igång det, sedan loggas ny mejl automatiskt medan det schemalagda jobbet fyller på senaste timmen. Din “efter”-tid blir stickprov och någon enstaka uppdatering av inloggningsuppgifter.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Självhostat alternativ om du föredrar det (Hostinger fungerar bra)
- Gmail för att läsa meddelanden via OAuth2.
- PostgreSQL för att lagra en sökbar mejltabell.
- S3- eller MinIO-uppgifter (skapa en access key i din objektlagring).
Kunskapsnivå: Medel. Du bygger ingen hel app, men du kopplar OAuth, klistrar in ett SQL-schema och testar med ett riktigt mejl.
Vill du att någon bygger detta åt dig? Prata med en automationsspecialist (gratis 15-minuters konsultation).
Steg för steg
Nya mejl eller schemalagd ikappkörning sätter igång. En väg lyssnar efter enskilda nya mejl, medan en annan kör på timer och hämtar meddelanden från den senaste timmen så att du inte är beroende av en enda trigger.
Arbetsflödet hämtar och strukturerar mejl-payloaden. Gmails API-format omvandlas till en Postgres-vänlig struktur, inklusive avsändare/mottagare, etiketter, tidsstämplar och en textversion av innehållet för sökning.
Bilagor hanteras i en egen väg. Om binärt innehåll finns delas filer upp i enskilda objekt, metadata tas fram, sedan laddas filerna upp till S3/MinIO och formas till korrekt formaterade bilagposter.
Allt slås ihop och sparas. Mejldata och bilagereferenser konsolideras, och sedan upsertar PostgreSQL meddelandeposten så att omkörningar uppdaterar i stället för att duplicera.
Du kan enkelt ändra Gmail-sökfrågan för att rikta in dig på bara inkorgen, bara skickat eller specifika etiketter utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera Gmail-triggern
Sätt upp de två triggerflöden som startar arbetsflödet: e-post i realtid och schemalagd inläsning.
- Lägg till Incoming Gmail Trigger och ställ in Options → Download Attachments på
true. - I Incoming Gmail Trigger ställer ni Poll Times till
everyXminuter medvalue: 30. - Autentiseringsuppgifter krävs: Anslut era gmailOAuth2-autentiseringsuppgifter till Incoming Gmail Trigger.
- Lägg till Scheduled Automation Trigger och ställ in Rule till ett
intervalmedfield: hours. - Anslut Incoming Gmail Trigger → Fetch Single Email.
- Anslut Scheduled Automation Trigger till både Retrieve Sent Emails och Retrieve Inbox Emails parallellt.
Tips: Genom att köra båda triggerna säkerställer ni att ni fångar meddelanden i realtid och även fyller på skickat/inkorg enligt det timvisa schemat.
Steg 2: Anslut noder för Gmail-hämtning
Konfigurera hur meddelanden hämtas från Gmail innan ni förgrenar till bilage- och meddelandebearbetning.
- I Fetch Single Email ställer ni Operation till
getoch Message ID till={{ $json.id }}. - Autentiseringsuppgifter krävs: Anslut era gmailOAuth2-autentiseringsuppgifter till Fetch Single Email.
- I Retrieve Sent Emails ställer ni Operation till
getAll, Return All tilltrueoch Filters → q tillin:sent newer_than:1h. - Autentiseringsuppgifter krävs: Anslut era gmailOAuth2-autentiseringsuppgifter till Retrieve Sent Emails.
- I Retrieve Inbox Emails ställer ni Operation till
getAll, Return All tilltrueoch Filters → q tillin:inbox newer_than:1h. - Autentiseringsuppgifter krävs: Anslut era gmailOAuth2-autentiseringsuppgifter till Retrieve Inbox Emails.
- Anslut Fetch Single Email, Retrieve Sent Emails och Retrieve Inbox Emails till Stream Junction.
Steg 3: Sätt upp bearbetning av bilagor och meddelanden
Förgrena strömmen för att bearbeta bilagor och transformera e-postpayloaden.
- Från Stream Junction skickar ni utdata till Filter Binary Content, Combine Attachment Data och Transform Email Payload parallellt.
- I Filter Binary Content ställer ni in villkoret Left Value till
={{ ($('Fetch Single Email').isExecuted ? $('Fetch Single Email').item.binary : null) || ($('Retrieve Sent Emails').isExecuted ? $('Retrieve Sent Emails').item.binary : null) || ($('Retrieve Inbox Emails').isExecuted ? $('Retrieve Inbox Emails').item.binary : null) }}och använder Loose Type Validation. - Anslut Filter Binary Content → Derive Binary Details och behåll den angivna jsCode för extrahering av bilagemetadata.
- I Split File Items ställer ni Field to Split Out till
attachments, Include tillselectedOtherFieldsoch Fields to Include tilloriginalJson.id. - Konfigurera Combine Attachment Data med Mode
combine, Advancedtrueoch Merge By Fields-mappning frånoriginalJson.idtillid. - I Transform Email Payload ersätter ni
[YOUR_EMAIL]i jsCode med er autentiserade Gmail-adress.
⚠️ Vanlig fallgrop: Om ni glömmer att ersätta [YOUR_EMAIL] i Transform Email Payload blir logiken för identifiering av utgående e-post och lässtatus felaktig.
Steg 4: Konfigurera lagring och datakonsolidering
Ladda upp bilagor till objektlagring, aggregera bilagedata och gör upsert av meddelandeposter i PostgreSQL.
- I Upload to Object Store ställer ni Operation till
upload, Bucket Name till=gmail-attachments, File Name till=/emailuser/{{ $json["originalJson.id"] }}/{{ $json.attachments.fileName }}och Binary Property Name till={{ $json.attachments.key }}. - Autentiseringsuppgifter krävs: Anslut era s3-autentiseringsuppgifter till Upload to Object Store.
- I Shape Attachment Fields ställer ni Mode till
rawoch JSON Output till={ "attachments": {{ $('Combine Attachment Data').item.json.attachments }}, "messageId": "{{ $('Combine Attachment Data').item.json['originalJson.id'] }}" }. - I Group File Items ställer ni Aggregate till
aggregateAllItemDataoch Destination Field Name tilladjunto. - Anslut Group File Items → Consolidate Records och Transform Email Payload → Consolidate Records.
- Anslut Consolidate Records → Associate Email Files för att koppla bilagor till meddelandeposter.
- Använd Batch Processing Loop för att batcha objekt och anslut den till Upsert Message Records och Loop Completion för batchloopen.
- I Upsert Message Records ställer ni Schema till
public, Table tillmessagesoch behåller Operation somupsertmed Matching Columns inställt påmessage_id. - Autentiseringsuppgifter krävs: Anslut era postgres-autentiseringsuppgifter till Upsert Message Records.
⚠️ Vanlig fallgrop: Säkerställ att bucketen gmail-attachments finns i er S3-kompatibla lagring innan ni kör arbetsflödet.
Steg 5: Testa och aktivera ert arbetsflöde
Verifiera korrekt körning, lagring och databasuppdateringar innan ni aktiverar automationen.
- Klicka på Execute Workflow och skicka ett testmejl med en bilaga för att trigga Incoming Gmail Trigger.
- Bekräfta att Upload to Object Store laddar upp filer till
gmail-attachmentsmed den förväntade sökvägsstrukturen. - Kontrollera Upsert Message Records för att säkerställa att poster skapas/uppdateras i tabellen
public.messages. - Verifiera att båda triggerflödena fungerar genom att vänta på att Scheduled Automation Trigger hämtar inkorgs- och skickade meddelanden parallellt.
- När ni är nöjda växlar ni arbetsflödet till Active för att aktivera användning i produktion.
Felsökningstips
- Gmail OAuth-uppgifter kan löpa ut eller sakna rätt scope. Om det slutar fungera, kontrollera OAuth consent/scope-inställningarna i Google Cloud Console och autentisera om i n8n först.
- Om du använder schemalagda hämtningar och batchbearbetning varierar processtiderna med inkorgens storlek. Minska fönstret “senaste timmen” eller sänk batchstorleken om Postgres-upserts börjar tajma ut.
- S3/MinIO-uppladdningar misslyckas ofta på grund av bucket-behörigheter eller sökvägsregler. Bekräfta att bucketen “gmail-attachments” finns och att access key kan skriva till den innan du felsöker något annat.
Snabba svar
Cirka 45 minuter om dina konton för Gmail, Postgres och S3/MinIO är klara.
Nej. Du kopplar framför allt inloggningsuppgifter och justerar ett par konfigurationsfält. Arbetsflödet innehåller redan transformationslogiken.
Ja. n8n har ett gratis självhostat alternativ och en gratis testperiod på n8n Cloud. Cloud-planer börjar på $20/månad för högre volymer. Du behöver också räkna med lagringskostnader för S3/MinIO (oftast några dollar i månaden om du inte lagrar väldigt stora filer).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärd och klarar n8n bra. Självhosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja, och det bör du förmodligen. De flesta börjar med att ändra Gmail-frågorna i noderna “Retrieve Sent Emails” och “Retrieve Inbox Emails” (till exempel bara en etikett eller bara en delad inkorg). Du kan också ändra uppladdningssökvägen i steget “Upload to Object Store” så att den matchar era mappkonventioner, och sedan utöka Postgres-schemat om du vill ha extra fält som “avdelning” eller “ärende-ID”.
Oftast handlar det om utgången auktorisering eller fel Gmail-scope. Återanslut Gmail i n8n och se till att du har tillåtit gmail.readonly, och kör sedan igen med ett enda testmejl. Om det fungerar för triggern men inte för bulk-hämtning, dubbelkolla vilket Google-konto som är autentiserat och om inkorgen du frågar faktiskt matchar den konfigurerade mejladressen.
De flesta små team kan utan problem köra några hundra mejl per dag på en grundläggande setup.
Ofta, ja. n8n gör det mycket enklare att hantera bilagor, loopar/batchar och en UPSERT-liknande databasskrivning utan krångliga speciallösningar. Du får också möjligheten till självhosting, vilket spelar roll om arkivet växer och du inte vill att varje extra steg ska debiteras som en premiumuppgift. Zapier eller Make kan vara bra för enkla flöden som “nytt mejl → skicka en notis”, men ett mejlarkiv har fler rörliga delar. Om du är osäker: prata med en automationsspecialist och beskriv din mejlvolym och dina krav på lagringstid.
När det här väl är igång slutar din inkorg att vara ett skört arkivskåp och börjar fungera som en riktig datakälla. Arbetsflödet tar hand om den repetitiva insamlingen och lagringen så att du faktiskt kan använda informationen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.