Nativní Nette\Mailovací class? Asi ne…Interface? ANO!

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Brejla
Člen | 746
+
0
-

Řešilo se to už asi 1000X a uuuuuž je to tu zas :-) Dnes to ale vezmeme trošku z jiného soudku.

O implementování nějaké Nette\Mail classy, která by sama zajišťovala mailování atd., se tu vedlo hafo diskuzí. Všechny skončily, dle mého oprávněně, na tom, že nemá cenu znovu vynalézat kolo…že je k dispozici hromada kvalitních tříd a proto není potřeba vytvářet nové.

Nicméně, nebylo by krásné, mít i mailovací classy pěkně zakomponované v Nette a to bez nutnosti vytváření „nových kol“? S použitím již stávajících? Určitě bylo ;-) Já se o tom rozepisuji poměrně široce, ale řešení je přeci jasné ;-)

Jde mi tedy o to:

Pojďme nějak společně vymyslet interface, třeba Nette\IMail (nebo něco podobného), kde by byly jasně definované nejpoužívanější a nejužitečnější metody pro práci s mailery. Toto rozhraní by pak bez problémů mohly implementovat nově vznikající adaptéry již zaběhlých mailerů (PHPMailerAdapter, …).

Osobně bych byl následně pro vytvoření, již tolik diskutované, classy Nette\Mail, která by implementovala rozhrani Nette\IMail a jako parametr konstruktoru by jí byl předán vždy konkrétní adaptér. V Nette\Mail classe by pouze docházelo k typové kontrole předávaného adaptéru a k delegování volání metod na předaný adaptér.

V aplikaci by se poté pouze vytvořil objekt třídy Nette\Mail s konkrétním parametrem a uživatel by se nemusel dál zaobírat řešením typové kontroly adaptérů apod.

Osobně mi toto přijde jako nejlepší cesta, jak v Nette podporovat mailování. Nejde, v podstatě, o žádné změny kdekoliv jinde, pouze o přidání jednoho rozhraní a jedné třídy, jež ho implementuje. Zda to uživatelé budou či nebudou využívat, je jejich věc. Já to rozhodně používat budu, už jen pro jednoduchost záměny maileru, znovupoužitelnost, atd.

Docela by mě zajímalo, co na to David? Snad by na to mohl přistoupit.

A co na to vy ostatní?

Honza Marek
Člen | 1664
+
0
-

Možná by nějaký velice primitivní mailer mohl být i v nette, když stejně nette umí posílat maily s chybama.

Ondřej Brejla
Člen | 746
+
0
-

Honza M. napsal(a):

Možná by nějaký velice primitivní mailer mohl být i v nette, když stejně nette umí posílat maily s chybama.

Ja bych to do tohoto topicu moc nezahrnoval, nebo se to zase zvrhne k tomu, k cemu nechci…za chvili kazdy zacne pozadovat kvalitni Nette meilaer a puvodni myslenka pujde do kytek ;) Jinak k tomu navrhu, s tim bys souhlasil? Pripadne nejake napady…krome vlastni Nette mailer klasy :)

Honza Marek
Člen | 1664
+
0
-

No, já mám jenom takový postřeh, že ten interface bude muset být velice jednoduchý. Ty mailery jsou většinou dost různé a třeba většina nemá funkce typu addFrom nebo přílohy podporují jinak. V interfacu by stačily třeba jen setHtml, setText, setSubject, setFrom, setBcc, třeba i gettery apod.

Jod
Člen | 701
+
0
-

Mne bohato stačí TemplateMailer wrapper na Zend_Mail.
Ale integrovaná podpora by určite nebola na škodu, viď velmi užitočný počit Nette/Image, ktorý ma celkom nadchol, aj keď vyšiel trochu neskoršie než som potreboval =)

Ondřej Brejla
Člen | 746
+
0
-

Jasně, rozhraní by mělo zapouzdřovat hlavně základní funkčnost.

Kažodpádně, pokud nějaký mailer nepodporuje třeba přidávání From, případně více příjemců, tak to v interfacu bý může…o implementaci problému se pak bude starat konkrétní adaptér. Tam jak si to kdo pořeší je věc jiná.

A pokud nějaká metoda nemůže být u nějakého maileru adaptována, tak se prostě a jednoduše vyhodí při implementaci oné postížené metody v adaptéru výjimka. To mi přijde jako čisté řešení.

To rozhraní nám pouze říká, co musí adaptér implementovat…pokud to mailer prostě neumí, tak se nedá nic dělat a výjimka je myslím na místě.

Ondřej Brejla
Člen | 746
+
0
-

Jod napsal(a):

Mne bohato stačí TemplateMailer wrapper na Zend_Mail.
Ale integrovaná podpora by určite nebola na škodu, viď velmi užitočný počit Nette/Image, ktorý ma celkom nadchol, aj keď vyšiel trochu neskoršie než som potreboval =)

Jasně, to je podobný případ. Používání těchto, mezi sebou nekonzistentních, mail wrapperů mi nepřijde právě úplně nejšťastnější :-) Proč to tedy neobalit Nette interfacem, že ano? :-)

arron
Člen | 464
+
0
-

Tak ja bych si dovolil naprosto se vsim souhlasit:-) Krom toho to mam ve svem pracovnim planu, ale az na pozdeji, ale proc se tim nezabyvat uz ted, ze jo:-)

A i kdyby se to nekomu nelibilo, tak stejne nevidim duvod, proc ten interface nenavrhnout. V zasade jedine, co je potreba vedet je, co vsechno ma takovy mailer umet a jake k tomu potrebuje parametry. Zaznely tu ruzne metody setVsechnomozny…jo, urcite ano, a jeste k tomu nejaky obecny setter, kteremu by se predalo pole ve tvaru

	$parametry = array(
			'from' => 'foo@foo.fo',
			'subject' => 'fooSubject', //atd...
			);

A k vyse uvedenym metodam jeste minimalne neco jako addFile.

Ondřej Brejla
Člen | 746
+
0
-

Tohle je užitečná featura, ale myslím si, že to už je něco „navíc“. Obecný setter hlavičky se dá implementovat po podědění případné Nette\Mail…tomu nic nebrání. Ale nejsem si jist, jestli to patří přímo do obecného rozhraní, které je předmětem tohoto topicu.

Patrik Votoček
Člen | 2221
+
0
-

Tak abych přihodil taky něco. S interfacem souhlasím. Dokonce by se podle mě dalo udělat i to že by se pak dal nějáký mailer či wrapper registrovat jako se to dělá třeba u Autorizačních a Autentizačních tříd. A pak jednoduše získávat instance pomocí Enviroment::getMailer(). A teď k tomu co by měl interface mít. Tady si myslím stačí opravdu jenom ty základní funkce. Tj.:

$mailer = new Mailer();
//Nutnost
$mailer->send();
//Základní funkce
$mailer->setFrom($mail);
$mailer->setTo($to); //To by možná mohlo být jako pole pro odesílání více lidem
$mailer->setSubject($subject);
$mailer->setBody($body);
//Pro HTML maily
$mailer->isHTML(); //možná vhodnější název takhle to vypadá jako ověřování a né nastavování
$mailer->setTemplate(); //Tady by stálo za zvážení jestli předávat objekdy template nebo jenom cestu k template-u
$mailer->setTextBody(); //Textová varianta HTML mailu
//Přemýšlím že metoda isText by možná nemusela být vůbec případně spojit isHTML s isText a udělat něco jako setMode(Mailer::HTML) / setMode(Mailer::TEXT)
//Co stojí za zvážení
$mailer->setSMTP();
$mailer->setBcc();

O moc víc bych toho tam nedával. Chce to držet se toho že by tam měly být pouze metody které by měl implementovat jaký koliv mailer který existuje. Možná ani nedělat podporu pro HTML maily. Co by podle mě v interface určitě být nemělo je posílání souborů to totiž určitě nějáký mailer neumí. A jak pojmenovat onen interface? Asi bych volil místo IMail / IMailer spíše IMailAdapter, IMailerAdapter či IMailWrapper, IMailerWrapper.

K obalování adaptéru (chcete-li classy Nette\Mail) tak jak byla popsána výše tak tady jsem na rozpacích. Spíše ne než ano. Důvod příde mě to zbytečné.

Edit: gettery bych do interface necpal vůbec.

Editoval vrtak-cz (25. 5. 2009 11:59)

arron
Člen | 464
+
0
-

Pozor na to, ze email muze mit zaroven jak html, tak i textovou verzi. A myslim, ze sprava priloh by mela taky byt soucasti interface. Jak psal Warden,tak pokud nejaka konkretni implementace nebude neco podporovat, tak dana metoda proste vyhodi vyjimku…ale dle meho nazoru by obecny interface mel dovolovat implementovat pokud mozno vsechno.

Jod
Člen | 701
+
0
-

Pokiaľ by to nepodoroval tak by si to ošetril ten mailer. Viď:

<?php
function addAttachment($file)
{
	throw new InvalidStateException('Not implemented !');
}
?>

A je veget :)

Editoval Jod (25. 5. 2009 11:30)

Honza Marek
Člen | 1664
+
0
-

Takže abysme nekecali jen tak obecně, tak můžem začít vymejšlet.

class MyMailer extends Object implements IMailer // tady nevidím moc prostor pro diskuzi, maximálně o názvech
{
	// základy
	settery a gettery pro subject, from, to, cc, bcc
	// tady je otázka, jak udělat ty settery
	// možnosti $mailer->setTo("Jméno <mail@mail.cz>") nebo $mailer->setTo("mail@mail.cz"[, "Jméno"])

	// práce se šablonou
	setTemplate(ITemplate $template);
	// konkrétní implementace klidně můžou mít nějakou línou továrničku createTemplate - viz Control
	getTemplate();
	// kvůli šablonám myslím není potřebné mít v maileru vůbec funkce setBody nebo setHtmlBody a tak

	// html e-mail?
	setHtml(boolean) a isHtml()

	// odeslání
	send();

	// přílohy
	addAttachment();
	// asi takto jako v phpMaileru? addAttachment($path, $name = "", $encoding = "base64", $type = "application/octet-stream")

	// nastavení kódování nebo hlaviček nějak, asi:
	setEncoding($encoding);
	setHeader($header, $content);
}

Takových věcí… hrůza :-D Kdo se s tim pak má implementovat :-D

Honza Marek
Člen | 1664
+
0
-

Než já to sepíšu, tak už tady diskutujete o konkurenčním návrhu… Ne, že bych to nečekal :)

Jod napsal(a):
throw new InvalidStateException(‚Not implemented !‘);

Anebo NotImplementedException :-D

Jod
Člen | 701
+
0
-

Ano, ano, presne tu. Trošku som rozrušený tak mi to nemyslí :D

Ondřej Brejla
Člen | 746
+
0
-

No vidíte, jak se nám to rozjelo ;-)

Obecné vs. detailnější funkce…jde o to rozlišit co je obecné a co je už nadstandard, ale stejně si myslím, že nejlepší je definovat o trochu více funkcí (rozuměj ty, které většina mailerů podporuje, ikdyž ne všichni) a pokud jednu z nich nebude podporovat jeden mailer, tak si prostě vyhodí exception…jak už jsem psal já, nebo arron, nebo Jod…

S těmi settery, rozhodně bych volil setTo(mail[, name]);…jak se pak implementuje ono dosazení jména k mailu přeci nikoho z venku nezajímá.

Nad tou classou Nette\Mail bych stejně ještě trošku popřemýšlel ;-) Přijde mi elegantnější používat třeba

$mailer = new Nette\Mail(new PHPMailerAdapter());

než vytváření

$mailer = new PHPMailerAdapter();

Takhle si musím ješte kontrolovat někde explicitně jestli onen adaptér opravdu implementuje ono IMailAdapter…pokud použiju Nette\Mail, tak kontrola je jasná, protože je definována přímo v této třídě.

Je to otázka k zamyšlení, jestli onen poskytnutý komfort je dost velký na to, aby se třída zahrnula do distribuce ;-)

Patrik Votoček
Člen | 2221
+
0
-

Nebylo by lepší místo InvalidStateException použít NotImplementedException?

Proč bych nevolil interface který by obsahoval vše? Protože pak příde někdo kdo chce udělat na wrapper na doopravdy sipleMailer… A wrapper by pak vypadal strašně, klidně i víc jak polovina metod by byla zbytečně ve tvaru:

<?php
function foo()
{
	throw new NotImplementedException("Foo není implementováno v tomto wrapperu");
}
?>

Je je snažší mít jednodušší interface. A u wrapperů které toho umí více mít přidané metody mimo interface než mí hodně rozsáhlí interface a třeba 80% kódu stejného.

Nebo je možnost 2há mít interface-i 2 „siple“ a „full“. Ale to mě příde už hodně překombinované.

Patrik Votoček
Člen | 2221
+
0
-

arron napsal(a):

Pozor na to, ze email muze mit zaroven jak html, tak i textovou verzi.

Ano na to jsem malinko zapoměl. Doplním v předchozím příspěvku.

arron
Člen | 464
+
0
-

Warden napsal(a):

S těmi settery, rozhodně bych volil setTo(mail[, name]);…jak se pak implementuje ono dosazení jména k mailu přeci nikoho z venku nezajímá.

Ja bych mozna radeji volil

	$mailer->setTo(array($name => $mail, $anotherName => $anotherMail));
	//hlavne se pak da pouzit i zjednodusene $mailer->setTo(array($mail, $anotherMail));
	//a asi by bylo hezke umoznit i zjednodusene $mailer->setTo($mail);
	//cili argument 'typu' mixed

Editoval arron (25. 5. 2009 12:00)

arron
Člen | 464
+
0
-

vrtak-cz napsal(a):

Je je snažší mít jednodušší interface. A u wrapperů které toho umí více mít přidané metody mimo interface než mí hodně rozsáhlí interface a třeba 80% kódu stejného.

Nebo je možnost 2há mít interface-i 2 „siple“ a „full“. Ale to mě příde už hodně překombinované.

Jenze tim se zbavis te nejvetsi vyhody, ze u tech pokrocilejsich maileru to vsechno bude fungovat stejne, protze ty pridane metody si kazdy implementuje rozdilne…kdyz budou definovane v interfacu tak to proste bude standardizovane a kdyz se uprostred projektu rozhodnes zmenit mailer, tak s tim nebudes mi zadny problem. To uz bych klidne sel cestou „simple“ a „advanced“.

PetrP
Člen | 587
+
0
-

Warden napsal(a):

Nad tou classou Nette\Mail bych stejně ještě trošku popřemýšlel ;-) Přijde mi elegantnější používat třeba

$mailer = new Nette\Mail(new PHPMailerAdapter());

než vytváření

$mailer = new PHPMailerAdapter();

Tak máš ServiceLocator:

Environment::getServiceLocator()->addService('PHPMailerAdapter','Nette\IMailer');
// a pak
Environment::getService('Nette\IMailer');
// případně i zkratku
Environment::getMailer();
Honza Marek
Člen | 1664
+
0
-

$mailer->setTo(array($name ⇒ $mail, $anotherName ⇒ $anotherMail));

Tohle mi přijde zase zbytečně moc nezvyklé a neintuitivní.

Ondřej Brejla
Člen | 746
+
0
-

PetrP napsal(a):

Tak na to jsem jaksi pozapomněl, to by mohlo řešit.

S těmi metodami v rozhraní, jak jsem říkal, nejlepší bude vytáhnout ty, které se vyskytují třeba v 80% mailerů…ten zbytek nebude tak velký a jednoduchá zaměnitelnost komplexnějších mailerů je v podstatě nenarušena.

Editoval Warden (25. 5. 2009 12:13)

Ondřej Brejla
Člen | 746
+
0
-

Honza M. napsal(a):

$mailer->setTo(array($name ⇒ $mail, $anotherName ⇒ $anotherMail));

Tohle mi přijde zase zbytečně moc nezvyklé a neintuitivní.

Možná lepší by byla metoda $mailer->addTo(mail [, name]); je to imho přehlednější a v cyklu si to nasypu kolika lidma budu potřebovat.

Patrik Votoček
Člen | 2221
+
0
-

arron napsal(a):

Ja bych mozna radeji volil

	$mailer->setTo(array($name => $mail, $anotherName => $anotherMail));

To už mě příde hodně neintuitivní. To už raději další metodu

$mailer->setToMany(array($name => $mail, $anotherName => $anotherMail));
//nebo jinak pojmenovaná

$mailer->addTo(mail [, name]); +1. (tohle se mě líbí nejvíce)

Patrik Votoček
Člen | 2221
+
0
-

Warden napsal(a):

$mailer = new Nette\Mail(new PHPMailerAdapter());

Na to je právě ServiceLocator

Environment::getServiceLocator()->addService('PHPMailerAdapter','Nette\IMailer');

Edit: sakra tady to žije až moc… nestíhám odepisovat… :-(

Editoval vrtak-cz (25. 5. 2009 12:22)

Patrik Votoček
Člen | 2221
+
0
-

arron napsal(a):

vrtak-cz napsal(a):

Je je snažší mít jednodušší interface. A u wrapperů které toho umí více mít přidané metody mimo interface než mí hodně rozsáhlí interface a třeba 80% kódu stejného.

Nebo je možnost 2há mít interface-i 2 „siple“ a „full“. Ale to mě příde už hodně překombinované.

Jenze tim se zbavis te nejvetsi vyhody, ze u tech pokrocilejsich maileru to vsechno bude fungovat stejne, protze ty pridane metody si kazdy implementuje rozdilne…kdyz budou definovane v interfacu tak to proste bude standardizovane a kdyz se uprostred projektu rozhodnes zmenit mailer, tak s tim nebudes mi zadny problem. To uz bych klidne sel cestou „simple“ a „advanced“.

Napadlo mě ještě jedno řešení. A to mít doopravdy rozsáhlý interface. Ale k němu ještě abstraktní classu která by měla standartně u „advanced“ metod dopředu nastaveno NotImplementedException.

Ondřej Brejla
Člen | 746
+
0
-

Něco jako Java adaptéry Listenerů jo. No to taky není vůbec špatné, akorát že se ta classa se pak musí dědit, samotné rozhraní je v tomhle flexibilnější.

Patrik Votoček
Člen | 2221
+
0
-

Tady o tom že by sis musel tu classu podědit nebyla řeč.

A to mít doopravdy rozsáhlý interface. Ale k němu ještě abstraktní classu která by měla standartně u „advanced“ metod dopředu nastaveno NotImplementedException.

To jesli podědíš classu nebo jenom použiješ interface je na tobě.

Ondřej Brejla
Člen | 746
+
0
-

Jasně že to je na mně, jde mi spíš o to, jestli to má nějaký větší smysl, dělat něco rozsáhlého, kde polovina metod bude u většiny mailerů NotImplemented, takže bude lepší podědit abstract a tím se připravím o možnost dědění z něčeho jiného. Nebo nepodědím, ale ručně budu implementovat polovinu metod jako NotImplemented…proto jsem mluvil o dědění.

Spíš si myslím, že je lepší cesta s výtahem nějaké trochu obecnější množiny metod ze známých mailerů (ne každá maličkost, co by se našla), aby onen podíl NotImplemented byl co nejmenší (ikdyž nějaké určitě budou) a mohli jsme pohodlně používat interface bez zbytečného zaplácávání metod vyhazováním vyjímek.

arron
Člen | 464
+
0
-

Warden napsal(a):

Jasně že to je na mně, jde mi spíš o to, jestli to má nějaký větší smysl, dělat něco rozsáhlého, kde polovina metod bude u většiny mailerů NotImplemented, takže bude lepší podědit abstract a tím se připravím o možnost dědění z něčeho jiného. Nebo nepodědím, ale ručně budu implementovat polovinu metod jako NotImplemented…proto jsem mluvil o dědění.

Ja bych rekl, ze to smysl ma, protoze pak na ten interface nebudes muset dlouho sahnout. Kdyz to pojmes moc minimalisticky, tak se to bude muset porad upravovat, pridavat a bastlit.

Spíš si myslím, že je lepší cesta s výtahem nějaké trochu obecnější množiny metod ze známých mailerů (ne každá maličkost, co by se našla), aby onen podíl NotImplemented byl co nejmenší (ikdyž nějaké určitě budou) a mohli jsme pohodlně používat interface bez zbytečného zaplácávání metod vyhazováním vyjímek.

Co je obecnejsi mnozina metod?

Patrik Votoček
Člen | 2221
+
0
-

arron napsal(a):

Co je obecnejsi mnozina metod?

To je právě to čeho se tady snažíme dobrat… :-)

nAS
Člen | 277
+
0
-

A nechcete tu zkusit každý sepsat, co reálně používáte a podle toho by se udělal ten Interface?

Já bych určitě kromě základních věcí chtěl přílohy. SMTP jsem sice jednou využíval, ale myslím si, že to do základního mailu nepatří. Případně se může vytvořit třída SendSMTP, která bude přijímat IMail a odešle jej. Jinak žádné vychytávky nepotřebuji.

jasir
Člen | 746
+
0
-

Takový nápad, možná je to blbost, co takhle využít pro tento brainstorming místní wiki, možná by to bylo efektivnější než jednotlivé příspěvky ve fóru. A byl by základ pro dokumentaci :-)

https://doc.nette.org/…tte-web-mail

Edit: cvičně jsem tam nakopíroval návrh od Honzy M., když nebudete souhlasit, snad ta stránka půjde bezbolestně smazat

Editoval jasir (25. 5. 2009 14:10)

Ondřej Brejla
Člen | 746
+
0
-

Obecnější množinu metod jsem měl na mysli metody, ktere kazdy pouziva. Treba to smtp se bezne nepouziva. Ja bych ho treba do interfacu necpal, ty bys ho tam asi chtel. Takhle nejak sem to myslel. Vyčlenit běžně pouzivane(samo je nejdřív najít;-) a z těch udělat rozhraní.

Honza Marek
Člen | 1664
+
0
-

Trochu jsem upravil tu stránku na wiki, aby to trochu připomínalo opravdický interface. Přidal jsem tam priority a přišel na to, že nevím, co by měl vracet getter adres, když setter bude mít dva parametry.

kravčo
Člen | 721
+
0
-

Z množstva príspevkov naozaj vidno, že je to žhavá téma :)

Čo sa implementácie týka, podľa toho ako sa v Nette pracuje s kešou alebo konfiguráciou mám pocit, že maily by mohli ísť rovnako, lenže pri mailoch bude asi ťažšie nájsť interface, ktorý nebude zbytočne nabubrelý ani nepoužiteľne jednoduchý

A riešenie, že by Nette\IMailer mal lowlevel metódy ako setHeader(), addHeader() a Nette\Mail mal implementované setTo(), addTo() pomocou nich asi tiež neprejde, keďže väčšina mailerov nastavuje tieto veci metódami pre každý header zvlášť…

jasir
Člen | 746
+
0
-

Honza M. napsal(a):

Trochu jsem upravil tu stránku na wiki, aby to trochu připomínalo opravdický interface. Přidal jsem tam priority a přišel na to, že nevím, co by měl vracet getter adres, když setter bude mít dva parametry.

Otázka je, jestli jsou ty metody (gettery) v interface nezbytné. Pokud ano, pak asi ať vrací pole ve tvaru array(email=>name) nebo možná array(0=>array(email,name)).

Honza Marek
Člen | 1664
+
0
-

Abych pravdu řek, tak za největší přínos getterů považuju to, že pokud Mailer bude potomkem třídy Object, tak bude možné psát $mailer->subject = "Předmět" :-D

Potom bych ještě navrhnul, aby settery vracely $this kvůli řetězení.

PetrP
Člen | 587
+
0
-

Teď prijde david a celé to zatrhne ;]]

Honza Kuchař
Člen | 1662
+
0
-

Ten interface je opravdu gól. Opravdu tu něco takového chybělo. :)

Jak by měl vypadat adaptér. Pokud bude dědit od Object, tak nemůže dědit od maileru → předefinovávat všechny metody a proměnné znova? Bude to asi dost drbačka.

kravčo
Člen | 721
+
0
-

honzakuchar napsal(a):

Ten interface je opravdu gól. Opravdu tu něco takového chybělo. :)

Jak by měl vypadat adaptér. Pokud bude dědit od Object, tak nemůže dědit od maileru → předefinovávat všechny metody a proměnné znova? Bude to asi dost drbačka.

Pokiaľ má implementovať nejaké rozhranie, dediť od maileru by bolo trochu zvláštne – skôr by mal byť adaptérom. Tým pádom by sa rozhranie predsa len malo volať IMailerAdapter.

xificurk
Člen | 121
+
0
-

kravco napsal(a):

Pokiaľ má implementovať nejaké rozhranie, dediť od maileru by bolo trochu zvláštne – skôr by mal byť adaptérom. Tým pádom by sa rozhranie predsa len malo volať IMailerAdapter.

Jenže to, co se tu probírá je definování standardního rozhraní Maileru, tzn. v názvu by rozhodně žádný Adapter být neměl – to, že nejčastěji bude toto rozhraní implementovat nějaký adapter pro pokročilejší mailovací třídu, neznamená, že si nemůžu napsat SimpleMailer, který prostě bude jen umět odeslat textovou zprávu pomocí PHP mail().

David Grudl
Nette Core | 8142
+
0
-

Navrhnout dobrý interface není sranda. Človek se musí vyhnout všem setTo(), addTo() :-) Uživatel jinak bude koukat na addTo($email) a bude si říkat, „jasně, přidat email, ale kam?

David Grudl
Nette Core | 8142
+
0
-

Nikdy jsem asi nepoužil víc než tohle:

$mail->setFrom('Franta <franta@example.com>'); // alternativne setFrom('franta@example.com', 'Franta');
$mail->setSubject('Test email'); // v UTF-8 by default
$mail->addTo('Pepa <pepa@example.com>'); // alternativne addRecipient(), nebo addTo('pepa@example.com', 'Pepa')
$mail->addCc('Pepa <pepa@example.com>'); // nebo addCc('pepa@example.com', 'Pepa')
$mail->addBcc('Pepa <pepa@example.com>'); // nebo addBcc('pepa@example.com', 'Pepa')
$mail->setPriority(Mail::HIGH);
$mail->addHeader('X-MailGenerator', 'MyNetteApplication');
$mail->setTextBody('Sample text');
$mail->setHtmlBody('<b>Sample HTML</b> <img src="background.gif">'); // automaticky generuje textovou verzi
$mail->addEmbeddedFile('background.gif');
$mail->addAttachment('example.zip');
$mail->send();
Ondřej Brejla
Člen | 746
+
0
-

To je asi opravdu nejběžnější…osobně třeba nepoužívám prioritu, vlastně většinou ani hlavičku a přílohy…nicméně takhle nějak jsem si představoval onu diskutovanou „obecnější množinu metod“.

Honza Marek
Člen | 1664
+
0
-

Upravil jsem wiki stránku.

Zrušil jsem gettery, protože asi fakt nejsou potřeba. Místo metod addHtmlBody a addTextBody jsem nechal setTemplate, getTemplate a setHtml. Dále jsem zachoval setEncoding, protože se obávám, že bude potřeba.

Otázka je, jestli děláme interface pro šablonovací nebo obecný mailer. Já jsem pro šablonovací.

Kdo posíláte přílohy, tak napište, jaké si přejete parametry do metody addAttachment. Já nikdy přílohu neposílal, tak nevím, co je potřeba.

Editoval Honza M. (25. 5. 2009 20:42)

Ondřej Brejla
Člen | 746
+
0
-

Honza M. napsal(a):

Upravil jsem wiki stránku.

…Místo metod addHtmlBody a addTextBody jsem nechal setTemplate, getTemplate a setHtml…

Teď jsem asi toršku natvrdlej, ale plain text budu posílat tak, že si nejdřív musím vytvořit Templatu a tu nastavím pomocí setTemplate()? Není to zbytečné? Imho by měla být možnost poslat plain text…nechal bych obě možnosti, jak pomocí Templaty, tak čistý text.

Honza Marek
Člen | 1664
+
0
-
  1. Co bude mít vyšší prioritu? Šablona nebo setHtmlBody a setTextBody?
  2. To templatování mailů má pro mě velice speciální význam, protože v šabloně hodlám nastavovat i odesílatele, předmět a tak.
romansklenar
Člen | 655
+
0
-

Honza M. napsal(a):

  1. To templatování mailů má pro mě velice speciální význam, protože v šabloně hodlám nastavovat i odesílatele, předmět a tak.

To už trošku zavání Controlem… nebylo by lepší mít jen tu základní funkčnost s tím, že toto není problém si už jako komponentu dodělat?