# HG changeset patch # User František Kučera # Date 1335133471 -7200 # Node ID 9cb46ca7e26c0d2e18e2c34750143ddcd74a2d67 # Parent 290074b53acadeb354ca078c3a82b1537d3f26e1 #4 multipart/alternative zprávy: XHTML + prostý text (generuje se pomocí XSLT) diff -r 290074b53aca -r 9cb46ca7e26c java/Postak/src/cz/frantovo/postak/HromadnaZprava.java --- a/java/Postak/src/cz/frantovo/postak/HromadnaZprava.java Fri Mar 30 15:35:26 2012 +0200 +++ b/java/Postak/src/cz/frantovo/postak/HromadnaZprava.java Mon Apr 23 00:24:31 2012 +0200 @@ -9,130 +9,138 @@ /** * Hromadná zpráva. Umí se rozdělit i na více dílčích zpráv, * které se vejdou do limitu příjemců SMTP serveru. + * * @author fiki */ public class HromadnaZprava implements Cloneable { - private static final Logger log = Logger.getLogger(HromadnaZprava.class.getName()); - /** Předmět zprávy */ - private String predmet; - /** Adresa a případně jméno odesílatele */ - private InternetAddress odesilatel; - /** Zda má být zpráva odeslána jako HTML nebo prostý text */ - private boolean formatHTML = false; - /** Tělo zprávy - prostý text */ - private String text; - /** Všichni příjemci této zprávy */ - private ArrayList prijemci = new ArrayList(); - /** Hlavička Reply-to */ - private InternetAddress odpovedetKomu; + public enum FORMÁT { - public String getPredmet() { - return predmet; - } + XHTML, + PROSTÝ_TEXT, + OBOJE + } + private static final Logger log = Logger.getLogger(HromadnaZprava.class.getName()); + /** Předmět zprávy */ + private String predmet; + /** Adresa a případně jméno odesílatele */ + private InternetAddress odesilatel; + /** Zda má být zpráva odeslána jako HTML nebo prostý text */ + private FORMÁT formát = FORMÁT.PROSTÝ_TEXT; + /** Tělo zprávy - prostý text */ + private String text; + /** Všichni příjemci této zprávy */ + private ArrayList prijemci = new ArrayList(); + /** Hlavička Reply-to */ + private InternetAddress odpovedetKomu; - public void setPredmet(String predmet) { - this.predmet = predmet; - } + public String getPredmet() { + return predmet; + } - public InternetAddress getOdesilatel() { - return odesilatel; - } + public void setPredmet(String predmet) { + this.predmet = predmet; + } - public void setOdesilatel(InternetAddress odesilatel) { - this.odesilatel = odesilatel; - } + public InternetAddress getOdesilatel() { + return odesilatel; + } - public String getText() { - return text; - } + public void setOdesilatel(InternetAddress odesilatel) { + this.odesilatel = odesilatel; + } - public void setText(String text) { - this.text = text; - } + public String getText() { + return text; + } - public ArrayList getPrijemci() { - return prijemci; - } + public void setText(String text) { + this.text = text; + } - /** - * @param prijemci pokud je null, nastaví prázdná kolekce. - */ - public void setPrijemci(ArrayList prijemci) { - this.prijemci = new ArrayList(); - pridejPrijemce(prijemci); - } + public ArrayList getPrijemci() { + return prijemci; + } - public void pridejPrijemce(Collection prijemci) { - if (prijemci == null) { - log.log(Level.FINER, "Prázdná množina příjemců – nic nepřidáme"); - } else { - this.prijemci.addAll(prijemci); - } - } + /** + * @param prijemci pokud je null, nastaví prázdná kolekce. + */ + public void setPrijemci(ArrayList prijemci) { + this.prijemci = new ArrayList(); + pridejPrijemce(prijemci); + } - /** - * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem, - * rozdělí se zpráva na více dílčích zpráv. - * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru) - */ - public Collection getDilciZpravy(int limit) { - Collection zpravy = new ArrayList(); + public void pridejPrijemce(Collection prijemci) { + if (prijemci == null) { + log.log(Level.FINER, "Prázdná množina příjemců – nic nepřidáme"); + } else { + this.prijemci.addAll(prijemci); + } + } - if (limit < getPrijemci().size()) { - /** Zprávu je potřeba rozdělit */ - try { - HromadnaZprava dilciZprava = (HromadnaZprava) clone(); - dilciZprava.setPrijemci(null); + /** + * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem, + * rozdělí se zpráva na více dílčích zpráv. + * + * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru) + */ + public Collection getDilciZpravy(int limit) { + Collection zpravy = new ArrayList(); - ArrayList vsichniPrijemci = getPrijemci(); - for (InternetAddressKomu prijemce : vsichniPrijemci) { - dilciZprava.getPrijemci().add(prijemce); + if (limit < getPrijemci().size()) { + /** Zprávu je potřeba rozdělit */ + try { + HromadnaZprava dilciZprava = (HromadnaZprava) clone(); + dilciZprava.setPrijemci(null); - if (dilciZprava.getPrijemci().size() == limit) { - zpravy.add(dilciZprava); - dilciZprava = (HromadnaZprava) clone(); - dilciZprava.setPrijemci(null); - } - } + ArrayList vsichniPrijemci = getPrijemci(); + for (InternetAddressKomu prijemce : vsichniPrijemci) { + dilciZprava.getPrijemci().add(prijemce); - if (dilciZprava.getPrijemci().size() > 0) { - /** - * Počet příjemců není násobkem limitu, - * takže nakonci ještě někteří zbyli. - * Z nich budou příjemci pro poslední dílčí zprávu. - */ - zpravy.add(dilciZprava); - } + if (dilciZprava.getPrijemci().size() == limit) { + zpravy.add(dilciZprava); + dilciZprava = (HromadnaZprava) clone(); + dilciZprava.setPrijemci(null); + } + } + if (dilciZprava.getPrijemci().size() > 0) { + /** + * Počet příjemců není násobkem limitu, + * takže nakonci ještě někteří zbyli. + * Z nich budou příjemci pro poslední dílčí zprávu. + */ + zpravy.add(dilciZprava); + } - } catch (CloneNotSupportedException ex) { - /** Tohle by nikdy nemělo nastat */ - log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex); - zpravy.add(this); - } - } else { - /** Zprávu má málo příjemců - můžeme ji odeslat najednou */ - zpravy.add(this); - } - return zpravy; - } + } catch (CloneNotSupportedException ex) { + /** Tohle by nikdy nemělo nastat */ + log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex); + zpravy.add(this); + } + } else { + /** Zprávu má málo příjemců - můžeme ji odeslat najednou */ + zpravy.add(this); + } - public boolean isFormatHTML() { - return formatHTML; - } + return zpravy; + } - public void setFormatHTML(boolean formatHTML) { - this.formatHTML = formatHTML; - } + public FORMÁT getFormát() { + return formát; + } - public InternetAddress getOdpovedetKomu() { - return odpovedetKomu; - } + public void setFormatHTML(FORMÁT formát) { + this.formát = formát; + } - /** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */ - public void setOdpovedetKomu(InternetAddress odpovedetKomu) { - this.odpovedetKomu = odpovedetKomu; - } + public InternetAddress getOdpovedetKomu() { + return odpovedetKomu; + } + + /** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */ + public void setOdpovedetKomu(InternetAddress odpovedetKomu) { + this.odpovedetKomu = odpovedetKomu; + } } diff -r 290074b53aca -r 9cb46ca7e26c java/Postak/src/cz/frantovo/postak/Postak.java --- a/java/Postak/src/cz/frantovo/postak/Postak.java Fri Mar 30 15:35:26 2012 +0200 +++ b/java/Postak/src/cz/frantovo/postak/Postak.java Mon Apr 23 00:24:31 2012 +0200 @@ -1,6 +1,8 @@ package cz.frantovo.postak; import java.io.File; +import java.io.StringReader; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Properties; @@ -13,210 +15,251 @@ import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; +import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; /** * Odešle hromadnou zprávu pomocí SMTP. - * + * * @author fiki */ -public class Postak { - - private static final Logger log = Logger.getLogger(Postak.class.getName()); - /** Regulární výraz pro správnou e-mailovou adresu */ - private static String REGULARNI_EMAIL = "^[_a-zA-Z0-9\\.\\-]+@[_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4}$"; - - private Nastaveni nastaveni; +public class Postak { - public Postak(Nastaveni nastaveni) { - this.nastaveni = nastaveni; - } + private static final String KÓDOVÁNÍ = "UTF-8"; + private static final Logger log = Logger.getLogger(Postak.class.getName()); + /** Regulární výraz pro správnou e-mailovou adresu */ + private static String REGULARNI_EMAIL = "^[_a-zA-Z0-9\\.\\-]+@[_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4}$"; + private Nastaveni nastaveni; + private TransformerFactory transformerFactory; - public void setNastaveni(Nastaveni nastaveni) { - this.nastaveni = nastaveni; - } + public Postak(Nastaveni nastaveni) { + this.nastaveni = nastaveni; + transformerFactory = TransformerFactory.newInstance(); + } - /** - * Nízkoúrovňová odesílací metoda, která už nekontroluje limit příjemců. - * Pokud se nevejdou do limitu SMTP serveru, vyhazuje výjimku. - * - * TODO: lepší to bude nestaické - nastavení si vyžádat v konstruktoru - */ - private void odesliSMTP(HromadnaZprava zprava) throws MessagingException { + public void setNastaveni(Nastaveni nastaveni) { + this.nastaveni = nastaveni; + } - if (zkontrolujZpravu(zprava) && zkontrolujNastaveni(nastaveni)) { + /** + * Nízkoúrovňová odesílací metoda, která už nekontroluje limit příjemců. + * Pokud se nevejdou do limitu SMTP serveru, vyhazuje výjimku. + * + * TODO: lepší to bude nestaické - nastavení si vyžádat v konstruktoru + */ + private void odesliSMTP(HromadnaZprava zprava) throws MessagingException { - /** Inicializace SMTP */ - Properties smtpVlastnosti = System.getProperties(); - smtpVlastnosti.put("mail.smtp.host", nastaveni.getPostovniServer()); - smtpVlastnosti.put("mail.smtp.port", String.valueOf(nastaveni.getPostovniPort())); + if (zkontrolujZpravu(zprava) && zkontrolujNastaveni(nastaveni)) { - if (nastaveni.getPostovniPort() == 465) { - if (new File(nastaveni.getCestaKCertifikatum()).exists()) { - System.setProperty("javax.net.ssl.trustStore", nastaveni.getCestaKCertifikatum()); - log.log(Level.INFO, "Používám vlastní důvěryhodné certifikáty: {0}", nastaveni.getCestaKCertifikatum()); - } - /** TODO: neřídit se číslem portu, ale přidat příznak pro šifrování */ - smtpVlastnosti.put("mail.smtp.starttls.enable", "true"); - smtpVlastnosti.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - smtpVlastnosti.put("mail.smtp.socketFactory.port", String.valueOf(nastaveni.getPostovniPort())); - smtpVlastnosti.put("mail.smtp.socketFactory.fallback", "false"); - /** - * NAHRÁNÍ CERTIFIKÁTU: - * 1) stáhneme si certifikát (---BEGIN CERTIFICATE---) a uložíme do vse_ca.cer - * 2) keytool -importcert -file vse_ca.cer -keystore DuveryhodneCertifikaty.keystore -storepass "changeit" - * Pokud daný soubor existuje, program ho používá, pokud ne, používá certifikáty uložené v systému (Javovské). - */ - } + /** Inicializace SMTP */ + Properties smtpVlastnosti = System.getProperties(); + smtpVlastnosti.put("mail.smtp.host", nastaveni.getPostovniServer()); + smtpVlastnosti.put("mail.smtp.port", String.valueOf(nastaveni.getPostovniPort())); - PostakuvHeslovnik heslovnik = new PostakuvHeslovnik(); - if (nastaveni.getPostovniJmeno() != null && nastaveni.getPostovniJmeno().length() > 0) { - heslovnik.setJmenoHeslo(nastaveni.getPostovniJmeno(), nastaveni.getPostovniHeslo()); - smtpVlastnosti.put("mail.smtp.auth", "true"); - log.log(Level.FINEST, "Používám pro SMTP jméno a heslo"); - } + if (nastaveni.getPostovniPort() == 465) { + if (new File(nastaveni.getCestaKCertifikatum()).exists()) { + System.setProperty("javax.net.ssl.trustStore", nastaveni.getCestaKCertifikatum()); + log.log(Level.INFO, "Používám vlastní důvěryhodné certifikáty: {0}", nastaveni.getCestaKCertifikatum()); + } + /** TODO: neřídit se číslem portu, ale přidat příznak pro šifrování */ + smtpVlastnosti.put("mail.smtp.starttls.enable", "true"); + smtpVlastnosti.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + smtpVlastnosti.put("mail.smtp.socketFactory.port", String.valueOf(nastaveni.getPostovniPort())); + smtpVlastnosti.put("mail.smtp.socketFactory.fallback", "false"); + /** + * NAHRÁNÍ CERTIFIKÁTU: + * 1) stáhneme si certifikát (---BEGIN CERTIFICATE---) a uložíme do vse_ca.cer + * 2) keytool -importcert -file vse_ca.cer -keystore DuveryhodneCertifikaty.keystore + * -storepass "changeit" + * Pokud daný soubor existuje, program ho používá, pokud ne, používá certifikáty + * uložené v systému (Javovské). + */ + } - Session smtpRelace = Session.getInstance(smtpVlastnosti, heslovnik); + PostakuvHeslovnik heslovnik = new PostakuvHeslovnik(); + if (nastaveni.getPostovniJmeno() != null && nastaveni.getPostovniJmeno().length() > 0) { + heslovnik.setJmenoHeslo(nastaveni.getPostovniJmeno(), nastaveni.getPostovniHeslo()); + smtpVlastnosti.put("mail.smtp.auth", "true"); + log.log(Level.FINEST, "Používám pro SMTP jméno a heslo"); + } - smtpRelace.setDebug(true); - smtpRelace.setDebugOut(System.out); + Session smtpRelace = Session.getInstance(smtpVlastnosti, heslovnik); - /** Sestavení zprávy */ - MimeMessage mimeZprava = new MimeMessage(smtpRelace); - mimeZprava.setFrom(zprava.getOdesilatel()); - if (zprava.getOdpovedetKomu() != null) { - Address[] odpovedetKomu = {zprava.getOdpovedetKomu()}; - mimeZprava.setReplyTo(odpovedetKomu); - } - naplnPrijemce(mimeZprava, zprava); - mimeZprava.setSubject(zprava.getPredmet()); - mimeZprava.setHeader("User-Agent", "https://frantovo.cz/projekty/SuperPostak/"); - mimeZprava.setHeader("Precedence", "bulk"); - if (zprava.isFormatHTML()) { - mimeZprava.setText(zprava.getText(), "UTF-8", "html"); - } else { - mimeZprava.setText(zprava.getText(), "UTF-8"); - } + smtpRelace.setDebug(true); + smtpRelace.setDebugOut(System.out); - /** Vlastní odeslání */ - Transport.send(mimeZprava); + /** Sestavení zprávy */ + MimeMessage mimeZprava = new MimeMessage(smtpRelace); + mimeZprava.setFrom(zprava.getOdesilatel()); + if (zprava.getOdpovedetKomu() != null) { + Address[] odpovedetKomu = {zprava.getOdpovedetKomu()}; + mimeZprava.setReplyTo(odpovedetKomu); + } + naplnPrijemce(mimeZprava, zprava); + mimeZprava.setSubject(zprava.getPredmet()); + mimeZprava.setHeader("User-Agent", "https://frantovo.cz/projekty/SuperPostak/"); + mimeZprava.setHeader("Precedence", "bulk"); - } else { - MessagingException e = new MessagingException("Zpráva nebo nastavení jsou nevyhovující"); - log.log(Level.SEVERE, null, e); - throw e; - } + switch (zprava.getFormát()) { + case PROSTÝ_TEXT: + mimeZprava.setText(zprava.getText(), KÓDOVÁNÍ); + break; + case XHTML: + mimeZprava.setText(zprava.getText(), KÓDOVÁNÍ, "html"); + break; + case OBOJE: + MimeMultipart multipart = new MimeMultipart("alternative"); + mimeZprava.setContent(multipart); - } + MimeBodyPart textováČást = new MimeBodyPart(); + MimeBodyPart xhtmlČást = new MimeBodyPart(); - /** - * Nastaví zprávě (MimeMessage) všechny příjemce, které najde ve zprávě a nastavení. - * Respektuje typy příjemců: komu, kopie, skrytá kopie. - */ - private static void naplnPrijemce(MimeMessage mimeZprava, HromadnaZprava zprava) throws MessagingException { - /** - * Příjemci se budou definovat pouze ve zprávě. - * Z nastavení se brát nebudou (výchozí příjemci už ve zprávě budou). - */ - ArrayList prijemci = zprava.getPrijemci(); - for (InternetAddressKomu komu : prijemci) { - if (zkontrolujAdresu(komu)) { - mimeZprava.addRecipient(komu.getTyp(), komu); - } - } - } + textováČást.setText(xhtmlNaProstýText(zprava.getText()), KÓDOVÁNÍ); + xhtmlČást.setContent(zprava.getText(), "text/html; charset=" + KÓDOVÁNÍ); - /** Vypíše do logu seznam příjemců */ - public static void vypisPrijemce(Collection prijemci) { - for (InternetAddressKomu p : prijemci) { - log.log(Level.INFO, p.toString()); - } - } + multipart.addBodyPart(textováČást); + multipart.addBodyPart(xhtmlČást); + break; + } - /** Veřejná odesílací metoda. - * Postará se o rozdělení zpráv na dílčí (které se vejdou do limitu příjemců) - */ - public void odesli(HromadnaZprava zprava) throws MessagingException { - Collection zpravy = zprava.getDilciZpravy(nastaveni.getLimitZprav()); + /** Vlastní odeslání */ + Transport.send(mimeZprava); - for (HromadnaZprava dilciZprava : zpravy) { - odesliSMTP(dilciZprava); - } - } + } else { + MessagingException e = new MessagingException("Zpráva nebo nastavení jsou nevyhovující"); + log.log(Level.SEVERE, null, e); + throw e; + } - private static boolean zkontrolujAdresu(InternetAddressKomu a) { - if (a.getTyp() == null) { - log.log(Level.WARNING, "Neplatná adresa (typ): {0}", a.getAddress()); - return false; - } + } - if (a.getAddress() == null || a.getAddress().length() < 1) { - log.log(Level.WARNING, "Neplatná adresa (address): {0}", a.getPersonal()); - return false; - } + private String xhtmlNaProstýText(String xhtml) throws MessagingException { + try { + Transformer textTransformer = transformerFactory.newTransformer(new StreamSource(getClass().getClassLoader().getResourceAsStream("cz/frantovo/postak/odchozíEmailText.xsl"))); - if (!zkontrolujAdresu(a.getAddress())) { - log.log(Level.WARNING, "Adresa nevyhovuje regulárnímu výrazu: {0}", a.getAddress()); - return false; - } + StringReader input = new StringReader(xhtml); + StringWriter output = new StringWriter(xhtml.length()); + textTransformer.transform(new StreamSource(input), new StreamResult(output)); - return true; - } + return output.toString(); + } catch (Exception e) { + throw new MessagingException("Chyba při XSL transformaci zprávy na prostý text.", e); + } + } - /** Zkontroluje e-mailovou adresu pomocí regulárního výrazu. */ - public static boolean zkontrolujAdresu(String adresa) { - return adresa != null && Pattern.matches(REGULARNI_EMAIL, adresa); - } + /** + * Nastaví zprávě (MimeMessage) všechny příjemce, které najde ve zprávě a nastavení. + * Respektuje typy příjemců: komu, kopie, skrytá kopie. + */ + private static void naplnPrijemce(MimeMessage mimeZprava, HromadnaZprava zprava) throws MessagingException { + /** + * Příjemci se budou definovat pouze ve zprávě. + * Z nastavení se brát nebudou (výchozí příjemci už ve zprávě budou). + */ + ArrayList prijemci = zprava.getPrijemci(); + for (InternetAddressKomu komu : prijemci) { + if (zkontrolujAdresu(komu)) { + mimeZprava.addRecipient(komu.getTyp(), komu); + } + } + } - /** @return Vrací true, pokud je zpráva v pořádku */ - private static boolean zkontrolujZpravu(HromadnaZprava z) { + /** Vypíše do logu seznam příjemců */ + public static void vypisPrijemce(Collection prijemci) { + for (InternetAddressKomu p : prijemci) { + log.log(Level.INFO, p.toString()); + } + } - if (z.getPrijemci() == null) { - log.log(Level.WARNING, "getPrijemci() == null"); - return false; - } + /** Veřejná odesílací metoda. + * Postará se o rozdělení zpráv na dílčí (které se vejdou do limitu příjemců) + */ + public void odesli(HromadnaZprava zprava) throws MessagingException { + Collection zpravy = zprava.getDilciZpravy(nastaveni.getLimitZprav()); - if (z.getPrijemci().size() < 1) { - log.log(Level.WARNING, "getPrijemci().size() < 1"); - return false; - } + for (HromadnaZprava dilciZprava : zpravy) { + odesliSMTP(dilciZprava); + } + } - if (z.getOdesilatel() == null) { - log.log(Level.WARNING, "getOdesilatel() == null"); - return false; - } + private static boolean zkontrolujAdresu(InternetAddressKomu a) { + if (a.getTyp() == null) { + log.log(Level.WARNING, "Neplatná adresa (typ): {0}", a.getAddress()); + return false; + } - if (z.getPredmet() == null) { - log.log(Level.WARNING, "getPredmet() == null"); - return false; - } + if (a.getAddress() == null || a.getAddress().length() < 1) { + log.log(Level.WARNING, "Neplatná adresa (address): {0}", a.getPersonal()); + return false; + } - return true; - } + if (!zkontrolujAdresu(a.getAddress())) { + log.log(Level.WARNING, "Adresa nevyhovuje regulárnímu výrazu: {0}", a.getAddress()); + return false; + } - private static boolean zkontrolujNastaveni(Nastaveni n) { + return true; + } - if (n.getPostovniServer() == null || n.getPostovniServer().length() < 1) { - return false; - } + /** Zkontroluje e-mailovou adresu pomocí regulárního výrazu. */ + public static boolean zkontrolujAdresu(String adresa) { + return adresa != null && Pattern.matches(REGULARNI_EMAIL, adresa); + } - return true; - } + /** @return Vrací true, pokud je zpráva v pořádku */ + private static boolean zkontrolujZpravu(HromadnaZprava z) { - /** Slouží k uložení jména a hesla pro SMTP */ - private static class PostakuvHeslovnik extends Authenticator { + if (z.getPrijemci() == null) { + log.log(Level.WARNING, "getPrijemci() == null"); + return false; + } - private String jmeno = "user"; - private char[] heslo = "luser".toCharArray(); + if (z.getPrijemci().size() < 1) { + log.log(Level.WARNING, "getPrijemci().size() < 1"); + return false; + } - @Override - public PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(jmeno, String.valueOf(heslo)); - } + if (z.getOdesilatel() == null) { + log.log(Level.WARNING, "getOdesilatel() == null"); + return false; + } - public void setJmenoHeslo(String jmeno, char[] heslo) { - this.jmeno = jmeno; - this.heslo = heslo; - } - } + if (z.getPredmet() == null) { + log.log(Level.WARNING, "getPredmet() == null"); + return false; + } + + return true; + } + + private static boolean zkontrolujNastaveni(Nastaveni n) { + + if (n.getPostovniServer() == null || n.getPostovniServer().length() < 1) { + return false; + } + + return true; + } + + /** Slouží k uložení jména a hesla pro SMTP */ + private static class PostakuvHeslovnik extends Authenticator { + + private String jmeno = "user"; + private char[] heslo = "luser".toCharArray(); + + @Override + public PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(jmeno, String.valueOf(heslo)); + } + + public void setJmenoHeslo(String jmeno, char[] heslo) { + this.jmeno = jmeno; + this.heslo = heslo; + } + } } diff -r 290074b53aca -r 9cb46ca7e26c java/Postak/src/cz/frantovo/postak/odchozíEmailText.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/src/cz/frantovo/postak/odchozíEmailText.xsl Mon Apr 23 00:24:31 2012 +0200 @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ### + + + + + + + + #### + + + + + + + + ##### + + + + + + + + ###### + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + ' + + ' + + < + + + + + + + + + + + + + + + + + + + + > + + ( + + ) + + + + + + Obrázek: + + + + + + + ** + + ** + + + + + * + + * + + + + + + ( + + ) + + + + + -------------------------------- + + + + -------------------------------- + + + + + + + ` + + ` + + + + + ---------------------------------------------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 290074b53aca -r 9cb46ca7e26c java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form --- a/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form Fri Mar 30 15:35:26 2012 +0200 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form Mon Apr 23 00:24:31 2012 +0200 @@ -510,8 +510,8 @@ - - + + @@ -527,16 +527,20 @@ - - - + + + - - - + + + + + + + @@ -566,7 +570,9 @@ - + + + @@ -616,13 +622,6 @@ - - - - - - - @@ -642,6 +641,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -726,6 +756,8 @@ + + diff -r 290074b53aca -r 9cb46ca7e26c java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java --- a/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java Fri Mar 30 15:35:26 2012 +0200 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java Mon Apr 23 00:24:31 2012 +0200 @@ -9,6 +9,8 @@ import java.awt.Cursor; import java.awt.Dialog.ModalityType; import java.awt.KeyboardFocusManager; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; @@ -28,19 +30,15 @@ import java.util.zip.GZIPOutputStream; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JOptionPane; -import javax.swing.JTextArea; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.*; +import javax.swing.event.ChangeListener; import org.jdesktop.swingx.JXErrorPane; import org.jdesktop.swingx.JXTaskPaneContainer; import org.jdesktop.swingx.error.ErrorInfo; /** * - * @author fiki + * @author fiki */ public class SuperPostak extends javax.swing.JFrame { @@ -56,6 +54,7 @@ /** * Creates new form SuperPostak + * * @param ladit předvyplní testovací hodnoty - zprávu * @param exit při zavření okna ukončí program */ @@ -350,8 +349,10 @@ jScrollPane1 = new javax.swing.JScrollPane(); vstupZprava = new javax.swing.JTextArea(); jLabel15 = new javax.swing.JLabel(); - vstupFormatHTML = new javax.swing.JCheckBox(); odpovedetKomuOdkaz = new org.jdesktop.swingx.JXHyperlink(); + formátProstý = new javax.swing.JRadioButton(); + formátXHTML = new javax.swing.JRadioButton(); + formátOboje = new javax.swing.JRadioButton(); odpovedetKomuDialog = new javax.swing.JDialog(); jLabel18 = new javax.swing.JLabel(); jLabel19 = new javax.swing.JLabel(); @@ -359,6 +360,7 @@ odpovedetKomuJmeno = new javax.swing.JTextField(); odpovedetKomuAdresa = new javax.swing.JTextField(); odpovedetKomuHotovo = new javax.swing.JButton(); + formátSkupina = new javax.swing.ButtonGroup(); jXHeader1 = new org.jdesktop.swingx.JXHeader(); taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer(); jXTaskPane1 = new org.jdesktop.swingx.JXTaskPane(); @@ -700,10 +702,6 @@ jLabel15.setText("Formát zprávy"); - vstupFormatHTML.setMnemonic('h'); - vstupFormatHTML.setText("HTML"); - vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text"); - odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText")); odpovedetKomuOdkaz.setMnemonic('e'); odpovedetKomuOdkaz.setText("Adresa odesílatele"); @@ -716,15 +714,35 @@ } }); + formátSkupina.add(formátProstý); + formátProstý.setSelected(true); + formátProstý.setText("Prostý text"); + + formátSkupina.add(formátXHTML); + formátXHTML.setText("(X)HTML"); + formátXHTML.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + formátXHTMLActionPerformed(evt); + } + }); + + formátSkupina.add(formátOboje); + formátOboje.setText("Oboje"); + formátOboje.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + formátObojeActionPerformed(evt); + } + }); + javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava); panelZprava.setLayout(panelZpravaLayout); panelZpravaLayout.setHorizontalGroup( panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() .addContainerGap() - .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE) - .addGroup(panelZpravaLayout.createSequentialGroup() + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(panelZpravaLayout.createSequentialGroup() .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -735,14 +753,18 @@ .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) - .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) - .addComponent(vstupPredmet, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE))) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelZpravaLayout.createSequentialGroup() + .addComponent(vstupJmenoOdesilatele) + .addComponent(vstupAdresaOdesilatele) + .addComponent(vstupPredmet))) + .addGroup(panelZpravaLayout.createSequentialGroup() .addComponent(jLabel15) - .addGap(33, 33, 33) - .addComponent(vstupFormatHTML, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE) - .addGap(247, 247, 247))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(formátProstý) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(formátXHTML) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(formátOboje) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); panelZpravaLayout.setVerticalGroup( @@ -765,7 +787,9 @@ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel15) - .addComponent(vstupFormatHTML)) + .addComponent(formátProstý) + .addComponent(formátXHTML) + .addComponent(formátOboje)) .addContainerGap()) ); @@ -816,7 +840,7 @@ .addComponent(jLabel19) .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel17) + .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(odpovedetKomuHotovo) .addContainerGap()) @@ -966,7 +990,17 @@ zprava.setOdesilatel(new InternetAddress(vstupAdresaOdesilatele.getText(), vstupJmenoOdesilatele.getText())); zprava.setPredmet(vstupPredmet.getText()); zprava.setText(vstupZprava.getText()); - zprava.setFormatHTML(vstupFormatHTML.isSelected()); + + if (formátProstý.isSelected()) { + zprava.setFormatHTML(HromadnaZprava.FORMÁT.PROSTÝ_TEXT); + } else if (formátXHTML.isSelected()) { + zprava.setFormatHTML(HromadnaZprava.FORMÁT.XHTML); + } else if (formátOboje.isSelected()) { + zprava.setFormatHTML(HromadnaZprava.FORMÁT.OBOJE); + } else { + log.severe("Není zvolen formát zprávy → nastavuji: prostý text."); + zprava.setFormatHTML(HromadnaZprava.FORMÁT.PROSTÝ_TEXT); + } if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) { InternetAddress komu = new InternetAddress(); @@ -1102,6 +1136,28 @@ } }//GEN-LAST:event_odpovedetKomuHotovoActionPerformed + private void formátXHTMLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_formátXHTMLActionPerformed + nastavVýchozíXHTML(); + }//GEN-LAST:event_formátXHTMLActionPerformed + + private void formátObojeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_formátObojeActionPerformed + nastavVýchozíXHTML(); + }//GEN-LAST:event_formátObojeActionPerformed + + /** + * Pokud ještě není vyplněn žádný text, vložíme šablonu. + */ + private void nastavVýchozíXHTML() { + if (vstupZprava.getText().isEmpty()) { + vstupZprava.setText("\n" + + "\n\n" + + "

\n" + + "
\n\n" + + "\n" + + ""); + } + } + /** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */ private Collection getPrijemciSQL() throws SQLException, UnsupportedEncodingException { if ("".equals(vstupSQL.getText())) { @@ -1183,6 +1239,10 @@ }); } // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JRadioButton formátOboje; + private javax.swing.JRadioButton formátProstý; + private javax.swing.ButtonGroup formátSkupina; + private javax.swing.JRadioButton formátXHTML; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; @@ -1239,7 +1299,6 @@ private javax.swing.JPasswordField vstupDBheslo; private javax.swing.JTextField vstupDBjmeno; private javax.swing.JTextField vstupDatabaze; - private javax.swing.JCheckBox vstupFormatHTML; private javax.swing.JTextField vstupJmenoOdesilatele; private javax.swing.JTextField vstupPredmet; private javax.swing.JPasswordField vstupSMTPheslo;