Skicka nyhetsbrev till användare i CS, men låt användare gå ur maillistan

Vill du skicka ex vis ett nyhetsbrev till alla användare av din Community Server sajt? Du kanske känner till CS’s massutskick-funktion där man kan skicka mail till alla användare av en viss roll?

När man skickar ut nyhetsbrev eller liknande kan det dock hända att användare kontaktar dig och inte vill ha fler nyhetsbrev, men vill fortfarande vara kvar som medlem på sajten. Den enda rollen som du vet innehåller alla användare är ju rollen ”Registered Users”. Att plocka bort användare från den rollen är nog ingen bra idé, så hur gör man?

Det går att fixa, och du behöver inte plocka upp CS i Visual Studio och skriva om någon kod. För det första kan du välja att alla nya användare läggs till fler roller än enbart ”Registered Users”. För att göra detta, öppna communityserver.config i din favoriteditor, och leta rätt på raden:

defaultRoles = "Everyone;Registered Users"

Denna rad bestämmer vilka roller som nya användare läggs in i då de registrerar sig. Så i detta fall skulle vi kunna fixa så att nya användare även läggs till i en roll som vi kallat ”Nyhetsbrev”. Så vi ändrar ovanstående rad till följande:

defaultRoles = "Everyone;Registered Users;Nyhetsbrev"

Klart! Nu kommer alla nya användare att läggas in I den rollen, och du kan använda den för att skicka ut nyhetsbrev. Om nån inte vill vara med längre, plockar man bara ut den användaren ur rollen ”Nyhetsbrev”.

Men en sak har vi glömt, du kanske har en mängd befintliga användare redan på din sajt, hur gör man med dem? Ett sätt att göra det på är med hjälp av ett T-SQL script som du kör mot din CS databas.

CREATE TABLE #NewRole ( [UserId] [uniqueidentifier] NOT NULL , [RoleId] [uniqueidentifier] )

INSERT INTO #NewRole (UserID)
SELECT UserID FROM aspnet_Users WHERE ApplicationID = 'ditt applicationID här' 
   
AND UserID <> 'ditt anonymous UserID här
    AND RoleID <> 'ditt Newsletter roleID här'

UPDATE #NewRole SET RoleID = 'ditt Nyhetsbrev roleID här'

DROP TABLE #NewRole

INSERT INTO aspnet_UsersInRoles (UserID, RoleID)

Den röda texten ovan ska ersättad med:

AplicationID - ApplicationID från din aspnet_Applications tabell (om du kör fler än en Application var noga med att välja den rätta)

Anonymous UserID - UserID från din aspnet_Users tabell. Det finns en anonym användare per applikation. Så samma sak här, var noga att välja den rätta.

Nyhetsbrev RoleID - RoleID från din aspnet_Roles tabell (Den nya rollen som du skapar för ditt nyhetsbrev). Återigen, det finns en samling roller specifika för varje applikation.

OBS! Innan du kör ovanstående skript på din live databas, kan det vara en god idé att köra den i en kopia av databasen i en testmiljö för att se att den funkar som den ska. Och självklart se till att du gör en backup av din live-databas innan du slutligen kör skriptet mot den. Alternativt testar du den mot live-databasen men tar bort INSERT –kommandot och lägger till en SELECT * FROM #NewRole för raden med DROP TABLE. Då listar skriptet upp vilka poster som skulle påverkas av skriptet, men inget ändras i databasen. Ett sånt testskript kan då se ut enligt detta:

CREATE TABLE #NewRole ( [UserId] [uniqueidentifier] NOT NULL , [RoleId] [uniqueidentifier] )

INSERT INTO #NewRole (UserID)
SELECT UserID FROM aspnet_Users WHERE ApplicationID = 'ditt applicationID här' 
    AND UserID <> 'ditt anonymous UserID här
    AND RoleID <> 'ditt Newsletter roleID här'

UPDATE #NewRole SET RoleID = 'ditt Nyhetsbrev roleID här'

SELECT * FROM #NewRole

DROP TABLE #NewRole

Om nån av er läsare är duktiga på T-SQL, så kanske ni har förslag på bättre skript än detta? Skriv gärna in en kommentar till detta inlägg och visa hur du skulle göra.  

Leave a Comment

(required) 
(required) 
(optional)
(required)