MVC Netjes mailen
Ik ben toch eens begonnen met het maken van een correcte inbouw om mails te sturen in een klein MVC framework, wat ik eigenlijk al langer aan het maken ben.
Ik dacht aan de volgende opbouw:
class Mail implementeert MailInterface
class MailSender
de Mail classe bevat een mail die je kunt opstellen.
Je maakt een object van de Mail klasse, en je doet bijvoorbeeld $Mail->setMessage("bericht..."); om het bericht in de mail te zetten. Zo kun je ook bijvoorbeeld $Mail->setReceipient("[email protected]"); doen om de ontvanger in te stellen. Ook de headers stel je hier in.
Daarna geef je het Mail object van je mailtje aan de MailSender en kun je die de mail laten versturen.
De MailInterface zorgt ervoor dat elke klasse (in dit geval Mail) de methodes heeft die MailSender nodig heeft. Maar deze interface gebruik ik vooral omdat ik dit wel vaker zie.
Bijna elk object dat je meegeeft aan een ander object heeft een interface.
Het voordeel van de MailSender is dat je je daar helemaal kunt richten op het juist verzenden van de mail.
Is deze constructie goed? Of zouden jullie het helemaal omgooien en iets anders doen?
Ik was eerst nog aan het twijfelen om de headers en de ontvanger in te stellen in MailSender ipv in Mail.
Misschien wil ik later ook een manier om vooraf opgestelde berichten te verzenden, bijvoorbeeld een registratie mail etc.
Gewijzigd op 19/11/2013 22:09:09 door Jan terhuijzen
Jan terhuijzen op 19/11/2013 22:08:13:
De MailInterface zorgt ervoor dat elke klasse (in dit geval Mail) de methodes heeft die MailSender nodig heeft. Maar deze interface gebruik ik vooral omdat ik dit wel vaker zie.
Dat is in twee opzichten onlogisch: het maakt eigenlijk van elke Mail een MailSender en niet Mail maar MailSender implementeert dan de MailInterface. Logischer is het om dit los te koppelen:
• class Mail implements MailInterface
• class MailSender implements MailSenderInterface
Zó kun je bijvoorbeeld afdwingen wat je beschrijft:
• elke Mail moet de methode setRecipient() uit de MailInterface implementeren;
• elke MailSender moet de methode send() uit de MailSenderInterface implementeren.
Verder kun je het nog abstracter maken: bijvoorbeeld e-mailadressen (To, CC en BCC) zijn aparte klassen en attachments zijn aparte klassen. Met een aparte klasse voor e-mailadressen kun je dan bijvoorbeeld e-mailadressen valideren zonder dat de klassen Mail en MailSender eraan te pas komen. Ga je vervolgens nog een stap verder, dan maak je daarvoor nog een aparte Validator.
Aan het zenden van mails zitten de nodige haken en ogen (oa. qua headers of qua encoding van attachments, authenticatie bij smtp-server, certifcaten etc). De genoemde oplossingen worden al jaren door vele mensen gebouwd en gedebugged. Daar kun je nooit aan tippen als je alles zelf wilt bouwen.