Changeset 17:9cb46ca7e26c

Show
Ignore:
Timestamp:
04/23/12 00:24:31 (12 years ago)
Author:
František Kučera <franta-hg@…>
Branch:
default
Tags:
v1.1
Message:

#4 multipart/alternative zprávy: XHTML + prostý text (generuje se pomocí XSLT)

Location:
java
Files:
1 added
4 modified

Legend:

Unmodified
Added
Removed
  • java/Postak/src/cz/frantovo/postak/HromadnaZprava.java

    r13 r17  
    1010 * Hromadná zpráva. Umí se rozdělit i na více dílčích zpráv, 
    1111 * které se vejdou do limitu příjemců SMTP serveru. 
     12 * 
    1213 * @author fiki 
    1314 */ 
    1415public class HromadnaZprava implements Cloneable { 
    1516 
    16     private static final Logger log = Logger.getLogger(HromadnaZprava.class.getName()); 
    17     /** Předmět zprávy */ 
    18     private String predmet; 
    19     /** Adresa a případně jméno odesílatele */ 
    20     private InternetAddress odesilatel; 
    21     /** Zda má být zpráva odeslána jako HTML nebo prostý text */ 
    22     private boolean formatHTML = false; 
    23     /** Tělo zprávy - prostý text */ 
    24     private String text; 
    25     /** Všichni příjemci této zprávy */ 
    26     private ArrayList<InternetAddressKomu> prijemci = new ArrayList<InternetAddressKomu>(); 
    27     /** Hlavička Reply-to */ 
    28     private InternetAddress odpovedetKomu; 
     17        public enum FORMÁT { 
    2918 
    30     public String getPredmet() { 
    31         return predmet; 
    32     } 
     19                XHTML, 
     20                PROSTÝ_TEXT, 
     21                OBOJE 
     22        } 
     23        private static final Logger log = Logger.getLogger(HromadnaZprava.class.getName()); 
     24        /** Předmět zprávy */ 
     25        private String predmet; 
     26        /** Adresa a případně jméno odesílatele */ 
     27        private InternetAddress odesilatel; 
     28        /** Zda má být zpráva odeslána jako HTML nebo prostý text */ 
     29        private FORMÁT formát = FORMÁT.PROSTÝ_TEXT; 
     30        /** Tělo zprávy - prostý text */ 
     31        private String text; 
     32        /** Všichni příjemci této zprávy */ 
     33        private ArrayList<InternetAddressKomu> prijemci = new ArrayList<InternetAddressKomu>(); 
     34        /** Hlavička Reply-to */ 
     35        private InternetAddress odpovedetKomu; 
    3336 
    34     public void setPredmet(String predmet) { 
    35         this.predmet = predmet; 
    36     } 
     37        public String getPredmet() { 
     38                return predmet; 
     39        } 
    3740 
    38     public InternetAddress getOdesilatel() { 
    39         return odesilatel; 
    40     } 
     41        public void setPredmet(String predmet) { 
     42                this.predmet = predmet; 
     43        } 
    4144 
    42     public void setOdesilatel(InternetAddress odesilatel) { 
    43         this.odesilatel = odesilatel; 
    44     } 
     45        public InternetAddress getOdesilatel() { 
     46                return odesilatel; 
     47        } 
    4548 
    46     public String getText() { 
    47         return text; 
    48     } 
     49        public void setOdesilatel(InternetAddress odesilatel) { 
     50                this.odesilatel = odesilatel; 
     51        } 
    4952 
    50     public void setText(String text) { 
    51         this.text = text; 
    52     } 
     53        public String getText() { 
     54                return text; 
     55        } 
    5356 
    54     public ArrayList<InternetAddressKomu> getPrijemci() { 
    55         return prijemci; 
    56     } 
     57        public void setText(String text) { 
     58                this.text = text; 
     59        } 
    5760 
    58     /**  
    59      * @param prijemci pokud je null, nastaví prázdná kolekce. 
    60      */ 
    61     public void setPrijemci(ArrayList<InternetAddressKomu> prijemci) { 
    62         this.prijemci = new ArrayList<InternetAddressKomu>(); 
    63         pridejPrijemce(prijemci); 
    64     } 
     61        public ArrayList<InternetAddressKomu> getPrijemci() { 
     62                return prijemci; 
     63        } 
    6564 
    66     public void pridejPrijemce(Collection<InternetAddressKomu> prijemci) { 
    67         if (prijemci == null) { 
    68             log.log(Level.FINER, "Prázdná množina příjemců – nic nepřidáme"); 
    69         } else { 
    70             this.prijemci.addAll(prijemci); 
    71         } 
    72     } 
     65        /** 
     66         * @param prijemci pokud je null, nastaví prázdná kolekce. 
     67         */ 
     68        public void setPrijemci(ArrayList<InternetAddressKomu> prijemci) { 
     69                this.prijemci = new ArrayList<InternetAddressKomu>(); 
     70                pridejPrijemce(prijemci); 
     71        } 
    7372 
    74     /** 
    75      * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem, 
    76      * rozdělí se zpráva na více dílčích zpráv. 
    77      * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru) 
    78      */ 
    79     public Collection<HromadnaZprava> getDilciZpravy(int limit) { 
    80         Collection<HromadnaZprava> zpravy = new ArrayList<HromadnaZprava>(); 
     73        public void pridejPrijemce(Collection<InternetAddressKomu> prijemci) { 
     74                if (prijemci == null) { 
     75                        log.log(Level.FINER, "Prázdná množina příjemců – nic nepřidáme"); 
     76                } else { 
     77                        this.prijemci.addAll(prijemci); 
     78                } 
     79        } 
    8180 
    82         if (limit < getPrijemci().size()) { 
    83             /** Zprávu je potřeba rozdělit */ 
    84             try { 
    85                 HromadnaZprava dilciZprava = (HromadnaZprava) clone(); 
    86                 dilciZprava.setPrijemci(null); 
     81        /** 
     82         * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem, 
     83         * rozdělí se zpráva na více dílčích zpráv. 
     84         * 
     85         * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru) 
     86         */ 
     87        public Collection<HromadnaZprava> getDilciZpravy(int limit) { 
     88                Collection<HromadnaZprava> zpravy = new ArrayList<HromadnaZprava>(); 
    8789 
    88                 ArrayList<InternetAddressKomu> vsichniPrijemci = getPrijemci(); 
    89                 for (InternetAddressKomu prijemce : vsichniPrijemci) { 
    90                     dilciZprava.getPrijemci().add(prijemce); 
     90                if (limit < getPrijemci().size()) { 
     91                        /** Zprávu je potřeba rozdělit */ 
     92                        try { 
     93                                HromadnaZprava dilciZprava = (HromadnaZprava) clone(); 
     94                                dilciZprava.setPrijemci(null); 
    9195 
    92                     if (dilciZprava.getPrijemci().size() == limit) { 
    93                         zpravy.add(dilciZprava); 
    94                         dilciZprava = (HromadnaZprava) clone(); 
    95                         dilciZprava.setPrijemci(null); 
    96                     } 
    97                 } 
     96                                ArrayList<InternetAddressKomu> vsichniPrijemci = getPrijemci(); 
     97                                for (InternetAddressKomu prijemce : vsichniPrijemci) { 
     98                                        dilciZprava.getPrijemci().add(prijemce); 
    9899 
    99                 if (dilciZprava.getPrijemci().size() > 0) { 
    100                     /** 
    101                      * Počet příjemců není násobkem limitu, 
    102                      * takže nakonci ještě někteří zbyli. 
    103                      * Z nich budou příjemci pro poslední dílčí zprávu. 
    104                      */ 
    105                     zpravy.add(dilciZprava); 
    106                 } 
     100                                        if (dilciZprava.getPrijemci().size() == limit) { 
     101                                                zpravy.add(dilciZprava); 
     102                                                dilciZprava = (HromadnaZprava) clone(); 
     103                                                dilciZprava.setPrijemci(null); 
     104                                        } 
     105                                } 
     106 
     107                                if (dilciZprava.getPrijemci().size() > 0) { 
     108                                        /** 
     109                                         * Počet příjemců není násobkem limitu, 
     110                                         * takže nakonci ještě někteří zbyli. 
     111                                         * Z nich budou příjemci pro poslední dílčí zprávu. 
     112                                         */ 
     113                                        zpravy.add(dilciZprava); 
     114                                } 
    107115 
    108116 
    109             } catch (CloneNotSupportedException ex) { 
    110                 /** Tohle by nikdy nemělo nastat */ 
    111                 log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex); 
    112                 zpravy.add(this); 
    113             } 
    114         } else { 
    115             /** Zprávu má málo příjemců - můžeme ji odeslat najednou */ 
    116             zpravy.add(this); 
    117         } 
     117                        } catch (CloneNotSupportedException ex) { 
     118                                /** Tohle by nikdy nemělo nastat */ 
     119                                log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex); 
     120                                zpravy.add(this); 
     121                        } 
     122                } else { 
     123                        /** Zprávu má málo příjemců - můžeme ji odeslat najednou */ 
     124                        zpravy.add(this); 
     125                } 
    118126 
    119         return zpravy; 
    120     } 
     127                return zpravy; 
     128        } 
    121129 
    122     public boolean isFormatHTML() { 
    123         return formatHTML; 
    124     } 
     130        public FORMÁT getFormát() { 
     131                return formát; 
     132        } 
    125133 
    126     public void setFormatHTML(boolean formatHTML) { 
    127         this.formatHTML = formatHTML; 
    128     } 
     134        public void setFormatHTML(FORMÁT formát) { 
     135                this.formát = formát; 
     136        } 
    129137 
    130     public InternetAddress getOdpovedetKomu() { 
    131         return odpovedetKomu; 
    132     } 
     138        public InternetAddress getOdpovedetKomu() { 
     139                return odpovedetKomu; 
     140        } 
    133141 
    134     /** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */ 
    135     public void setOdpovedetKomu(InternetAddress odpovedetKomu) { 
    136         this.odpovedetKomu = odpovedetKomu; 
    137     } 
     142        /** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */ 
     143        public void setOdpovedetKomu(InternetAddress odpovedetKomu) { 
     144                this.odpovedetKomu = odpovedetKomu; 
     145        } 
    138146} 
  • java/Postak/src/cz/frantovo/postak/Postak.java

    r11 r17  
    22 
    33import java.io.File; 
     4import java.io.StringReader; 
     5import java.io.StringWriter; 
    46import java.util.ArrayList; 
    57import java.util.Collection; 
     
    1416import javax.mail.Session; 
    1517import javax.mail.Transport; 
     18import javax.mail.internet.MimeBodyPart; 
    1619import javax.mail.internet.MimeMessage; 
     20import javax.mail.internet.MimeMultipart; 
     21import javax.xml.transform.Transformer; 
     22import javax.xml.transform.TransformerFactory; 
     23import javax.xml.transform.stream.StreamResult; 
     24import javax.xml.transform.stream.StreamSource; 
    1725 
    1826/** 
    1927 * Odešle hromadnou zprávu pomocí SMTP. 
    20  *  
     28 * 
    2129 * @author fiki 
    2230 */ 
    23 public class Postak {    
    24      
    25     private static final Logger log = Logger.getLogger(Postak.class.getName()); 
    26     /** Regulární výraz pro správnou e-mailovou adresu */ 
    27     private static String REGULARNI_EMAIL = "^[_a-zA-Z0-9\\.\\-]+@[_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4}$"; 
    28      
    29     private Nastaveni nastaveni; 
    30  
    31     public Postak(Nastaveni nastaveni) { 
    32         this.nastaveni = nastaveni; 
    33     } 
    34  
    35     public void setNastaveni(Nastaveni nastaveni) { 
    36         this.nastaveni = nastaveni; 
    37     } 
    38  
    39     /**  
    40      * Nízkoúrovňová odesílací metoda, která už nekontroluje limit příjemců. 
    41      * Pokud se nevejdou do limitu SMTP serveru, vyhazuje výjimku. 
    42      *  
    43      * TODO: lepší to bude nestaické - nastavení si vyžádat v konstruktoru 
    44      */ 
    45     private void odesliSMTP(HromadnaZprava zprava) throws MessagingException { 
    46  
    47         if (zkontrolujZpravu(zprava) && zkontrolujNastaveni(nastaveni)) { 
    48  
    49             /** Inicializace SMTP */ 
    50             Properties smtpVlastnosti = System.getProperties(); 
    51             smtpVlastnosti.put("mail.smtp.host", nastaveni.getPostovniServer()); 
    52             smtpVlastnosti.put("mail.smtp.port", String.valueOf(nastaveni.getPostovniPort())); 
    53  
    54             if (nastaveni.getPostovniPort() == 465) { 
    55                 if (new File(nastaveni.getCestaKCertifikatum()).exists()) { 
    56                     System.setProperty("javax.net.ssl.trustStore", nastaveni.getCestaKCertifikatum()); 
    57                     log.log(Level.INFO, "Používám vlastní důvěryhodné certifikáty: {0}", nastaveni.getCestaKCertifikatum()); 
    58                 } 
    59                 /** TODO: neřídit se číslem portu, ale přidat příznak pro šifrování */ 
    60                 smtpVlastnosti.put("mail.smtp.starttls.enable", "true"); 
    61                 smtpVlastnosti.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    62                 smtpVlastnosti.put("mail.smtp.socketFactory.port", String.valueOf(nastaveni.getPostovniPort())); 
    63                 smtpVlastnosti.put("mail.smtp.socketFactory.fallback", "false"); 
    64             /** 
    65              * NAHRÁNÍ CERTIFIKÁTU: 
    66              * 1) stáhneme si certifikát (---BEGIN CERTIFICATE---) a uložíme do vse_ca.cer              
    67              * 2) keytool -importcert -file vse_ca.cer -keystore DuveryhodneCertifikaty.keystore -storepass "changeit" 
    68              * Pokud daný soubor existuje, program ho používá, pokud ne, používá certifikáty uložené v systému (Javovské). 
    69              */ 
    70             } 
    71  
    72             PostakuvHeslovnik heslovnik = new PostakuvHeslovnik(); 
    73             if (nastaveni.getPostovniJmeno() != null && nastaveni.getPostovniJmeno().length() > 0) { 
    74                 heslovnik.setJmenoHeslo(nastaveni.getPostovniJmeno(), nastaveni.getPostovniHeslo()); 
    75                 smtpVlastnosti.put("mail.smtp.auth", "true"); 
    76                 log.log(Level.FINEST, "Používám pro SMTP jméno a heslo"); 
    77             } 
    78  
    79             Session smtpRelace = Session.getInstance(smtpVlastnosti, heslovnik); 
    80  
    81             smtpRelace.setDebug(true); 
    82             smtpRelace.setDebugOut(System.out); 
    83  
    84             /** Sestavení zprávy */ 
    85             MimeMessage mimeZprava = new MimeMessage(smtpRelace); 
    86             mimeZprava.setFrom(zprava.getOdesilatel()); 
    87             if (zprava.getOdpovedetKomu() != null) { 
    88                 Address[] odpovedetKomu = {zprava.getOdpovedetKomu()}; 
    89                 mimeZprava.setReplyTo(odpovedetKomu); 
    90             } 
    91             naplnPrijemce(mimeZprava, zprava); 
    92             mimeZprava.setSubject(zprava.getPredmet()); 
    93             mimeZprava.setHeader("User-Agent", "https://frantovo.cz/projekty/SuperPostak/"); 
    94             mimeZprava.setHeader("Precedence", "bulk"); 
    95             if (zprava.isFormatHTML()) { 
    96                 mimeZprava.setText(zprava.getText(), "UTF-8", "html"); 
    97             } else { 
    98                 mimeZprava.setText(zprava.getText(), "UTF-8"); 
    99             } 
    100  
    101             /** Vlastní odeslání */ 
    102             Transport.send(mimeZprava); 
    103  
    104         } else { 
    105             MessagingException e = new MessagingException("Zpráva nebo nastavení jsou nevyhovující"); 
    106             log.log(Level.SEVERE, null, e); 
    107             throw e; 
    108         } 
    109  
    110     } 
    111  
    112     /** 
    113      * Nastaví zprávě (MimeMessage) všechny příjemce, které najde ve zprávě a nastavení. 
    114      * Respektuje typy příjemců: komu, kopie, skrytá kopie.     
    115      */ 
    116     private static void naplnPrijemce(MimeMessage mimeZprava, HromadnaZprava zprava) throws MessagingException { 
    117         /**  
    118          * Příjemci se budou definovat pouze ve zprávě. 
    119          * Z nastavení se brát nebudou (výchozí příjemci už ve zprávě budou). 
    120          */ 
    121         ArrayList<InternetAddressKomu> prijemci = zprava.getPrijemci(); 
    122         for (InternetAddressKomu komu : prijemci) { 
    123             if (zkontrolujAdresu(komu)) { 
    124                 mimeZprava.addRecipient(komu.getTyp(), komu); 
    125             } 
    126         } 
    127     } 
    128  
    129     /** Vypíše do logu seznam příjemců */ 
    130     public static void vypisPrijemce(Collection<InternetAddressKomu> prijemci) { 
    131         for (InternetAddressKomu p : prijemci) { 
    132             log.log(Level.INFO, p.toString()); 
    133         } 
    134     } 
    135  
    136     /** Veřejná odesílací metoda. 
    137      * Postará se o rozdělení zpráv na dílčí (které se vejdou do limitu příjemců) 
    138      */ 
    139     public void odesli(HromadnaZprava zprava) throws MessagingException { 
    140         Collection<HromadnaZprava> zpravy = zprava.getDilciZpravy(nastaveni.getLimitZprav()); 
    141  
    142         for (HromadnaZprava dilciZprava : zpravy) { 
    143             odesliSMTP(dilciZprava); 
    144         } 
    145     } 
    146  
    147     private static boolean zkontrolujAdresu(InternetAddressKomu a) { 
    148         if (a.getTyp() == null) { 
    149             log.log(Level.WARNING, "Neplatná adresa (typ): {0}", a.getAddress()); 
    150             return false; 
    151         } 
    152  
    153         if (a.getAddress() == null || a.getAddress().length() < 1) { 
    154             log.log(Level.WARNING, "Neplatná adresa (address): {0}", a.getPersonal()); 
    155             return false; 
    156         } 
    157  
    158         if (!zkontrolujAdresu(a.getAddress())) { 
    159             log.log(Level.WARNING, "Adresa nevyhovuje regulárnímu výrazu: {0}", a.getAddress()); 
    160             return false; 
    161         } 
    162  
    163         return true; 
    164     } 
    165  
    166     /** Zkontroluje e-mailovou adresu pomocí regulárního výrazu. */ 
    167     public static boolean zkontrolujAdresu(String adresa) { 
    168         return adresa != null && Pattern.matches(REGULARNI_EMAIL, adresa); 
    169     } 
    170  
    171     /** @return  Vrací true, pokud je zpráva v pořádku */ 
    172     private static boolean zkontrolujZpravu(HromadnaZprava z) { 
    173  
    174         if (z.getPrijemci() == null) { 
    175             log.log(Level.WARNING, "getPrijemci() == null"); 
    176             return false; 
    177         } 
    178  
    179         if (z.getPrijemci().size() < 1) { 
    180             log.log(Level.WARNING, "getPrijemci().size() < 1"); 
    181             return false; 
    182         } 
    183  
    184         if (z.getOdesilatel() == null) { 
    185             log.log(Level.WARNING, "getOdesilatel() == null"); 
    186             return false; 
    187         } 
    188  
    189         if (z.getPredmet() == null) { 
    190             log.log(Level.WARNING, "getPredmet() == null"); 
    191             return false; 
    192         } 
    193  
    194         return true; 
    195     } 
    196  
    197     private static boolean zkontrolujNastaveni(Nastaveni n) { 
    198  
    199         if (n.getPostovniServer() == null || n.getPostovniServer().length() < 1) { 
    200             return false; 
    201         } 
    202  
    203         return true; 
    204     } 
    205  
    206     /** Slouží k uložení jména a hesla pro SMTP */ 
    207     private static class PostakuvHeslovnik extends Authenticator { 
    208  
    209         private String jmeno = "user"; 
    210         private char[] heslo = "luser".toCharArray(); 
    211  
    212         @Override 
    213         public PasswordAuthentication getPasswordAuthentication() { 
    214             return new PasswordAuthentication(jmeno, String.valueOf(heslo)); 
    215         } 
    216  
    217         public void setJmenoHeslo(String jmeno, char[] heslo) { 
    218             this.jmeno = jmeno; 
    219             this.heslo = heslo; 
    220         } 
    221     } 
     31public class Postak { 
     32 
     33        private static final String KÓDOVÁNÍ = "UTF-8"; 
     34        private static final Logger log = Logger.getLogger(Postak.class.getName()); 
     35        /** Regulární výraz pro správnou e-mailovou adresu */ 
     36        private static String REGULARNI_EMAIL = "^[_a-zA-Z0-9\\.\\-]+@[_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4}$"; 
     37        private Nastaveni nastaveni; 
     38        private TransformerFactory transformerFactory; 
     39 
     40        public Postak(Nastaveni nastaveni) { 
     41                this.nastaveni = nastaveni; 
     42                transformerFactory = TransformerFactory.newInstance(); 
     43        } 
     44 
     45        public void setNastaveni(Nastaveni nastaveni) { 
     46                this.nastaveni = nastaveni; 
     47        } 
     48 
     49        /** 
     50         * Nízkoúrovňová odesílací metoda, která už nekontroluje limit příjemců. 
     51         * Pokud se nevejdou do limitu SMTP serveru, vyhazuje výjimku. 
     52         * 
     53         * TODO: lepší to bude nestaické - nastavení si vyžádat v konstruktoru 
     54         */ 
     55        private void odesliSMTP(HromadnaZprava zprava) throws MessagingException { 
     56 
     57                if (zkontrolujZpravu(zprava) && zkontrolujNastaveni(nastaveni)) { 
     58 
     59                        /** Inicializace SMTP */ 
     60                        Properties smtpVlastnosti = System.getProperties(); 
     61                        smtpVlastnosti.put("mail.smtp.host", nastaveni.getPostovniServer()); 
     62                        smtpVlastnosti.put("mail.smtp.port", String.valueOf(nastaveni.getPostovniPort())); 
     63 
     64                        if (nastaveni.getPostovniPort() == 465) { 
     65                                if (new File(nastaveni.getCestaKCertifikatum()).exists()) { 
     66                                        System.setProperty("javax.net.ssl.trustStore", nastaveni.getCestaKCertifikatum()); 
     67                                        log.log(Level.INFO, "Používám vlastní důvěryhodné certifikáty: {0}", nastaveni.getCestaKCertifikatum()); 
     68                                } 
     69                                /** TODO: neřídit se číslem portu, ale přidat příznak pro šifrování */ 
     70                                smtpVlastnosti.put("mail.smtp.starttls.enable", "true"); 
     71                                smtpVlastnosti.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     72                                smtpVlastnosti.put("mail.smtp.socketFactory.port", String.valueOf(nastaveni.getPostovniPort())); 
     73                                smtpVlastnosti.put("mail.smtp.socketFactory.fallback", "false"); 
     74                                /** 
     75                                 * NAHRÁNÍ CERTIFIKÁTU: 
     76                                 * 1) stáhneme si certifikát (---BEGIN CERTIFICATE---) a uložíme do vse_ca.cer 
     77                                 * 2) keytool -importcert -file vse_ca.cer -keystore DuveryhodneCertifikaty.keystore 
     78                                 * -storepass "changeit" 
     79                                 * Pokud daný soubor existuje, program ho používá, pokud ne, používá certifikáty 
     80                                 * uložené v systému (Javovské). 
     81                                 */ 
     82                        } 
     83 
     84                        PostakuvHeslovnik heslovnik = new PostakuvHeslovnik(); 
     85                        if (nastaveni.getPostovniJmeno() != null && nastaveni.getPostovniJmeno().length() > 0) { 
     86                                heslovnik.setJmenoHeslo(nastaveni.getPostovniJmeno(), nastaveni.getPostovniHeslo()); 
     87                                smtpVlastnosti.put("mail.smtp.auth", "true"); 
     88                                log.log(Level.FINEST, "Používám pro SMTP jméno a heslo"); 
     89                        } 
     90 
     91                        Session smtpRelace = Session.getInstance(smtpVlastnosti, heslovnik); 
     92 
     93                        smtpRelace.setDebug(true); 
     94                        smtpRelace.setDebugOut(System.out); 
     95 
     96                        /** Sestavení zprávy */ 
     97                        MimeMessage mimeZprava = new MimeMessage(smtpRelace); 
     98                        mimeZprava.setFrom(zprava.getOdesilatel()); 
     99                        if (zprava.getOdpovedetKomu() != null) { 
     100                                Address[] odpovedetKomu = {zprava.getOdpovedetKomu()}; 
     101                                mimeZprava.setReplyTo(odpovedetKomu); 
     102                        } 
     103                        naplnPrijemce(mimeZprava, zprava); 
     104                        mimeZprava.setSubject(zprava.getPredmet()); 
     105                        mimeZprava.setHeader("User-Agent", "https://frantovo.cz/projekty/SuperPostak/"); 
     106                        mimeZprava.setHeader("Precedence", "bulk"); 
     107 
     108                        switch (zprava.getFormát()) { 
     109                                case PROSTÝ_TEXT: 
     110                                        mimeZprava.setText(zprava.getText(), KÓDOVÁNÍ); 
     111                                        break; 
     112                                case XHTML: 
     113                                        mimeZprava.setText(zprava.getText(), KÓDOVÁNÍ, "html"); 
     114                                        break; 
     115                                case OBOJE: 
     116                                        MimeMultipart multipart = new MimeMultipart("alternative"); 
     117                                        mimeZprava.setContent(multipart); 
     118 
     119                                        MimeBodyPart textováČást = new MimeBodyPart(); 
     120                                        MimeBodyPart xhtmlČást = new MimeBodyPart(); 
     121 
     122                                        textováČást.setText(xhtmlNaProstýText(zprava.getText()), KÓDOVÁNÍ); 
     123                                        xhtmlČást.setContent(zprava.getText(), "text/html; charset=" + KÓDOVÁNÍ); 
     124 
     125                                        multipart.addBodyPart(textováČást); 
     126                                        multipart.addBodyPart(xhtmlČást); 
     127                                        break; 
     128                        } 
     129 
     130                        /** Vlastní odeslání */ 
     131                        Transport.send(mimeZprava); 
     132 
     133                } else { 
     134                        MessagingException e = new MessagingException("Zpráva nebo nastavení jsou nevyhovující"); 
     135                        log.log(Level.SEVERE, null, e); 
     136                        throw e; 
     137                } 
     138 
     139        } 
     140 
     141        private String xhtmlNaProstýText(String xhtml) throws MessagingException { 
     142                try { 
     143                        Transformer textTransformer = transformerFactory.newTransformer(new StreamSource(getClass().getClassLoader().getResourceAsStream("cz/frantovo/postak/odchozíEmailText.xsl"))); 
     144 
     145                        StringReader input = new StringReader(xhtml); 
     146                        StringWriter output = new StringWriter(xhtml.length()); 
     147                        textTransformer.transform(new StreamSource(input), new StreamResult(output)); 
     148 
     149                        return output.toString(); 
     150                } catch (Exception e) { 
     151                        throw new MessagingException("Chyba při XSL transformaci zprávy na prostý text.", e); 
     152                } 
     153        } 
     154 
     155        /** 
     156         * Nastaví zprávě (MimeMessage) všechny příjemce, které najde ve zprávě a nastavení. 
     157         * Respektuje typy příjemců: komu, kopie, skrytá kopie. 
     158         */ 
     159        private static void naplnPrijemce(MimeMessage mimeZprava, HromadnaZprava zprava) throws MessagingException { 
     160                /** 
     161                 * Příjemci se budou definovat pouze ve zprávě. 
     162                 * Z nastavení se brát nebudou (výchozí příjemci už ve zprávě budou). 
     163                 */ 
     164                ArrayList<InternetAddressKomu> prijemci = zprava.getPrijemci(); 
     165                for (InternetAddressKomu komu : prijemci) { 
     166                        if (zkontrolujAdresu(komu)) { 
     167                                mimeZprava.addRecipient(komu.getTyp(), komu); 
     168                        } 
     169                } 
     170        } 
     171 
     172        /** Vypíše do logu seznam příjemců */ 
     173        public static void vypisPrijemce(Collection<InternetAddressKomu> prijemci) { 
     174                for (InternetAddressKomu p : prijemci) { 
     175                        log.log(Level.INFO, p.toString()); 
     176                } 
     177        } 
     178 
     179        /** Veřejná odesílací metoda. 
     180         * Postará se o rozdělení zpráv na dílčí (které se vejdou do limitu příjemců) 
     181         */ 
     182        public void odesli(HromadnaZprava zprava) throws MessagingException { 
     183                Collection<HromadnaZprava> zpravy = zprava.getDilciZpravy(nastaveni.getLimitZprav()); 
     184 
     185                for (HromadnaZprava dilciZprava : zpravy) { 
     186                        odesliSMTP(dilciZprava); 
     187                } 
     188        } 
     189 
     190        private static boolean zkontrolujAdresu(InternetAddressKomu a) { 
     191                if (a.getTyp() == null) { 
     192                        log.log(Level.WARNING, "Neplatná adresa (typ): {0}", a.getAddress()); 
     193                        return false; 
     194                } 
     195 
     196                if (a.getAddress() == null || a.getAddress().length() < 1) { 
     197                        log.log(Level.WARNING, "Neplatná adresa (address): {0}", a.getPersonal()); 
     198                        return false; 
     199                } 
     200 
     201                if (!zkontrolujAdresu(a.getAddress())) { 
     202                        log.log(Level.WARNING, "Adresa nevyhovuje regulárnímu výrazu: {0}", a.getAddress()); 
     203                        return false; 
     204                } 
     205 
     206                return true; 
     207        } 
     208 
     209        /** Zkontroluje e-mailovou adresu pomocí regulárního výrazu. */ 
     210        public static boolean zkontrolujAdresu(String adresa) { 
     211                return adresa != null && Pattern.matches(REGULARNI_EMAIL, adresa); 
     212        } 
     213 
     214        /** @return Vrací true, pokud je zpráva v pořádku */ 
     215        private static boolean zkontrolujZpravu(HromadnaZprava z) { 
     216 
     217                if (z.getPrijemci() == null) { 
     218                        log.log(Level.WARNING, "getPrijemci() == null"); 
     219                        return false; 
     220                } 
     221 
     222                if (z.getPrijemci().size() < 1) { 
     223                        log.log(Level.WARNING, "getPrijemci().size() < 1"); 
     224                        return false; 
     225                } 
     226 
     227                if (z.getOdesilatel() == null) { 
     228                        log.log(Level.WARNING, "getOdesilatel() == null"); 
     229                        return false; 
     230                } 
     231 
     232                if (z.getPredmet() == null) { 
     233                        log.log(Level.WARNING, "getPredmet() == null"); 
     234                        return false; 
     235                } 
     236 
     237                return true; 
     238        } 
     239 
     240        private static boolean zkontrolujNastaveni(Nastaveni n) { 
     241 
     242                if (n.getPostovniServer() == null || n.getPostovniServer().length() < 1) { 
     243                        return false; 
     244                } 
     245 
     246                return true; 
     247        } 
     248 
     249        /** Slouží k uložení jména a hesla pro SMTP */ 
     250        private static class PostakuvHeslovnik extends Authenticator { 
     251 
     252                private String jmeno = "user"; 
     253                private char[] heslo = "luser".toCharArray(); 
     254 
     255                @Override 
     256                public PasswordAuthentication getPasswordAuthentication() { 
     257                        return new PasswordAuthentication(jmeno, String.valueOf(heslo)); 
     258                } 
     259 
     260                public void setJmenoHeslo(String jmeno, char[] heslo) { 
     261                        this.jmeno = jmeno; 
     262                        this.heslo = heslo; 
     263                } 
     264        } 
    222265} 
  • java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form

    r14 r17  
    511511              <Group type="102" alignment="1" attributes="0"> 
    512512                  <EmptySpace max="-2" attributes="0"/> 
    513                   <Group type="103" groupAlignment="1" attributes="0"> 
    514                       <Component id="jScrollPane1" alignment="0" pref="438" max="32767" attributes="0"/> 
     513                  <Group type="103" groupAlignment="0" attributes="0"> 
     514                      <Component id="jScrollPane1" alignment="0" pref="461" max="32767" attributes="0"/> 
    515515                      <Group type="102" alignment="1" attributes="0"> 
    516516                          <Group type="103" groupAlignment="1" attributes="0"> 
     
    528528                          </Group> 
    529529                          <Group type="103" groupAlignment="0" attributes="0"> 
    530                               <Component id="vstupJmenoOdesilatele" alignment="0" pref="328" max="32767" attributes="0"/> 
    531                               <Component id="vstupAdresaOdesilatele" alignment="0" pref="328" max="32767" attributes="0"/> 
    532                               <Component id="vstupPredmet" alignment="0" pref="328" max="32767" attributes="0"/> 
     530                              <Component id="vstupJmenoOdesilatele" alignment="0" max="32767" attributes="0"/> 
     531                              <Component id="vstupAdresaOdesilatele" alignment="0" max="32767" attributes="0"/> 
     532                              <Component id="vstupPredmet" alignment="0" max="32767" attributes="0"/> 
    533533                          </Group> 
    534534                      </Group> 
    535535                      <Group type="102" alignment="0" attributes="0"> 
    536536                          <Component id="jLabel15" min="-2" max="-2" attributes="0"/> 
    537                           <EmptySpace min="-2" pref="33" max="-2" attributes="0"/> 
    538                           <Component id="vstupFormatHTML" pref="81" max="32767" attributes="0"/> 
    539                           <EmptySpace min="-2" pref="247" max="-2" attributes="0"/> 
     537                          <EmptySpace max="-2" attributes="0"/> 
     538                          <Component id="formátProstý" min="-2" max="-2" attributes="0"/> 
     539                          <EmptySpace max="-2" attributes="0"/> 
     540                          <Component id="formátXHTML" min="-2" max="-2" attributes="0"/> 
     541                          <EmptySpace max="-2" attributes="0"/> 
     542                          <Component id="formátOboje" min="-2" max="-2" attributes="0"/> 
     543                          <EmptySpace min="0" pref="0" max="32767" attributes="0"/> 
    540544                      </Group> 
    541545                  </Group> 
     
    567571                  <Group type="103" groupAlignment="3" attributes="0"> 
    568572                      <Component id="jLabel15" alignment="3" min="-2" max="-2" attributes="0"/> 
    569                       <Component id="vstupFormatHTML" alignment="3" min="-2" max="-2" attributes="0"/> 
     573                      <Component id="formátProstý" alignment="3" min="-2" max="-2" attributes="0"/> 
     574                      <Component id="formátXHTML" alignment="3" min="-2" max="-2" attributes="0"/> 
     575                      <Component id="formátOboje" alignment="3" min="-2" max="-2" attributes="0"/> 
    570576                  </Group> 
    571577                  <EmptySpace max="-2" attributes="0"/> 
     
    615621          <Properties> 
    616622            <Property name="text" type="java.lang.String" value="Form&#xe1;t zpr&#xe1;vy"/> 
    617           </Properties> 
    618         </Component> 
    619         <Component class="javax.swing.JCheckBox" name="vstupFormatHTML"> 
    620           <Properties> 
    621             <Property name="mnemonic" type="int" value="104"/> 
    622             <Property name="text" type="java.lang.String" value="HTML"/> 
    623             <Property name="toolTipText" type="java.lang.String" value="P&#x159;i neza&#x161;krtnut&#xed; se ode&#x161;le jako prost&#xfd; text"/> 
    624623          </Properties> 
    625624        </Component> 
     
    641640          <Events> 
    642641            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="odpovedetKomuOdkazActionPerformed"/> 
     642          </Events> 
     643        </Component> 
     644        <Component class="javax.swing.JRadioButton" name="form&#xe1;tProst&#xfd;"> 
     645          <Properties> 
     646            <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 
     647              <ComponentRef name="form&#xe1;tSkupina"/> 
     648            </Property> 
     649            <Property name="selected" type="boolean" value="true"/> 
     650            <Property name="text" type="java.lang.String" value="Prost&#xfd; text"/> 
     651          </Properties> 
     652        </Component> 
     653        <Component class="javax.swing.JRadioButton" name="form&#xe1;tXHTML"> 
     654          <Properties> 
     655            <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 
     656              <ComponentRef name="form&#xe1;tSkupina"/> 
     657            </Property> 
     658            <Property name="text" type="java.lang.String" value="(X)HTML"/> 
     659          </Properties> 
     660          <Events> 
     661            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="form&#xe1;tXHTMLActionPerformed"/> 
     662          </Events> 
     663        </Component> 
     664        <Component class="javax.swing.JRadioButton" name="form&#xe1;tOboje"> 
     665          <Properties> 
     666            <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 
     667              <ComponentRef name="form&#xe1;tSkupina"/> 
     668            </Property> 
     669            <Property name="text" type="java.lang.String" value="Oboje"/> 
     670          </Properties> 
     671          <Events> 
     672            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="form&#xe1;tObojeActionPerformed"/> 
    643673          </Events> 
    644674        </Component> 
     
    727757      </SubComponents> 
    728758    </Container> 
     759    <Component class="javax.swing.ButtonGroup" name="form&#xe1;tSkupina"> 
     760    </Component> 
    729761  </NonVisualComponents> 
    730762  <Properties> 
  • java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java

    r15 r17  
    1010import java.awt.Dialog.ModalityType; 
    1111import java.awt.KeyboardFocusManager; 
     12import java.awt.event.ActionListener; 
     13import java.awt.event.ItemListener; 
    1214import java.beans.XMLDecoder; 
    1315import java.beans.XMLEncoder; 
     
    2931import javax.mail.MessagingException; 
    3032import javax.mail.internet.InternetAddress; 
    31 import javax.swing.JComponent; 
    32 import javax.swing.JDialog; 
    33 import javax.swing.JOptionPane; 
    34 import javax.swing.JTextArea; 
    35 import javax.swing.UIManager; 
    36 import javax.swing.UnsupportedLookAndFeelException; 
     33import javax.swing.*; 
     34import javax.swing.event.ChangeListener; 
    3735import org.jdesktop.swingx.JXErrorPane; 
    3836import org.jdesktop.swingx.JXTaskPaneContainer; 
     
    4139/** 
    4240 * 
    43  * @author  fiki 
     41 * @author fiki 
    4442 */ 
    4543public class SuperPostak extends javax.swing.JFrame { 
     
    5755        /** 
    5856         * Creates new form SuperPostak 
     57         * 
    5958         * @param ladit předvyplní testovací hodnoty - zprávu 
    6059         * @param exit při zavření okna ukončí program 
     
    351350        vstupZprava = new javax.swing.JTextArea(); 
    352351        jLabel15 = new javax.swing.JLabel(); 
    353         vstupFormatHTML = new javax.swing.JCheckBox(); 
    354352        odpovedetKomuOdkaz = new org.jdesktop.swingx.JXHyperlink(); 
     353        formátProstý = new javax.swing.JRadioButton(); 
     354        formátXHTML = new javax.swing.JRadioButton(); 
     355        formátOboje = new javax.swing.JRadioButton(); 
    355356        odpovedetKomuDialog = new javax.swing.JDialog(); 
    356357        jLabel18 = new javax.swing.JLabel(); 
     
    360361        odpovedetKomuAdresa = new javax.swing.JTextField(); 
    361362        odpovedetKomuHotovo = new javax.swing.JButton(); 
     363        formátSkupina = new javax.swing.ButtonGroup(); 
    362364        jXHeader1 = new org.jdesktop.swingx.JXHeader(); 
    363365        taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer(); 
     
    701703        jLabel15.setText("Formát zprávy"); 
    702704 
    703         vstupFormatHTML.setMnemonic('h'); 
    704         vstupFormatHTML.setText("HTML"); 
    705         vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text"); 
    706  
    707705        odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText")); 
    708706        odpovedetKomuOdkaz.setMnemonic('e'); 
     
    717715        }); 
    718716 
     717        formátSkupina.add(formátProstý); 
     718        formátProstý.setSelected(true); 
     719        formátProstý.setText("Prostý text"); 
     720 
     721        formátSkupina.add(formátXHTML); 
     722        formátXHTML.setText("(X)HTML"); 
     723        formátXHTML.addActionListener(new java.awt.event.ActionListener() { 
     724            public void actionPerformed(java.awt.event.ActionEvent evt) { 
     725                formátXHTMLActionPerformed(evt); 
     726            } 
     727        }); 
     728 
     729        formátSkupina.add(formátOboje); 
     730        formátOboje.setText("Oboje"); 
     731        formátOboje.addActionListener(new java.awt.event.ActionListener() { 
     732            public void actionPerformed(java.awt.event.ActionEvent evt) { 
     733                formátObojeActionPerformed(evt); 
     734            } 
     735        }); 
     736 
    719737        javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava); 
    720738        panelZprava.setLayout(panelZpravaLayout); 
     
    723741            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() 
    724742                .addContainerGap() 
    725                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
    726                     .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE) 
    727                     .addGroup(panelZpravaLayout.createSequentialGroup() 
     743                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     744                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE) 
     745                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() 
    728746                        .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
    729747                            .addGroup(panelZpravaLayout.createSequentialGroup() 
     
    736754                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) 
    737755                        .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
    738                             .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) 
    739                             .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) 
    740                             .addComponent(vstupPredmet, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE))) 
    741                     .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelZpravaLayout.createSequentialGroup() 
     756                            .addComponent(vstupJmenoOdesilatele) 
     757                            .addComponent(vstupAdresaOdesilatele) 
     758                            .addComponent(vstupPredmet))) 
     759                    .addGroup(panelZpravaLayout.createSequentialGroup() 
    742760                        .addComponent(jLabel15) 
    743                         .addGap(33, 33, 33) 
    744                         .addComponent(vstupFormatHTML, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE) 
    745                         .addGap(247, 247, 247))) 
     761                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
     762                        .addComponent(formátProstý) 
     763                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
     764                        .addComponent(formátXHTML) 
     765                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
     766                        .addComponent(formátOboje) 
     767                        .addGap(0, 0, Short.MAX_VALUE))) 
    746768                .addContainerGap()) 
    747769        ); 
     
    766788                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
    767789                    .addComponent(jLabel15) 
    768                     .addComponent(vstupFormatHTML)) 
     790                    .addComponent(formátProstý) 
     791                    .addComponent(formátXHTML) 
     792                    .addComponent(formátOboje)) 
    769793                .addContainerGap()) 
    770794        ); 
     
    817841                    .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
    818842                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
    819                 .addComponent(jLabel17) 
     843                .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
    820844                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    821845                .addComponent(odpovedetKomuHotovo) 
     
    967991                zprava.setPredmet(vstupPredmet.getText()); 
    968992                zprava.setText(vstupZprava.getText()); 
    969                 zprava.setFormatHTML(vstupFormatHTML.isSelected()); 
     993 
     994                if (formátProstý.isSelected()) { 
     995                        zprava.setFormatHTML(HromadnaZprava.FORMÁT.PROSTÝ_TEXT); 
     996                } else if (formátXHTML.isSelected()) { 
     997                        zprava.setFormatHTML(HromadnaZprava.FORMÁT.XHTML); 
     998                } else if (formátOboje.isSelected()) { 
     999                        zprava.setFormatHTML(HromadnaZprava.FORMÁT.OBOJE); 
     1000                } else { 
     1001                        log.severe("Není zvolen formát zprávy → nastavuji: prostý text."); 
     1002                        zprava.setFormatHTML(HromadnaZprava.FORMÁT.PROSTÝ_TEXT); 
     1003                } 
    9701004 
    9711005                if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) { 
     
    11031137}//GEN-LAST:event_odpovedetKomuHotovoActionPerformed 
    11041138 
     1139        private void formátXHTMLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_formátXHTMLActionPerformed 
     1140                nastavVýchozíXHTML(); 
     1141        }//GEN-LAST:event_formátXHTMLActionPerformed 
     1142 
     1143        private void formátObojeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_formátObojeActionPerformed 
     1144                nastavVýchozíXHTML(); 
     1145        }//GEN-LAST:event_formátObojeActionPerformed 
     1146 
     1147        /** 
     1148         * Pokud ještě není vyplněn žádný text, vložíme šablonu. 
     1149         */ 
     1150        private void nastavVýchozíXHTML() { 
     1151                if (vstupZprava.getText().isEmpty()) { 
     1152                        vstupZprava.setText("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" 
     1153                                        + "<body>\n\n" 
     1154                                        + "<p></p>\n" 
     1155                                        + "<div class=\"patička\"></div>\n\n" 
     1156                                        + "</body>\n" 
     1157                                        + "</html>"); 
     1158                } 
     1159        } 
     1160 
    11051161        /** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */ 
    11061162        private Collection<InternetAddressKomu> getPrijemciSQL() throws SQLException, UnsupportedEncodingException { 
     
    11841240        } 
    11851241    // Variables declaration - do not modify//GEN-BEGIN:variables 
     1242    private javax.swing.JRadioButton formátOboje; 
     1243    private javax.swing.JRadioButton formátProstý; 
     1244    private javax.swing.ButtonGroup formátSkupina; 
     1245    private javax.swing.JRadioButton formátXHTML; 
    11861246    private javax.swing.JLabel jLabel1; 
    11871247    private javax.swing.JLabel jLabel10; 
     
    12401300    private javax.swing.JTextField vstupDBjmeno; 
    12411301    private javax.swing.JTextField vstupDatabaze; 
    1242     private javax.swing.JCheckBox vstupFormatHTML; 
    12431302    private javax.swing.JTextField vstupJmenoOdesilatele; 
    12441303    private javax.swing.JTextField vstupPredmet;