Validering av mobilnummer och mailadresser

Senast uppdaterad 5 sep 2025

En ny fullmakt måste alltid innehålla minst en kontaktuppgifter till fullmaktsgivaren, en mailadress och/eller ett mobilnummer. Skälet är för att Fullmaktskollen ska kunna avisera fullmaktsgivaren om att det finns en fullmakt att skriva under i tjänsten eller att en redan underskriven fullmakt har sparats i tjänsten. Fullmaktshavaren anger vilka kontaktuppgifter som ska gälla när fullmakten skapas. Det är viktigt att fullmaktshavaren säkerställer att det verkligen är fullmaktsgivarens mailadress eller mobilnummer som anges på fullmakten, annars riskerar fel person att få meddelanden från Fullmaktskollen.

Fullmaktsgivaren kan när som helst ändra sina kontaktuppgifter i tjänsten men måste alltid ha minst en kontaktuppgifter – en mailadress eller ett mobilnummer.

Validering av mailadresser

Mailadresser som anges på en fullmakt ska vara utformade enligt namn@namn.se, eller fornamn.efternamn@namn.se

En mailadress får inte innehålla å, ä eller ö och kan heller inte innehålla två punkter efter varandra, eller avslutas med en punkt. Exempel på mailadresser som inte är godkända:

  • förnamn@namn.se
  • namn.@namn.se
  • fornamn..efternamn@namn.se

Validering av mobilnummer

Numret ska vara ett svenskt mobilnummer och ska börja på 070, 072, 073, 076 eller 079.

Mobiltelefonnummer som börjar på 077 (tjänster med delad kostnad), 0900, 0939,  0944 (betal-teletjänster) eller 099 (massanropstjänster) godkänns alltså inte.

Numret ska anges med inledande 46 eller +46, och utan inledande 0 från mobilnumret

Exempel: 46701740605

Vid anrop med Create-metoden så svarar tjänsten med ett felmeddelande om mailadressen eller mobilnumret är felaktigt ifyllt. Felmeddelandet innehåller from version 2024.2 det felaktigt angivna värdet så att det kan rättas.

Här hittar du färdig kod för validering av mailadresser och mobilnummer som du kan använda i din egen applikation.


TypeScript (Node/Browser)

// email.ts
export function normalizeEmail(input: string): string {
  const s = input.trim();
  const [local, domain = ""] = s.split("@");
  if (!local || !domain) return s;
  return `${local}@${domain.toLowerCase()}`;
}

const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i;
export function isValidEmail(email: string): boolean {
  if (email.length > 320) return false;
  const [local, domain = ""] = email.split("@");
  if (!local || !domain || local.length > 64 || domain.length > 255) return false;
  return EMAIL_RE.test(email);
}

// phone.ts
export function normalizePhone(input: string, defaultCC = "+46"): string {
  let s = input.replace(/[\s()\-\u00A0]/g, "").trim();
  if (s.startsWith("00")) s = "+" + s.slice(2);
  if (!s.startsWith("+")) {
    // Assume Swedish national format
    if (s.startsWith("0")) s = s.slice(1);
    s = defaultCC + s;
  }
  return s;
}

export function isValidE164(msisdn: string): boolean {
  return /^\+[0-9]{7,15}$/.test(msisdn);
}

export function isValidSwedishMobile(msisdn: string): boolean {
  if (!isValidE164(msisdn)) return false;
  return /^\+467(0|2|3|6|9)/.test(msisdn);
}


C# (.NET)

public static class FmkEmail
{
    public static string Normalize(string input)
    {
        var s = input?.Trim() ?? "";
        var at = s.IndexOf('@');
        if (at < 1 || at == s.Length - 1) return s;
        var local = s.Substring(0, at);
        var domain = s.Substring(at + 1).ToLowerInvariant();
        return $"{local}@{domain}";
    }

    public static bool IsValid(string email)
    {
        if (string.IsNullOrWhiteSpace(email) || email.Length > 320) return false;
        var parts = email.Split('@');
        if (parts.Length != 2) return false;
        if (parts[0].Length > 64 || parts[1].Length > 255) return false;
        return System.Text.RegularExpressions.Regex.IsMatch(
            email, @"^[^\s@]+@[^\s@]+\.[^\s@]{2,}$",
            System.Text.RegularExpressions.RegexOptions.IgnoreCase
        );
    }
}

public static class FmkPhone
{
    public static string Normalize(string input, string defaultCc = "+46")
    {
        var s = System.Text.RegularExpressions.Regex.Replace(input ?? "", @"[\s()\-\u00A0]", "");
        if (s.StartsWith("00")) s = "+" + s.Substring(2);
        if (!s.StartsWith("+"))
        {
            if (s.StartsWith("0")) s = s.Substring(1);
            s = defaultCc + s;
        }
        return s;
    }

    public static bool IsValidE164(string msisdn) =>
        System.Text.RegularExpressions.Regex.IsMatch(msisdn ?? "", @"^\+[0-9]{7,15}$");

    public static bool IsValidSwedishMobile(string msisdn) =>
        IsValidE164(msisdn) && System.Text.RegularExpressions.Regex.IsMatch(msisdn, @"^\+467(0|2|3|6|9)");
}


Python

import re

EMAIL_RE = re.compile(r'^[^\s@]+@[^\s@]+\.[^\s@]{2,}$', re.I)

def normalize_email(s: str) -> str:
    s = (s or '').strip()
    if '@' not in s:
        return s
    local, domain = s.split('@', 1)
    return f"{local}@{domain.lower()}"

def is_valid_email(email: str) -> bool:
    if not email or len(email) > 320:
        return False
    local, _, domain = email.partition('@')
    if not local or not domain or len(local) > 64 or len(domain) > 255:
        return False
    return bool(EMAIL_RE.match(email))

def normalize_phone(s: str, default_cc: str = '+46') -> str:
    s = re.sub(r'[\s()\-\u00A0]', '', (s or '').strip())
    if s.startswith('00'):
        s = '+' + s[2:]
    if not s.startswith('+'):
        if s.startswith('0'):
            s = s[1:]
        s = default_cc + s
    return s

def is_valid_e164(msisdn: str) -> bool:
    return bool(re.match(r'^\+[0-9]{7,15}$', msisdn or ''))

def is_valid_swe_mobile(msisdn: str) -> bool:
    return is_valid_e164(msisdn) and re.match(r'^\+467(0|2|3|6|9)', msisdn) is not None