Politechnika Warszawska Rok akademicki Wydziaª Elektroniki i Technik Informacyjnych 2014/2015 Instytut Informatyki

Praca Dyplomowa In»ynierska

Wojciech Szymski

System zarz¡dzania przestrzeni¡ adresów e-mail

Opiekun pracy: prof. nzw. dr hab. in». Piotr Gawrysiak

Ocena pracy: ......

...... Data i podpis Przewodnicz¡cego Komisji Egzaminu Dyplomowego Kierunek: Informatyka Specjalno±¢: In»ynieria Systemów Informatycznych Data urodzenia: 13 wrze±nia 1991 Data rozpocz¦cia studiów: 1 pa¹dziernika 2010

›yciorys

Urodziªem si¦ 13 wrze±nia 1991 roku w Warszawie. W latach 2007-2010 ucz¦szczaªem do VIII Liceum Ogólnoksztaªc¡cego im. Wªadysªawa IV w Warszawie. W roku 2010 uko«czyªem szkoª¦ ±redni¡ oraz zdaªem matur¦. W pa¹dzierniku 2010 roku rozpocz¡ªem studia stacjonarne pierwszego stopnia na Wydziale Elektroniki i Technik Informacyjnych na kierunku Informatyka.

...... podpis studenta

Egzamin dyplomowy

Zªo»yª egzamin dyplomowy w dn......

Z wynikiem ......

Ogólny wynik studiów ......

Dodatkowe wnioski i uwagi Komisji ......

......

1 Streszczenie

Przedmiotem pracy byªo zaprojektowanie oraz zaimplementowanie systemu e-mailowego. Przedstawiono dost¦pne na rynku rozwi¡zania oraz wskazano ich zalety i wady. Pozwoliªo to na zdeniowanie wymaga« sta- wianych przed systemem. Opisano wykorzystane protokoªy oraz architektur¦ i szczegóªy implementacyjne systemu. Jako efekt pracy powstaª system umo»liwiaj¡cy proste zarz¡dzanie przestrzeni¡ adresów e-mail w obr¦bie wªasnej domeny.

Sªowa kluczowe: e-mail, zarz¡dzanie przestrzeni¡ adresow¡, ltrowanie wia- domo±ci, ochrona przed spamem

E-mail address space management system

The subject of the thesis was to design and create an e-mail system. Review of available solutions was introduced with their pros and cons pointed out. This allowed to dene the requirements for the system. Used protocols, architecture and implementation details have been described. As a result a system allowing simple management of e-mail address space within an owned domain was created.

Keywords: e-mail, address space management, message ltering, spam pro- tection

2 Pragn¦ serdecznie podzi¦kowa¢ Panu prof. nzw. dr hab. in». Piotrowi Gawrysiakowi za po±wi¦cony czas oraz uwagi, bez których napisanie niniejszej pracy nie byªoby mo»liwe.

Dzi¦kuj¦ rodzicom i siostrze za wsparcie okazane podczas pisania tej pracy. Dzi¦kuj¦ równie» Bartoszowi Szrederowi za okazan¡ cierpliwo±¢ oraz wszystko, czego mnie nauczyª. Spis tre±ci

Wykaz skrótów ...... 6

1. Wprowadzenie ...... 7

1.1. Krótka historia poczty elektronicznej ...... 7 1.2. E-mail we wspóªczesnym ±wiecie ...... 8 1.3. Cel pracy ...... 8 1.4. Struktura pracy ...... 9

2. Model dziaªania poczty elektronicznej ...... 10

2.1. Agenty ...... 10 2.2. SMTP ...... 11 2.3. IMAP ...... 12

3. Przykªady istniej¡cych rozwi¡za« ...... 15

3.1. Gmail ...... 15 3.2. Guerrilla Mail ...... 17 3.3. Postx i Courier IMAP ...... 18 3.4. Podsumowanie ...... 18

4. Koncepcja systemu ...... 20

4.1. MTA ...... 20 4.2. MSA ...... 21 4.3. MDA ...... 21 4.3.1. Potok przetwarzania ...... 21 4.3.2. Grupowanie i zapis ...... 22 4.4. MAA ...... 22 4.5. Przechowalnia ...... 22

5. Implementacja systemu ...... 24

5.1. Go ...... 24 5.2. Konguracja ...... 24

4 5.3. MTA ...... 25 5.3.1. Authenticator ...... 26 5.3.2. Handler ...... 26 5.4. MSA ...... 26 5.5. MDA ...... 27 5.5.1. Przetwarzanie ...... 27 5.5.2. Utrwalanie ...... 28 5.6. ...... 28

6. Do±wiadczenia praktyczne ...... 30

6.1. Analiza wydajno±ciowa ...... 33

7. Podsumowanie ...... 35

Bibliograa ...... 36

A. J¦zyk Go ...... 38

5 Wykaz skrótów

 DKIM  ang. DomainKeys Identied Mail, metoda ª¡czenia domeny z wiado- mo±ci¡ e-mail  DNS  ang. Domain Name Server, rozproszony system translacji hostów na adresy IP  IMAP  ang. Internet Message Access Protocol, protokóª synchronizacji skrzy- nek e-mailowych  IP  ang. Internet Protocol, protokóª komunikacyjny  MAA  ang. Mail Access Agent, p. 2.1  MDA  ang. Mail Delivery Agent, p. 2.1  MRA  ang. Mail Retrieval Agent, p. 2.1  MSA  ang. Mail Submission Agent, p. 2.1  MTA  ang. Mail Transport Agent, p. 2.1  MUA  ang. Mail User Agent, p. 2.1  POP3  ang. Post Oce Protocol v3, protokóª odbioru wiadomo±ci e-mail ze zdalnej skrzynki  SMTP  ang. Simple Mail Transfer Protocol, protokóª przekazywania wiadomo- ±ci e-mail pomi¦dzy MTA  SPF  ang. Sender Policy Framework, metoda uwierzytelniania serwerów nada- j¡cych wiadomo±ci e-mail  TLS  ang. Transport Layer Security, protokóª bezpiecznej transmisji danych  VPS  ang. Virtual Private Server, prywatny serwer wirtualny

6 1. Wprowadzenie

Popularyzacja internetu spowodowaªa, »e tradycyjna komunikacja pocztowa zo- staªa w du»ej cz¦±ci wyparta przez wiadomo±ci elektroniczne. Wynika to z bardzo prozaicznych cech komunikacji internetowej. Transmisja wiadomo±ci przez internet jest o wiele rz¦dów wielko±ci szybsza ni» tradycyjna. Koszt takiej transmisji jest z punktu widzenia u»ytkownika ko«cowego nieistniej¡cy lub pomijalny.

1.1. Krótka historia poczty elektronicznej

Jednym z najstarszych i najpopularniejszych formatów wiadomo±ci elektronicz- nych jest e-mail. Pierwsza koncepcja e-maili jest starsza ni» sieci komputerowe  powstaªa w latach 60. XX w. w ±rodowisku akademickim USA. Wiadomo±ci byªy przesyªane w obr¦bie pojedynczej stacji roboczej. Wymiana wiadomo±ci przebie- gaªa w bardzo prosty sposób  plik z wiadomo±ci¡ byª kopiowany do folderu od- biorcy. Pierwszymi programami do wysyªania lokalnych e-maili byªy MAILBOX oraz SENDMSG. Rozwi¡zanie to byªo wystarczaj¡ce do momentu powstania ARPA- NET, pierwszej sieci komputerowej. BBN Technologies, rma pracuj¡ca nad ARPA- NET, stworzyªa program CPYNET sªu»¡cy m. in. do zdalnego zapisu plików. Jeden z programistów BBN, Ray Tomlinson, zauwa»yª, »e funkcje programów CPYNET i SENDMSG mo»na poª¡czy¢. Po poª¡czeniu tych programów i stworzeniu systemu adresowania (który funkcjonuje do dzi± w tej samej postaci: u»ytkownik@host), sys- tem do wysyªania wiadomo±ci elektronicznych na odlegªo±¢ byª gotowy. Pierwszy e-mail zostaª wysªany pod koniec 1971 roku. Pomysª okazaª si¦ udany  po kilku latach e-maile generowaªy ponad poªow¦ ruchu w ARPANET. W kolejnych latach nast¡piªo wiele zmian w modelu dziaªania poczty elektronicznej. Do dostarczania wiadomo±ci stosowano protokoªy, których oryginalny zamysª u»ycia odbiegaª od wy- syªania e-maili, m. in. FTP i UUCP. W roku 1982 powstaª dedykowany transpor-

7 towi e-maili protokóª SMTP. Obecnie wi¦kszo±¢ globalnej infrastruktury e-mailowej funkcjonuje w oparciu o ten protokóª.

1.2. E-mail we wspóªczesnym ±wiecie

W dzisiejszych czasach posiadanie skrzynki e-mailowej to norma. Podanie ad- resu e-mail jest nieodª¡czn¡ cz¦±ci¡ rejestracji w wi¦kszo±ci serwisów internetowych. Kontakty z tradycyjnymi usªugodawcami (np. bankami) równie» cz¦sto odbywaj¡ si¦ t¡ drog¡. Jest to wygodne rozwi¡zanie, ale posiada swoje wady. Podawanie jednego adresu wszystkim nadawcom cz¦sto prowadzi do napªywu du»ej ilo±ci niezorgani- zowanej poczty. Nie mamy równie» kontroli nad grup¡ osób znaj¡cych dany adres. W przypadku, gdy adres tra w niepowoªane r¦ce mo»e sta¢ si¦ celem spamu. Wady te mo»na w du»ej mierze zneutralizowa¢ stosuj¡c wyranowane narz¦dzia organi- zacyjne i antyspamowe, ale »aden sko«czony zbiór reguª nie jest w stanie w peªni wyeliminowa¢ wszystkich problemów.

1.3. Cel pracy

Dost¦pne s¡ rozwi¡zania, które staraj¡ si¦ przeciwdziaªa¢ problemom wynikaj¡- cych z natury staªego adresu e-mailowego. Organizacja przychodz¡cej poczty jest sto- sunkowo prostym zadaniem  zwykle odbiorca jest w stanie sklasykowa¢ wiadomo±¢ za pomoc¡ adresu nadawcy lub tematu. Odltrowywanie niechcianych wiadomo±ci jest du»o trudniejszym zadaniem. Istniej¡ zaawansowane systemy do walki ze spa- mem oparte o bardzo wyranowane algorytmy. Nadawcy spamu nie pozostaj¡ jednak w tyle  stale przystosowuj¡ swoje wiadomo±ci tak, aby ltry miaªy gorsz¡ skutecz- no±¢. Celem pracy jest stworzenie systemu, który poza klasycznymi mechanizmami rozwi¡zywania wcze±niej wspomnianych problemów, u»ywa innego, rzadko stoso- wanego ze wzgl¦dów praktycznych, podej±cia. System opiera si¦ o nieograniczone mo»liwo±ci zarz¡dzania przestrzeni¡ adresów w obr¦bie pojedynczej domeny. Pod- stawowym zaªo»eniem dziaªania jest model, w którym pojedynczy nadawca dostaje unikalny adres, na który wysyªa e-maile. Problem ewentualnej zmiany adresu e-mail zostaje zredukowany do poinformowania o zmianie jednego nadawcy. Dzi¦ki temu jedna z nietypowych operacji, która w klasycznym modelu wydaje si¦ by¢ bardzo

8 radykalna  caªkowita rezygnacja z u»ywania danego adresu  staje si¦ normalnym przypadkiem u»ycia. Pozwala to m. in. na porzucanie adresów, które traªy w r¦ce niepowoªanych osób zajmuj¡cych si¦ reklam¡ specycznej grupy medykamentów. Kolejn¡ zalet¡ tego modelu jest ªatwo±¢ organizacji przychodz¡cych wiadomo±ci, które mog¡ by¢ klasykowane na podstawie adresu odbiorcy. Oczywi±cie system ten nie rozwi¡zuje wszystkich problemów zwi¡zanych z poczt¡ elektroniczn¡. Jest jednak dobr¡ podstaw¡, która mo»e by¢ rozszerzana o istniej¡ce ju» klasyczne rozwi¡zania.

1.4. Struktura pracy

Praca ma nast¦puj¡c¡ budow¦:  Rozdziaª 2. zawiera opis dziaªania wspóªczesnych systemów e-mailowych. Opi- sany zostaª model transmisji wiadomo±ci pomi¦dzy agentami oraz protokoªy SMTP i IMAP.  W rozdziale 3. zaprezentowane zostaªy istniej¡ce systemy e-mailowe. Omówione zostaªy ich mo»liwo±ci oraz zalety i wady.  W rozdziale 4. zaprezentowano koncepcj¦ architektury systemu.  Rozdziaª 5. zawiera opis implementacji systemu, wraz z uzasadnieniem wyboru u»ywanego j¦zyka i bibliotek.  Prezentacja dziaªania aplikacji znajduje si¦ w rozdziale 6.  Rozdziaª 7. zawiera podsumowanie oraz dalsze plany rozwoju systemu.  W dodatku A przedstawiona zostaªa charakterystyka j¦zyka Go. 2. Model dziaªania poczty elektronicznej

2.1. Agenty

Architektura obecnych systemów e-mailowych opiera si¦ o koncepcj¦ zró»nico- wanych agentów. Ró»ne agenty odpowiadaj¡ za poszczególne etapy dostarczania wiadomo±ci pomi¦dzy nadawc¡ i odbiorc¡. We wspóªczesnym modelu wyró»nia si¦ sze±¢ rodzajów agentów[5]:  MUA  oprogramowanie klienckie. Odpowiada za prezentacj¦ e-maili i komu- nikacj¦ z agentami zewn¦trznymi, tj. najcz¦±ciej MSA i MAA. Przykªadem takiego oprogramowania jest np. Thunderbird i MS Outlook.  MTA  odpowiada za transport e-maili w sieci. W przypadku, gdy adres do- celowy e-maila znajduje si¦ w znanym miejscu (najcz¦±ciej komputer lokalny lub w sieci lokalnej), przekazuje go do MDA, w innym przypadku przekazuje go do MTA pod adresem, znajduj¡cym si¦ w DNS-owym rekordzie MX hosta docelowego. Komunikuje si¦ z innymi MTA za pomoc¡ protokoªu SMTP.  MSA  punkt wej±ciowy e-maili do sieci. Odbiera wiadomo±¢ wychodz¡c¡ od MUA i przekazuje do znanego sobie MTA. Bardzo cz¦sto MSA s¡ jedynie warstw¡ abstrakcji naªo»on¡ na dziaªaj¡cy pod spodem MTA.  MDA  odpowiada za zapisanie e-maila w lokalnej przechowalni adekwatnej dla odbiorcy wiadomo±ci. Agent ten mo»e wykonywa¢ równie» wst¦pne przetwarza- nie, np. odsiewanie wiadomo±ci zawieraj¡cych spam lub zªo±liwe oprogramowa- nie.  MAA  odpowiada za udost¦pnienie e-maili zapisanych w przechowalni. Zwykle komunikuje si¦ z MUA poprzez protokoªy IMAP i POP3.  MRA  jest to agent pobieraj¡cy e-maile od MAA. Charakter dalszych dziaªa« zale»y od agenta. Mo»e to by¢ zarówno zapis lokalny, jak i ponowne wstrzykni¦cie wiadomo±ci do sieci.

10 2.2. SMTP

Protokóª SMTP sªu»y do przekazywania wiadomo±ci e-mail w sieci. Jest to protokóª tekstowy, oparty o ograniczony zbiór polece«. Podstawowa wersja protokoªu SMTP deniuje nast¦puj¡ce polecenia:  HELO hostname Rozpoczyna sesj¦ SMTP.  hostname  host, którym przedstawia si¦ klient  EHLO hostname Rozpoczyna sesj¦ SMTP. W odpowiedzi serwer wysyªa list¦ dost¦pnych polece«.  hostname  host, którym przedstawia si¦ klient  MAIL FROM: Resetuje sesj¦ i deniuje adres nadawcy.  addr  adres nadawcy  RCPT TO: Dodaje podany adres do listy odbiorców obecnie przekazywanej wiadomo±ci.  addr  adres odbiorcy  DATA Rozpoczyna transmisj¦ ciaªa wiadomo±ci (ang. payload). Kolejne linie traktowane s¡ jako payload a» do przesªania linii, w której jedynym znakiem jest pojedyncza kropka.  QUIT Ko«czy sesj¦ i zezwala serwerowi na zerwanie poª¡czenia po potwierdzeniu.  RSET Resetuje sesj¦.  NOOP Operacja pusta. Mo»e sªu»y¢ do podtrzymania poª¡czenia.

11 Istniej¡ równie» rozszerzenia protokoªu opisane w uzupeªniaj¡cych dokumentach RFC[2][3]. Przykªadowe polecenia, które s¡ cz¦sto stosowane to:  STARTTLS Rozpoczyna negocjacj¦ sesji TLS.  AUTH Rozpoczyna proces uwierzytelnienia. Popularne metody to m. in. PLAIN (prze- syªany jest ci¡g zero-login-zero-hasªo zakodowany za pomoc¡ Base64) i LOGIN (oddzielnie przesyªane s¡ login i hasªo zakodowane za pomoc¡ Base64).  type  metoda uwierzytelnienia.

2.3. IMAP

Protokóª IMAP sªu»y do pobierania wiadomo±ci ze zdalnego serwera oraz zarz¡dzania tymi wiadomo±ciami. Podobnie jak SMTP jest to protokóª tekstowy. Poni»ej przedstawiony zostaª wybrany zbiór polece«.

Polecenia dost¦pne w ka»dym stanie:  CAPABILITY Zwraca list¦ mechanizmów uwierzytelniaj¡cych i rozszerze« protokoªu dost¦p- nych na serwerze.  NOOP Operacja pusta.  LOGOUT Ko«czy sesj¦ i zamyka poª¡czenie.

Polecenia dost¦pne w stanie nieuwierzytelnionym (Not Authenticated):  LOGIN Jako parametry przyjmuje login i hasªo. W przypadku sukcesu przechodzi do stanu Authenticated.  STARTTLS Rozpoczyna negocjacj¦ sesji TLS.

12 Polecenia dost¦pne w stanie uwierzytelnionym (Authenticated) i w stanie wybranej skrzynki (Selected):  SELECT Wybiera podan¡ skrzynk¦ do dalszych dziaªa«. Przechodzi do stanu Selected.  EXAMINE Dziaªa jak SELECT, ale wybiera skrzynk¦ w trybie tylko do odczytu.  CREATE Tworzy skrzynk¦ o podanej nazwie.  DELETE Usuwa skrzynk¦ o podanej nazwie.  RENAME Zmienia nazw¦ podanej skrzynki.  SUBSCRIBE Ustawia podan¡ skrzynk¦ jako aktywn¡.  UNSUBSCRIBE Ustawia podan¡ skrzynk¦ jako nieaktywn¡.  LIST Jako parametr przyjmuje nazw¦ referencyjn¡. Zwraca list¦ pasuj¡cych skrzynek.  LSUB Dziaªa jak LIST, ale zwraca tylko aktywne skrzynki.  STATUS Zwraca status podanej skrzynki (m. in. liczb¦ wiadomo±ci).  APPEND Jako parametry przyjmuje nazw¦ skrzynki i wiadomo±¢. Dodaje wiadomo±¢ do skrzynki.

Polecenia dziaªaj¡ce wyª¡cznie w stanie Selected:  CHECK Zwraca informacj¦ o wewn¦trznym stanie wybranej skrzynki na serwerze. Serwer mo»e potraktowa¢ t¦ komend¦ jako NOOP.  CLOSE

13 Zamyka skrzynk¦, powraca do stanu Selected oraz kasuje wszystkie wiadomo±ci z ag¡ \Deleted.  EXPUNGE Usuwa wszystkie wiadomo±ci z ag¡ \Deleted z wybranej skrzynki i zwraca list¦ ich identykatorów.  SEARCH Zwraca list¦ wiadomo±ci pasuj¡cych do warunków zapytania.  FETCH Zwraca wybrane wiadomo±ci lub ich fragmenty.  STORE Modykuje agi wybranych wiadomo±ci.  COPY Kopiuje wybran¡ wiadomo±¢ do podanej skrzynki.  UID Jako argument przyjmuje komendy COPY, FETCH, STORE lub SEARCH, ale jako ich argumenty lub wyniki podawane s¡ unikalne identykatory wiado- mo±ci. 3. Przykªady istniej¡cych rozwi¡za«

3.1. Gmail

Gmail jest to bezpªatny serwis poczty elektronicznej stworzony przez rm¦ Go- ogle. W ramach osobistego konta udost¦pniana jest skrzynka e-mailowa, do której dost¦p mo»na uzyska¢ poprzez stron¦ WWW1 lub z poziomu innego klienta, komu- nikuj¡cego si¦ z Gmailem za pomoc¡ SMTP i IMAP. Interfejs serwisu jest wysoce intuicyjny. Jako widok gªówny u»ytkownikowi pre- zentowana jest skrzynka Odebrane. Odczytanie wiadomo±ci ogranicza si¦ do wy- boru jej tematu oraz wycinka tre±ci z listy.

Rysunek 3.1. Widok gªówny przegl¡darkowego interfejsu serwisu Gmail

Interfejs przegl¡darkowy Gmaila dokonuje równie» organizacji poczty w w¡tki. Odpowiedzi na wiadomo±¢ pierwotn¡ grupowane s¡ wraz z ni¡. W tym celu u»ywa nagªówków Message-ID oraz In-Reply-To.

1 https://www.gmail.com

15 Rysunek 3.2. Widok w¡tku wiadomo±ci serwisu Gmail

Zalet¡ serwisu jest równie» udost¦pnienie u»ytkownikowi nieograniczonego podzbioru przestrzeni adresów e-mail. Do u»ytkownika [email protected] kierowane s¡ równie» wszystkie wiadomo±ci adresowane na adresy postaci [email protected]. Umo»liwia to tworzenie ltrów, które wspomagaj¡ orga- nizacj¦ wiadomo±ci.

Rysunek 3.3. Tworzenie ltru dla suksu +shyym.com

16 Tak ograniczona przestrze« adresowa posiada jednak nieodª¡czn¡ wad¦. Uzyska- nie adresu pierwotnego na podstawie aliasu ogranicza si¦ do wyci¦cia w nim symboli od znaku + do znaku @ (wª¡czaj¡c +). System nie pozwala zatem na pewn¡ identykacj¦ nadawcy opieraj¡c si¦ wyª¡cznie o adres odbioru.

3.2. Guerrilla Mail

Serwis Guerrilla Mail2 oferuje jednorazowe, tymczasowe skrzynki odbiorcze. Wchodz¡c na stron¦ u»ytkownik dostaje od serwisu zestaw adresów e-mail, które traaj¡ do skrzynki dost¦pnej z poziomu strony.

Rysunek 3.4. Interfejs serwisu Guerrilla Mail

Gªównym przypadkiem u»ycia serwisu jest jednorazowe odebranie wiadomo±ci z danego serwisu. Przykªadem takich wiadomo±ci s¡ np. potwierdzenia rejestra- cji w serwisach, zawieraj¡ce link aktywacyjny. W momencie opuszczenia strony skrzynka przestaje funkcjonowa¢ i wszystkie wiadomo±ci przychodz¡ce s¡ ignoro- wane. Serwis oferuje równie» mo»liwo±¢ ponownego u»ycia skrzynki. Ka»dy zestaw ad- resów przypisany jest do konkretnego identykatora. W momencie ustawienia iden- tykatora na poprzednio u»ywany, zestaw adresów zostaje ponownie udost¦pniony u»ytkownikowi. Rozwi¡zanie to mo»e posªu»y¢ np. do resetowania hasªa w serwisie,

2 https://www.guerrillamail.com/

17 któremu u»ytkownik podaª tymczasowy e-mail. Jest ono jednak obarczone niebez- piecze«stwem przechwycenia skrzynki przez osob¦ trzeci¡.

3.3. Postx i Courier IMAP

Popularnym rozwi¡zaniem u»ywanym przez u»ytkowników posiadaj¡cych wªasne serwery jest u»ycie systemów Postx i Courier IMAP. System Postx3 jest zaawansowanym MTA  posiada wiele funkcji[9], takich jak:  kontrola spamu  realizowana poprzez wiele kongurowalnych moduªów, m. in. listy dost¦pu, ograniczanie cz¦stotliwo±ci napªywu (ang. rate limiting), ltry za- warto±ci, kontrola SPF i DKIM;  szeroki zakres obsªugiwanych rozszerze« SMTP, np. STARTTLS, 8BIT- MIME, rozszerzone kody stanu;  obsªuga wielu baz danych, np. MySQL, PostgreSQL, LDAP, Berkeley DB, SQLite, Memcache, LMDB. Posiada równie» wbudowany moduª MDA. Obsªuguje on przechowalnie w for- matach mbox oraz Maildir. Postx pozwala u»ytkownikowi na zdeniowanie skrzynek odbiorczych dost¦p- nych pod okre±lonymi adresami. Pozwala równie» tworzy¢ aliasy, które przekierowuj¡ wiadomo±ci na inne adresy. Nie udost¦pnia jednak mo»liwo±ci kierowania wiadomo±ci do specycznego miejsca w przechowalni. Do odczytu wiadomo±ci z przechowalni w formacie Maildir posªu»y¢ mo»e pro- gram Courier IMAP4. Udost¦pnia on zintegrowane serwery POP3 i IMAP oraz interfejs WWW do zarz¡dzania skrzynk¡.

3.4. Podsumowanie

Zaprezentowane w tym rozdziale systemy zostaªy wybrane, jako reprezentanci pewnych kategorii. Gmail oferuje skrzynki ogólnego u»ytku, Guerrilla Mail sªu»y jako skrzynka tymczasowa, a Postx i Courier IMAP s¡ wysoko kongurowalnymi

3 http://www.postfix.org 4 http://www.courier-mta.org/imap/

18 systemami dla posiadaczy wªasnych serwerów. Ka»de z tych rozwi¡za« posiada swoje zalety i wady. Analiza cech charakterystycznych danych systemów wykazaªa, »e sprawdzaj¡ si¦ one ±wietnie w swoich kategoriach. Przegl¡daj¡c wymienione systemy mo»na odnie±¢ wra»enie, »e obecnie istniej¡ce rozwi¡zania s¡ w peªni wystarczaj¡ce. Zwrócono jednak uwag¦ na ograniczenia tych systemów. ›aden z analizowanych systemów nie zapewnia jednocze±nie niezwi¡za- nych ze sob¡ adresów prowadz¡cych do jednej skrzynki, staªej przechowalni oraz prostoty konguracji. 4. Koncepcja systemu

Gªównym zaªo»eniem pracy jest dostarczenie w peªni funkcjonalnego systemu e-mailowego. Typowy u»ytkownik posiada na komputerze lokalnym wybrane przez siebie MUA i oczekuje, »e b¦dzie ono wspóªpracowa¢ z oprogramowaniem po stronie serwera w standardowy sposób. To samo dotyczy poczty przychodz¡cej  oprogra- mowanie staraj¡ce si¦ dostarczy¢ wiadomo±¢ do opisywanego systemu u»ywa ±ci±le okre±lonego sposobu. W celu zapewnienia kompatybilno±ci z powszechnie u»ywa- nymi programami, system udost¦pnia nast¦puj¡ce punkty ko«cowe (ang. endpoint):  MTA pod portem 25  MTA pod portem 587 (z wymuszonym TLS)  MAA pod portem 143

Rysunek 4.1. Ogólny schemat systemu

4.1. MTA

Moduª MTA dziaªa pod standardowymi portami 25 oraz 587. Usªuga na porcie 587 wymusza szyfrowanie transmisji, natomiast szyfrowanie na porcie 25 jest opcjo- nalne. MTA dziaªa w oparciu o protokóª SMTP. Udost¦pnia równie» rozszerzenia

20 tego protokoªu: AUTH oraz STARTTLS. Po otrzymaniu wiadomo±ci, MTA po- dejmuje dalsze dziaªania na podstawie hostów adresów docelowych. W przypadku, gdy hostem docelowym jest system lokalny, wiadomo±¢ przekazywana jest do moduªu MDA. Pozostaªe przypadki traktowane s¡ jako u»ycie lokalnego MTA jako MSA.

4.2. MSA

Moduª MSA jest w opisywanym systemie integraln¡ cz¦±ci¡ MTA, ale na- rzuca dodatkowe wymagania dotycz¡ce bezpiecze«stwa. Przede wszystkim wiado- mo±¢ nadana z danego systemu traktowana jest w pewnym sensie jako po±wiadczona przez ten system. Nie jest to w »adnym sensie podpis elektroniczny. Po±wiadczenie wynika z faktu, »e nadanie wiadomo±ci przez protokóª SMTP wymaga zestawienia poª¡czenia TCP. Adres IP serwera nadaj¡cego nie mo»e by¢ w tym przypadku sfaªszowany. Du»a cz¦±¢ systemów odbieraj¡cych sprawdza, czy host podany w polu nadawcy jest zgodny z adresem IP systemu nadaj¡cego. Z tego powodu nale»y za- bezpieczy¢ mo»liwo±¢ nadawania wiadomo±ci z opisywanego systemu. Jest to zre- alizowane za pomoc¡ uwierzytelnienia za pomoc¡ loginu i hasªa. Kredencjaªy s¡ danymi o szczególnie du»ej warto±ci i w zwi¡zku z tym u»ycie MSA wymaga równie» szyfrowania poª¡czenia.

4.3. MDA

Moduª MDA posiada dwa gªówne zadania. Zadaniem pierwszym jest przetwo- rzenie wiadomo±ci oraz, w przypadku gdy wiadomo±¢ jest niepo»¡dana, odrzucenie jej. Nast¦pnie, je»eli wiadomo±¢ pomy±lnie przeszªa wst¦pn¡ ocen¦, MDA zapisuje j¡ w odpowiednim miejscu przechowalni.

4.3.1. Potok przetwarzania

System nie posiada wbudowanych metod wst¦pnego przetwarzania wiadomo±ci przychodz¡cych. Udost¦pnia jednak kongurowalny potok zewn¦trznych polece«, które mog¡ w dowolny sposób wpªywa¢ na plik z odebran¡ wiadomo±ci¡. W szcze- gólno±ci zamiana pliku z wiadomo±ci¡ na plik pusty traktowana jest jako odrzucenie

21 wiadomo±ci. Poszczególne skªadowe potoku podawane s¡ jako ±cie»ki do plików wy- konywalnych operuj¡cych na pliku e-mail.

4.3.2. Grupowanie i zapis

Jedn¡ z podstawowych zakªadanych funkcjonalno±ci systemu jest grupowanie wiadomo±ci na podstawie zycznego nadawcy. Z punktu widzenia MUA, wiadomo- ±ci od unikalnych nadawców przechowywane s¡ w oddzielnych katalogach. Z zaªo»e« u»ytkowych wynika, »e adres odbiorcy jest ±ci±le zwi¡zany z zycznym nadawc¡. W zwi¡zku z tym moduª MDA mo»e grupowa¢ wiadomo±ci na podstawie adresu odbiorcy. Na podstawie konguracji u»ytkownika dla ka»dej wiadomo±ci wyznaczany jest katalog docelowy. Zapis wiadomo±ci w podanym katalogu realizowany jest za pomoc¡ moduªu przechowalni.

4.4. MAA

Zadaniem MAA jest po±redniczenie w komunikacji mi¦dzy MUA i przecho- walni¡. Komunikacja pomi¦dzy MUA i MAA odbywa si¦ za pomoc¡ protokoªu IMAP.

4.5. Przechowalnia

Moduª przechowuj¡cy wiadomo±ci powinien umo»liwia¢ hierarchiczn¡ repre- zentacj¦ wiadomo±ci, obsªug¦ oznacze« protokoªu IMAP oraz by¢ bezpieczny w ±rodowisku wielow¡tkowym. Istniej¡ gotowe koncepcje tego typu przechowalni, m. in. Maildir oraz Maildir++. Autor zdecydowaª si¦ na implementacj¦ skrzynki w formacie Maildir++, która speªnia wy»ej wymienione kryteria[12].

Przechowalnia udost¦pnia nast¦puj¡ce metody:  odczyt hierarchii katalogów  stworzenie katalogu w danym miejscu hierarchii  usuni¦cie katalogu  zmiana nazwy katalogu  odczyt wiadomo±ci

22  stworzenie wiadomo±ci w danym miejscu hierarchii  usuni¦cie wiadomo±ci  przesuni¦cie wiadomo±ci do innego katalogu  zmiana atrybutów IMAP wiadomo±ci 5. Implementacja systemu

Przedstawiona w rozdziale 3 analiza dost¦pnych na rynku systemów e-mailowych wykazaªa, »e opracowana funkcjonalno±¢ nie jest w prosty sposób osi¡galna przy ich u»yciu. Narodziªo to konieczno±¢ zaimplementowania autorskiego systemu, który speªnia oczekiwane zaªo»enia. Poni»sza praca zawiera projekt oraz implementacj¦ tego systemu. W rozdziale 4 przedstawiona zostaªa ogólna architektura systemu. Jest to opis funkcjonalno±ci oraz zale»no±ci poszczególnych komponentów tego systemu. W roz- dziale 5 znajduje si¦ opis implementacji poszczególnych komponentów oraz ich po- ª¡cze« w spójny system.

5.1. Go

Opisywany system zostaª zaimplementowany przy u»yciu j¦zyka Go1. Jest to otwarty j¦zyk wysokiego poziomu stworzony przez rm¦ Google. Gªównymi zaletami Go s¡ prostota u»ycia, czysto±¢ kodu, wysoka wydajno±¢ stworzonych aplikacji oraz szybko±¢ kompilacji kodu. J¦zyk posiada rozwini¦t¡ bibliotek¦ standardow¡ oraz roz- budowane konstrukcje synchronizacyjne. Jednym z najpopularniejszych zastosowa« Go jest pisanie serwerów sieciowych. Szerszy opis j¦zyka wraz z przykªadami u»ycia znajduje si¦ w dodatku A.

5.2. Konguracja

Konguracja moduªów domy±lnie przechowywana jest w bazie danych SQLite. Wybór SQLite podyktowany byª ograniczaniem zewn¦trznych zale»no±ci systemu. Opisywany system zawiera wbudowany sterownik go-sqlite32. System mo»e by¢

1 http://www.golang.org 2 https://github.com/mattn/go-sqlite3

24 w sposób przezroczysty dla moduªów zale»nych rozszerzony o mo»liwo±¢ korzystania z innych baz danych. Warstwa dost¦pu do bazy danych zrealizowana zostaªa za pomoc¡ biblioteki sqlx3. Baza jest wersjonowana  program sprawdza na pocz¡tek zgodno±¢ schematu bazy z oczekiwaniami. System nie gwarantuje obsªugi ka»dej wersji schematu bazy. Przy zapewnieniu wyª¡czno±ci dost¦pu programu do bazy, moduª konguracji zapewnia równie» mo»liwo±¢ obserwowania zmian konguracji przez moduªy zale»ne. Dzi¦ki temu moduªy z mo»liwo±ci¡ przeªadowania w locie mog¡ by¢ informowane o takiej potrzebie. Pozwala to na przetrzymywanie konguracji w pami¦ci programu.

5.3. MTA

Zadaniem moduªu MTA jest odebranie przychodz¡cego poª¡czenia SMTP. Re- alizacja obsªugi protokoªu SMTP jest realizowana za pomoc¡ biblioteki smtpd4. Biblioteka udost¦pnia mo»liwo±¢ dowi¡zania wªasnych procedur obsªugi (ang. han- dler) poszczególnych etapów poª¡czenia SMTP. Biblioteka udost¦pnia nast¦puj¡ce handlery:  Handler(peer, envelope) wywoªywany po odebraniu wiadomo±ci  peer  parametry poª¡czenia  envelope  nagªówki i tre±¢ wiadomo±ci  ConnectionChecker(peer) wywoªywany przy nowym poª¡czeniu przychodz¡cym  peer  parametry poª¡czenia  HeloChecker(peer, name) wywoªywany po komendzie HELO lub EHLO  peer  parametry poª¡czenia  name  nazwa hosta, którym przedstawiªa si¦ druga strona  SenderChecker(peer, addr) wywoªywany po komendzie MAIL FROM

3 https://github.com/jmoiron/sqlx 4 https://bitbucket.org/chrj/smtpd

25  peer  parametry poª¡czenia  addr  podany przez drug¡ stron¦ adres nadawcy  RecipientChecker(peer, addr) wywoªywany po komendzie RCPT TO  peer  parametry poª¡czenia  addr  podany przez drug¡ stron¦ adres odbiorcy  Authenticator(peer, username, password) wywoªywany po komendzie AUTH  peer  parametry poª¡czenia  username  podana przez drug¡ stron¦ nazwa u»ytkownika  password  podane przez drug¡ stron¦ hasªo Opisywany system implementuje handlery Handler i Authenticator opisane w ko- lejnych sekcjach.

5.3.1. Authenticator

Handler Authenticator werykuje zgodno±¢ kredencjaªów podanych przez drug¡ stron¦ poª¡czenia z kredencjaªami zapisanymi w konguracji. W przypadku sukcesu, argument peer kolejnych handlerów jest uzupeªniony o te kredencjaªy.

5.3.2. Handler

Handler jest dyspozytorem (ang. dispatcher) wiadomo±ci dziaªaj¡cym na pod- stawie adresów odbiorców. Lista odbiorców dzielona jest na odbiorców lokalnych i zewn¦trznych. Wiadomo±¢ wraz list¡ odbiorców lokalnych przekazywana jest dalej do moduªu MDA. Je»eli poª¡czenie jest uwierzytelnione kredencjaªami u»ytkownika systemu oraz lista zawiera odbiorców zewn¦trznych, wiadomo±¢ jest przekazywana do moduªu MSA.

5.4. MSA

Zadaniem moduªu MSA jest dostarczenie wiadomo±ci wychodz¡cej do zdenio- wanej listy odbiorców. Udost¦pnia nast¦puj¡c¡ metod¦:  Send(from, to, msg) przyjmuje wiadomo±¢ do wysªania

26  from  adres nadawcy  to  lista adresów odbiorców  msg  payload W celu nadania moduª dzieli list¦ odbiorców na podstawie hostów, a nast¦pnie dla ka»dego hosta wyznacza adres serwera docelowego. Adres docelowego MTA dla danego hosta jest wyznaczany na podstawie wpisów DNS MX dla tego hosta. Je±li takie wpisy nie istniej¡, zakªada si¦, »e wiadomo±¢ nale»y dostarczy¢ bezpo±red- nio do hosta docelowego. Po wyznaczeniu serwerów docelowych, MSA ª¡czy si¦ z wyznaczonymi MTA i dostarcza im wiadomo±¢, podaj¡c w komendach RCPT TO wszystkie adresy e-mail, które odpowiadaªy danemu MTA. Nagªówki To i CC wiadomo±ci, znajduj¡cy si¦ w payloadzie, pozostaj¡ niezmodykowane (tj. nie s¡ z nich usuwane informacje o odbiorcach na innych serwerach).

5.5. MDA

Moduª MDA zajmuje si¦ przetwarzaniem odebranych wiadomo±ci oraz ich utrwaleniem. Udost¦pnia nast¦puj¡c¡ metod¦, która wykonuje te czynno±ci:  Store(from, to, msg, peer) przyjmuje wiadomo±¢ do obróbki i zapisu  from  adres nadawcy  to  lista adresów odbiorców  msg  payload  peer  informacje o serwerze nadawcy

5.5.1. Przetwarzanie

Przetwarzanie wiadomo±ci obejmuje werykacj¦ poprawno±ci payloadu, uzupeª- nienie odpowiednich nagªówków oraz obróbk¦ przez zdeniowany przez u»ytkow- nika potok. Obróbk¦ potokow¡ realizuje moduª podrz¦dny. Tworzy on tymczasowy plik zawieraj¡cy payload, nast¦pnie wywoªuje na nim kolejne polecenia zdeniowane w konguracji. Polecenia w potoku dostaj¡ jeden argument  ±cie»k¦ do pliku z pay- loadem. Oczekiwanym rezultatem jest modykacja tego pliku w miejscu. W zwi¡zku z tym niektóre z programów wymagaj¡ opakowania ich w skrypt powªoki, który za-

27 pewni kompatybilno±¢ z opisywanym moduªem. Poni»ej przedstawiony zostaª przy- kªadowy skrypt opakowuj¡cy.

Wydruk 5.1. Skrypt opakowuj¡cy do programu SpamAssassin #!/bin/bash spamassassin −Le "$1" i f [ $? −gt 0 ] ; then echo "" > "$1" f i

Je±li jeden z programów potoku wyczy±ci plik, wiadomo±¢ zostanie potraktowana jako odrzucona. W innym przypadku moduª zwróci odpowiednio zmodykowany payload.

5.5.2. Utrwalanie

Podstawowym zadaniem moduªu MDA jest utrwalanie wiadomo±ci. Implemen- tacja moduªu pozwala na dwa rodzaje utrwalenia: zapis w skrzynce o formacie Ma- ildir++ oraz przekierowanie na inny adres. Po przetworzeniu wiadomo±ci moduª przetwarza list¦ odbiorców. Sprawdzana jest zgodno±¢ tych adresów z hostem lokalnym. Nast¦pnym krokiem dla ka»dego adresu jest jego odwzorowanie na miejsce zapisu w skrzynce lub adres przekierowania. Po stworzeniu list docelowych nast¦puje zapis lokalny oraz przekierowanie wiadomo- ±ci. Przekierowanie realizowane jest przez moduª MSA. Zapis lokalny odbywa si¦ poprzez wykonanie metody Save moduªu Maildir.

5.6. Maildir

Moduª Maildir jest implementacj¡ standardu przechowalni wiadomo±ci Mail- dir++. Z powodu mo»liwo±ci równoczesnego dost¦pu do zmiennych danych, zawiera on dwustopniow¡ synchronizacj¦. Pierwszym etapem synchronizacji jest synchro- nizacja na poziomie programu. Jest ona zaimplementowana poprzez paradygmat j¦zyka Go: wspóªdzielenie przez komunikacj¦. Paradygmat ten polega na blokowa- niu praw dost¦pu do obiektu poprzez w¡tkowo-bezpieczne kanaªy. Szczegóªowy opis tego mechanizmu zawarty jest w dodatku A. Drugim etapem synchronizacji jest synchronizacja na poziomie systemu plików. Pliki, których tre±¢ mo»e si¦ zmienia¢,

28 tj. wiadomo±ci w trakcie zapisu, tworzone s¡ w katalogu tmp. Zgodnie ze specy- kacj¡ wyª¡czny dost¦p do tych plików ma ich proces tworz¡cy. Po ostatecznym zapisie plik z wiadomo±ci¡ przenoszony jest do katalogu cur, gdzie dost¦p do niego mog¡ uzyska¢ równie» zewn¦trzne procesy (np. lokalne MUA). Dziaªania na plikach w katalogu cur musz¡ by¢ atomowe. Nazwy plików tworzonych przez moduª maj¡ nast¦puj¡ce wªa±ciwo±ci:  s¡ unikalne (tworzone s¡ na podstawie wielu pseudolosowych zmiennych)  zawieraj¡ metadane IMAP  zawieraj¡ informacje o miejscu w hierarchii katalogów IMAP Moduª udost¦pnia metody, które dziaªaniem przypominaj¡ operacje na systemie plików. Szczegóªy dotycz¡ce nazewnictwa nie s¡ udost¦pniane na zewn¡trz. 6. Do±wiadczenia praktyczne

Do±wiadczenia przeprowadzone zostaªy za pomoc¡ programu Swaks1. Program ten pozwala na proste wysyªanie wiadomo±ci testowych z kongurowalnymi para- metrami. Serwer do±wiadczalny pracowaª z nast¦puj¡c¡ konguracj¡:  Host wªasny: shyym.com  Port SMTP #1: 25  Port SMTP #2: 587 (wymuszony STARTTLS)  Konguracja MDA:

 forward@ → [email protected] (przekiero- wanie)

 store@ → store (zapis lokalny)  Wiadomo±ci przychodz¡ce ltrowane programem SpamAssassin Test pierwszy polegaª na sprawdzeniu dziaªania wymuszonego szyfrowania na porcie 587. swaks −−to [email protected] −−server shyym.com:587

=== Trying shyym.com:587... === Connected to shyym.com. <− 220 shyym.com ESMTP ready. −> EHLO reisub <− 250−shyym . com ... <− 250 STARTTLS −> MAIL FROM: <∗∗ 502 Please turn on TLS by i s s u i n g a STARTTLS command . −> QUIT <− 221 OK, bye === Connection closed with remote host.

1 http://www.jetmore.org/john/code/swaks/

30 Serwer przedstawiª klientowi mo»liwo±¢ szyfrowania sesji. Klient ignoruj¡c ten fakt rozpocz¡ª standardow¡ transmisj¦ (polecenie MAIL FROM). Serwer zgodnie z oczekiwaniami zwróciª bª¡d. Kolejny test miaª na celu sprawdzenie, czy wª¡czenie szyfrowania po stronie klienta rozwi¡»e powstaªy problem. swaks −−to [email protected] −−server shyym.com:587 −−t l s

=== Trying shyym.com:587... === Connected to shyym.com. <− 220 shyym.com ESMTP ready. −> EHLO reisub <− 250−shyym . com ... <− 250 STARTTLS −> STARTTLS <− 220 Go ahead === TLS started with cipher TLSv1.2:ECDHE−RSA−AES256−SHA:256 ... ~> MAIL FROM: <~ 250 Go ahead ~> RCPT TO: <~ 250 Go ahead ~> DATA <~ 354 Go ahead . End your data with . ... ~> . <~ 250 Thank you. ~> QUIT <~ 221 OK, bye === Connection closed with remote host.

Po udanej negocjacji TLS transmisja wiadomo±ci z punktu widzenia klienta prze- biegªa bez zakªóce«. Moduª MTA serwera dokonaª nast¦pnie podziaªu odbiorców na lokalnych i zewn¦trznych. 2015/02/26 15:03:32 addresses split into local: ["[email protected]"]; external: []

Lista odbiorców zewn¦trznych byªa pusta. Moduª MTA zezwoliª z tego powodu klientowi na dostarczenie wiadomo±ci bez autoryzacji. Wiadomo±¢ wraz z list¡ od- biorców lokalnych zostaªa nast¦pnie przekazana do moduªu MDA w celu jej utrwa- lenia. 2015/02/26 15:03:34 ignoring storage of e−mail to [email protected] (unknown user)

31 Moduª MDA zignorowaª wiadomo±¢, poniewa» nie zawieraªa znanych odbiorców. Nast¦pnie testom poddane zostaªo dziaªanie ªa«cucha przetwarzania. W tym celu u»yty zostaª program SpamAssassin oraz testowa wiadomo±¢ GTUBE2 (ang. Ge- neric Test for Unsolicited Bulk ). −> DATA <− 354 Go ahead . End your data with . ... −> XJS∗C4JDBQADN1.NSBN3∗2IDNEN∗GTUBE−STANDARD−ANTI−UBE−TEST−EMA IL∗C.34X ... −> . <− 250 Thank you. Zgodnie z oczekiwaniami, wysªanie e-maila testowego zako«czyªo si¦ odrzuceniem wiadomo±ci. 2015/03/08 18:13:19 e−mail from szymski@reisub to ["[email protected]"] discarded

Kolejny test polegaª na sprawdzeniu dziaªania moduªu MDA w trybie zapisu oraz przekierowania. Po przyj¦ciu e-maila do obu odbiorców, MDA dokonaª dyspo- zycji wiadomo±ci do odpowiednich podmoduªów. 2015/03/09 00:49:59 addresses split into local: ["[email protected]" "[email protected]"]; external: [] 2015/03/09 00:50:01 message from szymski@reisub stored 2015/03/09 00:50:02 smtp.SendMail(gmail−smtp−in.l.google.com, forwarder@shyym .com, [ [email protected]]) : OK 2015/03/09 00:50:02 message from szymski@reisub forwarded to ["[email protected]"]

Moduª Maildir zapisaª wiadomo±¢ w wyznaczonym miejscu: cat maildir/shyym/. store/cur/1425858601017775706.14481.0.5577006 791947779410\:2\, Date: Mon, 09 Mar 2015 00:49:59 +0100 To: [email protected],[email protected] From: szymski@reisub Subject: test Mon, 09 Mar 2015 00:49:59 +0100 X−Mailer: swaks v20130209.0 jetmore.org/john/code/swaks/

This is a test mailing

2 https://spamassassin.apache.org/gtube/gtube.txt

32 Moduª MSA przekierowaª wiadomo±¢ na skrzynk¦ zewn¦trzn¡:

6.1. Analiza wydajno±ciowa

Poszczególne krytyczne komponenty systemu zostaªy równie» poddane analizie wydajno±ciowej (ang. benchmark). J¦zyk Go udost¦pnia wbudowany system do te- stów i benchmarków. Dany fragment kodu mo»e by¢ wywoªany reprezentatywn¡ liczb¦ razy, po czym zwracany jest jego ±redni czas wykonania. Benchmarki przeprowadzane byªy na procesorze Intel Core i5-3317U taktowanym cz¦stotliwo±ci¡ 1.70GHz. Benchmark gªównego handlera moduªu MTA testowaª przekierowanie wiadomo- ±ci kierowanej do odbiorcy lokalnego do moduªu MDA. Za moduª MDA sªu»yªa atrapa. Benchmark przyniósª nast¦puj¡ce rezultaty: go t e s t −bench . PASS BenchmarkReceive 300000 4687ns/op 376B/op 10 allocs/op ok github.com/shyym/pdimail/mta 2.438s

Moduª jest w stanie zwerykowa¢ przeznaczenie wiadomo±ci w ci¡gu 5ms. Benchmark metody Store moduªu MDA testowaª zachowywanie wiadomo±ci do odbiorcy przekierowywanego, lokalnego oraz ignorowanego. U»yte zostaªy atrapy moduªów MSA i Maildir. Benchmark przyniósª nast¦puj¡ce rezultaty: go t e s t −bench . PASS BenchmarkStoreIgnore 1000000 1715 ns/op 129B/op 4 allocs/op BenchmarkStoreForward 100000 20084 ns/op 5243B/op 24 allocs/op BenchmarkStoreMaildir 1000000 1704 ns/op 112B/op 4 allocs/op ok github.com/shyym/pdimail/mda 5.680s

 Sumaryczny czas przetwarzania wiadomo±ci dla odbiorcy ignorowanego wynosi poni»ej 10ms. Jest to wynik pozwalaj¡cy na dziaªanie serwera pocztowego nawet w warunkach zwi¦kszonej aktywno±ci nadawców spamu.

33  Dªugo±¢ odbierania wiadomo±ci w celu przekierowania wynika z modykacji na- gªówków wiadomo±ci. Jest to jednak czas o rz¡d wielko±ci mniejszy od czasu sesji SMTP z docelowym MTA.  Czas przetwarzania wiadomo±ci do zapisu jest na porównywalnym poziomie z wiadomo±ci¡ ignorowan¡. W rzeczywisto±ci jest on powi¦kszony o czas zapisu na dysk. Czas zapisu jest zmienn¡ niezale»n¡ od implementacji systemu, nie jest on zatem uwzgl¦dniony w analizie. 7. Podsumowanie

W ramach tej pracy wykonany zostaª projekt oraz implementacja systemu e-mail. System zostaª cz¦±ciowo oparty o istniej¡ce biblioteki, co pozwoliªo ograniczy¢ na- kªad pracy oraz zminimalizowa¢ ryzyko wyst¡pienia bª¦dów implementacyjnych po stronie autora. Przed stworzeniem projektu systemu wykonana zostaªa analiza istnie- j¡cych rozwi¡za«. Analiza wykazaªa brak istnienia systemu, który w opinii autora speªnia w caªo±ci postawione wymagania. System zostaª zaprojektowany z my±l¡ o poª¡czeniu kluczowych zalet analizowanych rozwi¡za«. Analiza znanych autorowi j¦zyków programowania wykazaªa stosowno±¢ u»ycia j¦zyka Go. Na podstawie projektu powstaªa implementacja systemu w tym j¦zyku. U»ycie Go pozwoliªo osi¡gn¡¢ po»¡dan¡ w systemie wysok¡ wydajno±¢ i przeno±no±¢. W celu obsªu»enia protokoªu SMTP wykorzystana zostaªa biblioteka smtpd. Im- plementacja obsªugi protokoªu IMAP nie zostaªa uj¦ta w tej pracy ze wzgl¦du na szerok¡ specykacj¦ protokoªu oraz brak istniej¡cych bibliotek dla wybranego j¦zyka. System testowany byª w ±rodowisku produkcyjnym. Hostem dla systemu byª posiadany przez autora VPS. Autor skongurowaª równie» rekordy DNS posiada- nej przez siebie domeny w celu zapewnienia zgodno±ci systemu z obowi¡zuj¡cymi standardami. Aplikacja kliencka uruchamiana byªa na komputerze osobistym autora. Testowanie miaªo na celu wykazanie poprawno±ci oraz niezawodno±ci dziaªania sys- temu. Istnieje du»o mo»liwo±ci rozwoju systemu. Przede wszystkim nale»y zaimplemen- towa¢ obsªug¦ protokoªu IMAP. System pozwala równie» na zast¡pienie poszczegól- nych moduªów autorskimi implementacjami odpowiadaj¡cymi cudzym potrzebom. Mo»na równie» rozszerzy¢ istniej¡ce komponenty systemu w celu wsparcia metod werykacji nadawcy takich jak DKIM lub SPF. Pozwoliªoby to na jeszcze lepsz¡ werykacj¦ u»yteczno±ci wiadomo±ci.

35 Bibliograa

[1] Network Working Group, J. Klensin, 2008, RFC 5321: Simple Mail Transfer Protocol, https://tools.ietf.org/html/rfc5321, dost¦p 23.12.2014

[2] Network Working Group, J. Myers, Netscape Communications, 1999, RFC 2554: SMTP Service Extension for Authentication, https://tools.ietf.org/html/rfc2554, dost¦p 23.12.2014

[3] Network Working Group, P. Homan, 2002, RFC 3207: SMTP Service Extension for Secure SMTP over Transport Layer Security, https://tools.ietf.org/html/rfc3207, dost¦p 23.12.2014

[4] Network Working Group, R. Gellens, Qualcomm, J. Klensin, MCI, 1998, RFC 2476: Message Submission, https://tools.ietf.org/html/rfc2476, dost¦p 21.01.2015

[5] Karst Koymans, University of Amsterdam, 2013, Electronic mail Aka e-mail (or email according to Knuth), https://www.os3.nl/_media/2013-2014/courses/cia/email.pdf, dost¦p 20.01.2015

[6] The Go Authors, 2012, Eective Go, https://golang.org/doc/effective_go.html, dost¦p 26.01.2015

[7] Network Working Group, S. Josefsson, SJD, 2006, RFC 4648: The Base16, Base32, and Base64 Data Encodings, http://tools.ietf.org/html/rfc4648, dost¦p 25.02.2015

[8] Network Working Group, M. Crispin, University of Washington, 2003, RFC 3501: INTERNET MESSAGE ACCESS PROTOCOL  VERSION 4rev1, http://tools.ietf.org/html/rfc3501, dost¦p 28.02.2015

[9] Postx feature overview, http://www.postfix.org/features.html, dost¦p 07.03.2015

36 [10] mbox  le containing mail messages, http://www.qmail.org/man/man5/mbox.html, dost¦p 07.03.2015

[11] Maildir, http://wiki.dovecot.org/MailboxFormat/Maildir, dost¦p 07.03.2015

[12] Maildir++, http://www.courier-mta.org/imap/README.maildirquota.html, dost¦p 07.03.2015

[13] M. Brain, HowStuWorks.com, 2003, How Spam Works, http://computer.howstuffworks.com/internet/basics/spam.htm, dost¦p 09.03.2015 A. J¦zyk Go

Go jest j¦zykiem strukturalnym o skªadni zbli»onej do j¦zyka C. Zostaª stwo- rzony z my±l¡ o wydajnych aplikacjach wielow¡tkowych, w zwi¡zku z czym kon- strukcje programowania równolegªego s¡ bardzo czytelne. Tworzenie lekkich w¡tków (ang. goroutines) ograniczone jest do u»ycia sªowa kluczowego go. Komunikacja mi¦- dzy w¡tkami odbywa si¦ zwykle za pomoc¡ kanaªów (ang. channels). Zachowanie kanaªów jest zbli»one do Unixowych potoków (ang. pipes). Kanaªy s¡ to zmienne, przez które mo»na przekazywa¢ inne zmienne. Przekazywanie zmiennych przez kanaª jest caªkowicie bezpieczne w¡tkowo. Operacja odczytu zmiennej z kanaªu jest bloku- j¡ca, tj. wykonanie w¡tku jest zawieszone do momentu pobrania danych z kanaªu. Operacja zapisu jest równie» domy±lnie blokuj¡ca, ale istnieje mo»liwo±¢ stworze- nia kanaªów buforowanych, do których zapis nie jest blokuj¡cy je±li bufor nie jest zapeªniony.

Wydruk A.1. Przykªad u»ycia kanaªów do komunikacji mi¦dzy w¡tkami func main ( ) { msg := make(chan string ) go func ( ) { msg <− "Hello " }() fmt. Print(<−msg) go func ( ) { msg <− "world!" }() fmt. Println(<−msg) }

38 Cech¡ wyró»niaj¡c¡ Go spo±ród innych j¦zyków jest nietypowe podej±cie do syn- chronizacji. Zamiast klasycznego blokowania dost¦pu do pami¦ci wspóªdzielonej za pomoc¡ wyª¡cznych blokad (ang. mutex), twórcy j¦zyka sugeruj¡ u»ycie w¡tków dedykowanych obiektom i komunikacj¦ z tymi w¡tkami za pomoc¡ kanaªów. Wydruk A.2. Dost¦p wspóªdzielony przez komunikacj¦ func main ( ) { n := NewNumber(0) go func (){ for { n . Add(1) } }() for { fmt.Println(n.Get()) } } type Number struct { data int r e q u e s t s chan interface {} } type addReq int type getReq chan int func NewNumber( x int ) ∗Number { n := &Number{x, make(chan interface {})} go func (n ∗Number) { for req := range n.requests { switch req := req . ( type ){ case addReq : n . data += int ( req ) case getReq : req <− n . data } } }(n) return n } func (n ∗Number) Add(x int ){ n.requests <− addReq ( x ) } func (n ∗Number) Get() int { respCh := make( getReq ) n.requests <− respCh return <−respCh }

39 Go jest j¦zykiem wysoce dostosowanym do tworzenia wysoko wydajnych serwe- rów. Tworzenie lekkiego w¡tku dla ka»dego poª¡czenia nie stanowi problemu, po- niewa» wbudowane w program ±rodowisko uruchomieniowe nie przeª¡cza kontekstu bez potrzeby. Opisane wcze±niej kanaªy pozwalaj¡ równie» na tworzenie prostych konstrukcji ograniczaj¡cych liczb¦ poª¡cze«.

Wydruk A.3. Ograniczanie liczby jednoczesnych poª¡cze« var l i m i t e r = make(chan struct {}, maxConnections) func ( s ∗ session) run() { go func (){ select { case l i m i t e r <− struct {}{}: s . s e r v e ( ) <−l i m i t e r default : s. reject("Too many connections .") } }() }

40