MailClient

Gesällprovet i kursen internetprogrammering I, ht-2001

Utfört av Henrik Johansson DS80, henrik-j@dsv.su.se

 

MailClient.. 1

Inledning.. 1

Att köra MailClient. 2

Så påverkas systemet. 2

Bilder.. 3

Huvudfönster.. 3

Skicka post. 4

Konfigurera konto.. 5

Så funkar det.. 5

Översikt. 5

Komponent för komponent. 7

MailServerInfoComponent 7

MailInfoComponent 7

Datastruktur 7

Spara e‑postmeddelanden. 7

välja ett meddelande. 8

MailContentComponent 8

MailSenderComponent 8

MailReceiveComponent 8

MailTask-klasserna. 8

MessageWrap-objekten.. 9

Nästa gång jag bygger en mailklient.. 9

 

Inledning

Som läsaren kanske gissat redan har jag valt att implementera en mailklient, den är tämligen komplett vad gäller kontohantering samt sändning och mottagning av e-postmeddelanden (förstås). E-postmeddelanden kan läsas,besvaras samt vidareskickas, med eller utan attachments. Lästa e-postmeddelanden sparas lokalt på hårddisken samt avlägsnas från mailservern. MailClient har stöd för multipla konton. Det finns inget stöd för adressboksfunktioner eller filtrering av e-postmeddelanden. Ytterligare en begränsning är att det bara finns en lokal folder för varje konto.

Att köra MailClient

För att köra MailClient måste filerna mail.jar samt activation.jar finnas i classpathen. Programmet startas med kommandor java –jar MailClient.jar. Första gången programmet startas kommer fönstret för att konfigurera ett konto att öppnas automatiskt, förutsatt att kontot konfigureras riktigt, kommer MailClient att koppla upp sig mot mailservern och hämta eventuell post så snart konfigurationsfönstret stängts.

Så påverkas systemet

I den katalog varifrån MailClient startas kommer ett antal filer och kataloger att skapas.

Bilder

Huvudfönster

Huvudfönstret i MailClient.

 

Skicka post

Detta fönster dyker upp om man ger kommando att sklicka ett e-postmeddelande i någon form (skaicka, svara …) Det är upp till användaren att fylla i ett valfritt antal avändare av To:, Cc: eller Bcc typ. Beroende på hur ett visst konto är konfigurerat samt vilken sändningstyp som valts kommer vissa värden att vara ifyllda från början.

Konfigurera konto

Fönster för att konfigurera ett konto. Kraven för en kontokonfiguration är att åtmindstonde kontonamn och mailserver har fyllts i samt att minst ett av alternativen ’vidarebefordra mail inline’ och ’vidarebefordra mail som bifogad fil’ har valts.

Så funkar det

Översikt

Programmet är uppbyggt kring en kontrollklass, MailClientGUI samt ett antal MailKomponent-klasser och MailTask-klasser. MailClientGUI skapas och initieras med komponenter från startklassen MailClient.

Mailkomponenterna sköter de uppgifter som hör hemma i en mailklient, såsom att hämta eller skicka e‑postmeddelanden, visa vilka e-postmeddelanden som hämtast och så vidare. MailTask-klasserna, som har en yttre form av knapp, låter användaren initiera olika arbetsuppgifter.

MailKomponenterna känner inte till varandras existens utan komunicerar via de Events, som komponenter som producerar resultat som kan intressera andra komponenter producerar. Kontrollklassen prenumererar på alla Events. En komponent som intresserar sig för något särskilt Event, prenumererar på dessa hos Kontrollklassen. Ett exempel: MailContentComponent visar upp ett e-postmeddelande för användaren, för att veta vilket e‑postmeddelande som skall visas upp prenumererar den på MessageChosenEvent hos MailClientGUI, som i sin tur prenumererar på dessa hos MailInfoComponent, som producerar dem när användaren klickar på något meddelande. Allt detta trassel gör komponenterna lättare att byta ut; de behöver ju bara känna till sig själva, Eventet samt kontrollklassen. Samt underlättar betydligt vid uppstart av programmet.

På samma sätt  komunicerar MailTask-klasserna med Mailkomponenterna indirekt, utan att känna till dessa, istället skickar de sina kommandon till Kontrollklassen som i sin tur skickar dem vidare till rätt Mailkomponent. En MailTaskKlass behöver alltså bara vetra vad den vill åstakomma och inte vem som kan göra det, det räcker att kontrollklassen har denna kunnskap och att MailTaskklassen vet att kontrollklassen vet..

Komponent för komponent

MailServerInfoComponent

MailServerInfoComponent tar hand kontohanteringen genom att dels erbjuda möjligheter att skapa, ta bort eler ändra konton och dels genom att låta användaren välja vilket konto som skall användas för tillfället. All information som hör till ett visst konto (server, e-postadress, användarnamn, lösenord mm) lagras i ett ServerInfo-objekt. När användaren väljer ett visst konto skapas ett ServerInfoChangeEvent som innehåller det valda kontots ServerInfo-objekt, detta skickas sedan till alla som prenumererar på dessa events (dvs Kontrollklassen enligt översikt ovan) och ger dem möjlighet att reagera på kontoförändringen.

MailInfoComponent

MailInfoComponent ansvarar dels för att spara e‑postmeddelanden lokalt I grupper, konto för konto, dels för att låta användaren välja ett specifikt meddelande, så att det kan visas upp eller användas som grund för andra komandon(tex svara på eller vidarebefordra)

Datastruktur

Ett e‑postmeddelande sparas med hjälp av  MailClientMessage‑klassen, denna klass har följande egenskaper.

En grupp med MailClientMessage-objekt som hör till ett visst konto hålls samman med ett MailClientMessageHolder-objekt, det är detta objekt som MailInfoComponent-komponenten kommer att ha kontakt med.

Spara e‑postmeddelanden

e‑postmeddelanden skall sparas i grupper utifrån vilket konto som använts för att hämta dessa.

MailInfoComponent prenumererar på ServerInfoChangeEvents för att få veta när användaren växlar mellan olika konton, när detta sker kommer det MailClientMessageHolder‑objekt som hör till det tidigare kontot att skrivas till hårddisken och det MailClientMessageHolder‑objekt som hör till det nya kontot att läsas från hårddisken.

välja ett meddelande

När användaren väljer ett e‑postmeddelande kommer motsvarande MailClientMessage‑objekt att skapa ett MessageChosenEvent, detta Event kommer via MailClientMessageHolder och MailInfoComponent distribueras ut till de lyssnarklasser som prenumererar på sådana events.

MailContentComponent

MailContentComponent ansvarar för att visa upp ett e‑postmeddelande, dess avsändare, mottagare, ämne samt eventuella infogade filer. Dessa infogade filer skall också kunna sparas undan.

För att veta vilket e‑postmeddelande som skall visas upp prenumererar MailContentComponent på MessageChosenEvent.

MailSenderComponent

MailSenderComponent ansvarar för att skicka e‑postmeddelanden av olika slag: skicka nya meddelanden, besvara meddelanden och vidaresända meddelanden, med eller utan infogade filer. När en användare begär att få sända ett e‑postmeddelande skickas ett MessageWrap‑objekt med, detta objekt bestämmer formateringen av och delvis innehållet i det nya meddelandet, mer om MessageWrapobjekten nedan. Då begäran har tagits emot öppnas ett mail‑sändningsfönster, vissa egenskaper kan vara ifyllda (t.ex. mottagare, avsändare, ämne och signatur) andra fyller användaren i, när användaren är klar trycker han/hon  på sändknappen och ett nytt ExtendedSendMail‑objekt skapas med de egenskaper som behövs för att sända brevet enligr användarens specifikationer.

MailReceiveComponent

MailReceiveComponent ansvarar för att ta emot e‑postmeddelanden från en viss server, denna server specificeras av det aktuella kontot.

För att hämta e‑postmeddelanden anropas MailReceiveComponents receiveMail‑metod, denna metod tar ett MailServerContent‑objekt som argument. MailServerContent‑objektet innehåller från början information om aktuellt konto, men kommer sedan att fyllas på med eventuella e‑postmeddelanden från den aktuella servern.

När eventuella e‑postmeddelanden tagits emot av MailReceiveComponent skapas ett MailReceivedEvent som distribueras ut till lyssnarklasser som prenumererar på dessa events.

MailTask-klasserna

MailTask-klasserna låter användaren initiera olika typer av operationer i MailClient t.ex. skicka brev, besvara brev eller avsluta MailClient.

MailTask‑klasser är subklasser till den abstrakta basklassen MailTask eller någon av dess subklasser. MailTask är i sin tur en subklass till JButton och kommer, när de initieras att placeras som en knapp i den JToolBar som MailClient använder. Då användaren klickar på ett MailTask‑objekt kommer MailTask att aktivera sin mailTascAction‑metod, denna metod modifieras av subklasserna till MailTask för att bestämma vad objektet har för uppgift. På samma sätt har MailTask också en initMailTask‑metod som anropas när MailTask‑objekt initieras, även den ändras av subklasserna för att t.ex. ändra texten på knappen.

Subklasserna prenumererar på de Events de behöver för att kunna utföra sina uppgifter hos kontrollklassen, t.ex. prenumererar ReplayMailTask på MessageChosenEvents för att veta vilket meddelande som skall besvaras.

MessageWrap-objekten

MessageWrap-objekt används för att formatera och eventuellt ge visst innehåll till ett e‑postmeddelande. MessageWrap-objekt skapas aldrig direkt i koden, istället anropas MessageWrapFactory med den statiska metoden getMessageWrap som tar ett Message‑objekt och ett MessageType‑objekt som argument. Vilket MessageType‑objekt som skickas med bestämms av syftet med MessageWrap‑objektet, t.ex. om MessageWrapen skall användas för att visa upp ett meddelande kommer ett objekt av typen MessageType.SHOW att skickas med. getMessageWrap kommer att returnera ett MessageWrap‑objekt med en implementation som är lämplig för den tänkta uppgiften.

Nästa gång jag bygger en mailklient

 

/Henrik