Pakkeshop er en Azure Function der automatisk:
- Læser ulæste emails fra en IMAP inbox hver time
- Udtrækker pakkeoplysninger via Azure OpenAI
- Indsætter data i et Google Sheet
- Sletter emailen efter behandling
Email Processing:
- Timer trigger der kører hver time (CRON:
0 0 */1 * * *) - Henter kun ulæste emails via IMAP
- Sletter emails efter succesfuld behandling
Data Extraction via Azure OpenAI:
- Pakkenummer
- Distributør (dao, gls, postnord, bring)
- Pickup code (valgfrit)
- Sidste afhentningsdag (valgfrit)
Google Sheets Integration:
- Indsætter data som nye rækker
- Inkluderer timestamp for når data blev behandlet
- Retry logik (3 forsøg ved fejl)
- .NET 8.0 SDK
- Azure Functions Core Tools
- Visual Studio 2022 eller VS Code
Opdater local.settings.json med dine credentials:
{
"Values": {
"Email:ImapServer": "mail.simply.com",
"Email:ImapPort": "143",
"Email:Username": "din-email@domain.dk",
"Email:Password": "dit-password",
"Email:UseSsl": "true",
"OpenAI:Endpoint": "https://your-resource.openai.azure.com/",
"OpenAI:ApiKey": "din-api-key",
"OpenAI:DeploymentName": "gpt-4",
"OpenAI:MaxTokens": "1000",
"GoogleSheets:SpreadsheetId": "dit-spreadsheet-id",
"GoogleSheets:SheetName": "Sheet1",
"GoogleSheets:CredentialsJson": "{...service account json...}"
}
}dotnet restore
dotnet build
func startaz group create --name pakkeshop-rg --location westeuropeaz storage account create \
--name pakkeshopstorage \
--resource-group pakkeshop-rg \
--location westeurope \
--sku Standard_LRSaz functionapp create \
--name pakkeshop-function \
--resource-group pakkeshop-rg \
--storage-account pakkeshopstorage \
--consumption-plan-location westeurope \
--runtime dotnet-isolated \
--runtime-version 8 \
--functions-version 4 \
--os-type WindowsDu skal konfigurere alle settings i Azure Portal eller via Azure CLI.
- Gå til din Function App i Azure Portal
- Vælg Configuration under Settings
- Klik New application setting for hver af følgende:
Email Settings:
Email:ImapServer=mail.simply.com(eller din IMAP server)Email:ImapPort=143(eller993for SSL)Email:Username=din-email@domain.dkEmail:Password=dit-email-passwordEmail:UseSsl=true
Azure OpenAI Settings:
OpenAI:Endpoint=https://your-resource.openai.azure.com/OpenAI:ApiKey=din-azure-openai-api-keyOpenAI:DeploymentName=gpt-4(eller dit deployment navn)OpenAI:MaxTokens=1000
Google Sheets Settings:
GoogleSheets:SpreadsheetId=dit-spreadsheet-idGoogleSheets:SheetName=Sheet1(eller dit sheet navn)GoogleSheets:CredentialsJson={...din service account JSON...}
- Klik Save og derefter Continue
# Email Settings
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "Email:ImapServer=mail.simply.com"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "Email:ImapPort=143"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "Email:Username=din-email@domain.dk"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "Email:Password=dit-password"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "Email:UseSsl=true"
# OpenAI Settings
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "OpenAI:Endpoint=https://your-resource.openai.azure.com/"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "OpenAI:ApiKey=din-api-key"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "OpenAI:DeploymentName=gpt-4"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "OpenAI:MaxTokens=1000"
# Google Sheets Settings
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "GoogleSheets:SpreadsheetId=dit-spreadsheet-id"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "GoogleSheets:SheetName=Sheet1"
az functionapp config appsettings set --name pakkeshop-function --resource-group pakkeshop-rg \
--settings "GoogleSheets:CredentialsJson={...json...}"- Højreklik på projektet i Solution Explorer
- Vælg Publish
- Vælg Azure og klik Next
- Vælg Azure Function App (Windows) og klik Next
- Vælg din Function App og klik Finish
- Klik Publish
# Fra projektets rod-mappe
func azure functionapp publish pakkeshop-functionSe Azure Functions deployment dokumentation
- Gå til din Function App i Azure Portal
- Vælg Functions under Functions
- Du skulle se EmailProcessor funktionen
- Klik på funktionen og vælg Monitor for at se execution logs
- Vent til næste time hvor funktionen kører automatisk, eller trigger den manuelt
- Gå til Google Cloud Console
- Opret nyt projekt (fx "Pakkeshop")
- Gå til APIs & Services → Library
- Søg efter og aktiver Google Sheets API
- Gå til APIs & Services → Credentials
- Klik Create Credentials → Service Account
- Udfyld navn (fx "pakkeshop-service") og klik Create
- Skip permissions og klik Done
- Klik på den nye service account
- Gå til Keys tab
- Klik Add Key → Create new key → JSON
- Download JSON filen
- Åbn dit Google Sheet
- Klik Share
- Indsæt service account email (fra JSON:
client_emailfeltet)- Eksempel:
pakkeshop@pakkeshop-479906.iam.gserviceaccount.com
- Eksempel:
- Giv Editor rettigheder
- Fjern flueben ved "Notify people"
- Klik Share
Spreadsheet ID findes i URL'en:
https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/edit
Du skal escape JSON'en til en enkelt linje. Brug et værktøj som:
Eller i PowerShell:
$json = Get-Content "path\to\credentials.json" -Raw
$escaped = $json -replace '"', '\"' -replace '\n', '\n' -replace '\r', ''
Write-Output $escaped- Gå til Azure Portal
- Søg efter Azure OpenAI
- Klik Create
- Udfyld:
- Resource group: vælg eller opret ny
- Region: fx West Europe
- Name: fx
pakkeshop-openai - Pricing tier: Standard S0
- Klik Review + create og derefter Create
- Gå til din Azure OpenAI resource
- Klik Model deployments (eller gå til Azure OpenAI Studio)
- Klik Create new deployment
- Vælg model: gpt-4 eller gpt-35-turbo
- Giv deployment et navn (fx
gpt-4) - Klik Create
- I Azure Portal, gå til din Azure OpenAI resource
- Vælg Keys and Endpoint under Resource Management
- Kopier:
- Endpoint (fx
https://pakkeshop-openai.openai.azure.com/) - Key 1 eller Key 2
- Endpoint (fx
- Brug disse i Application Settings som
OpenAI:EndpointogOpenAI:ApiKey
Function App har automatisk Application Insights integration.
Se logs:
- Gå til Function App i Azure Portal
- Vælg Application Insights under Settings
- Klik View Application Insights data
- Vælg Logs og kør queries, fx:
traces
| where message contains "Email processor"
| order by timestamp desc
| take 50Opret alerts for fejl:
- Gå til Application Insights
- Vælg Alerts under Monitoring
- Klik Create → Alert rule
- Konfigurer conditions (fx failures > 5 in 5 minutes)
- Tilføj action group for notifications
IMAP Connection Fejl:
- Verificer IMAP server, port og credentials
- Check om UseSsl er korrekt sat (true for port 993, false for 143)
- Test IMAP adgang manuelt med en email client
OpenAI API Fejl:
- Verificer endpoint URL (skal slutte med /)
- Check API key er korrekt
- Verificer deployment name matcher din faktiske deployment
- Check quota/rate limits i Azure Portal
Google Sheets Fejl:
- Verificer service account email har Editor adgang til sheetet
- Check credentials JSON er korrekt escaped
- Verificer spreadsheet ID er korrekt
- Check sheet navn matcher
Function Kører Ikke:
- Verificer Application Settings er sat korrekt i Azure
- Check function trigger i Azure Portal under Functions → EmailProcessor → Integration
- Se logs i Application Insights
┌─────────────────────────────────────────┐
│ Azure Function Timer │
│ (kører hver time) │
└────────────────┬────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ ImapEmailService │
│ (henter ulæste emails via IMAP) │
└────────────────┬────────────────────────┘
│
▼
┌───────────────┐
│ For hver │
│ email: │
└───────┬───────┘
│
▼
┌─────────────────────────────────────────┐
│ OpenAIService │
│ (udtræk pakkedata via Azure OpenAI) │
└────────────────┬────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ GoogleSheetsService │
│ (indsæt række i Google Sheet) │
└────────────────┬────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ ImapEmailService │
│ (slet email) │
└─────────────────────────────────────────┘
- Alle credentials gemmes som Application Settings (encrypted at rest)
- Brug aldrig hardcoded credentials i koden
- Google Service Account har minimal permissions (kun write til specifikt sheet)
- IMAP connection bruger SSL/TLS
- Private keys gemmes sikkert i Azure
For problemer eller spørgsmål, kontakt udviklingsteamet.