Changeset 17:9cb46ca7e26c
- Timestamp:
- 04/23/12 00:24:31 (13 years ago)
- Branch:
- default
- Tags:
- v1.1
- Location:
- java
- Files:
-
- 1 added
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
java/Postak/src/cz/frantovo/postak/HromadnaZprava.java
r13 r17 10 10 * Hromadná zpráva. Umí se rozdělit i na více dílčích zpráv, 11 11 * které se vejdou do limitu příjemců SMTP serveru. 12 * 12 13 * @author fiki 13 14 */ 14 15 public class HromadnaZprava implements Cloneable { 15 16 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 { 29 18 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; 33 36 34 public void setPredmet(String predmet) {35 this.predmet =predmet;36 37 public String getPredmet() { 38 return predmet; 39 } 37 40 38 public InternetAddress getOdesilatel() {39 return odesilatel;40 41 public void setPredmet(String predmet) { 42 this.predmet = predmet; 43 } 41 44 42 public void setOdesilatel(InternetAddress odesilatel) {43 this.odesilatel =odesilatel;44 45 public InternetAddress getOdesilatel() { 46 return odesilatel; 47 } 45 48 46 public String getText() {47 return text;48 49 public void setOdesilatel(InternetAddress odesilatel) { 50 this.odesilatel = odesilatel; 51 } 49 52 50 public void setText(String text) {51 this.text =text;52 53 public String getText() { 54 return text; 55 } 53 56 54 public ArrayList<InternetAddressKomu> getPrijemci() {55 return prijemci;56 57 public void setText(String text) { 58 this.text = text; 59 } 57 60 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 } 65 64 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 } 73 72 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 } 81 80 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>(); 87 89 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); 91 95 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); 98 99 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 } 107 115 108 116 109 110 111 112 113 114 115 116 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 } 118 126 119 120 127 return zpravy; 128 } 121 129 122 public boolean isFormatHTML() {123 return formatHTML;124 130 public FORMÁT getFormát() { 131 return formát; 132 } 125 133 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 } 129 137 130 131 132 138 public InternetAddress getOdpovedetKomu() { 139 return odpovedetKomu; 140 } 133 141 134 135 136 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 } 138 146 } -
java/Postak/src/cz/frantovo/postak/Postak.java
r11 r17 2 2 3 3 import java.io.File; 4 import java.io.StringReader; 5 import java.io.StringWriter; 4 6 import java.util.ArrayList; 5 7 import java.util.Collection; … … 14 16 import javax.mail.Session; 15 17 import javax.mail.Transport; 18 import javax.mail.internet.MimeBodyPart; 16 19 import javax.mail.internet.MimeMessage; 20 import javax.mail.internet.MimeMultipart; 21 import javax.xml.transform.Transformer; 22 import javax.xml.transform.TransformerFactory; 23 import javax.xml.transform.stream.StreamResult; 24 import javax.xml.transform.stream.StreamSource; 17 25 18 26 /** 19 27 * Odešle hromadnou zprávu pomocí SMTP. 20 * 28 * 21 29 * @author fiki 22 30 */ 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 } 31 public 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 } 222 265 } -
java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form
r14 r17 511 511 <Group type="102" alignment="1" attributes="0"> 512 512 <EmptySpace max="-2" attributes="0"/> 513 <Group type="103" groupAlignment=" 1" attributes="0">514 <Component id="jScrollPane1" alignment="0" pref="4 38" max="32767" attributes="0"/>513 <Group type="103" groupAlignment="0" attributes="0"> 514 <Component id="jScrollPane1" alignment="0" pref="461" max="32767" attributes="0"/> 515 515 <Group type="102" alignment="1" attributes="0"> 516 516 <Group type="103" groupAlignment="1" attributes="0"> … … 528 528 </Group> 529 529 <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"/> 533 533 </Group> 534 534 </Group> 535 535 <Group type="102" alignment="0" attributes="0"> 536 536 <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"/> 540 544 </Group> 541 545 </Group> … … 567 571 <Group type="103" groupAlignment="3" attributes="0"> 568 572 <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"/> 570 576 </Group> 571 577 <EmptySpace max="-2" attributes="0"/> … … 615 621 <Properties> 616 622 <Property name="text" type="java.lang.String" value="Formát zprá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ři nezaškrtnutí se odešle jako prostý text"/>624 623 </Properties> 625 624 </Component> … … 641 640 <Events> 642 641 <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átProstý"> 645 <Properties> 646 <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 647 <ComponentRef name="formátSkupina"/> 648 </Property> 649 <Property name="selected" type="boolean" value="true"/> 650 <Property name="text" type="java.lang.String" value="Prostý text"/> 651 </Properties> 652 </Component> 653 <Component class="javax.swing.JRadioButton" name="formátXHTML"> 654 <Properties> 655 <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 656 <ComponentRef name="formá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átXHTMLActionPerformed"/> 662 </Events> 663 </Component> 664 <Component class="javax.swing.JRadioButton" name="formátOboje"> 665 <Properties> 666 <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> 667 <ComponentRef name="formá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átObojeActionPerformed"/> 643 673 </Events> 644 674 </Component> … … 727 757 </SubComponents> 728 758 </Container> 759 <Component class="javax.swing.ButtonGroup" name="formátSkupina"> 760 </Component> 729 761 </NonVisualComponents> 730 762 <Properties> -
java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java
r15 r17 10 10 import java.awt.Dialog.ModalityType; 11 11 import java.awt.KeyboardFocusManager; 12 import java.awt.event.ActionListener; 13 import java.awt.event.ItemListener; 12 14 import java.beans.XMLDecoder; 13 15 import java.beans.XMLEncoder; … … 29 31 import javax.mail.MessagingException; 30 32 import 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; 33 import javax.swing.*; 34 import javax.swing.event.ChangeListener; 37 35 import org.jdesktop.swingx.JXErrorPane; 38 36 import org.jdesktop.swingx.JXTaskPaneContainer; … … 41 39 /** 42 40 * 43 * @author 41 * @author fiki 44 42 */ 45 43 public class SuperPostak extends javax.swing.JFrame { … … 57 55 /** 58 56 * Creates new form SuperPostak 57 * 59 58 * @param ladit předvyplní testovací hodnoty - zprávu 60 59 * @param exit při zavření okna ukončí program … … 351 350 vstupZprava = new javax.swing.JTextArea(); 352 351 jLabel15 = new javax.swing.JLabel(); 353 vstupFormatHTML = new javax.swing.JCheckBox();354 352 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(); 355 356 odpovedetKomuDialog = new javax.swing.JDialog(); 356 357 jLabel18 = new javax.swing.JLabel(); … … 360 361 odpovedetKomuAdresa = new javax.swing.JTextField(); 361 362 odpovedetKomuHotovo = new javax.swing.JButton(); 363 formátSkupina = new javax.swing.ButtonGroup(); 362 364 jXHeader1 = new org.jdesktop.swingx.JXHeader(); 363 365 taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer(); … … 701 703 jLabel15.setText("Formát zprávy"); 702 704 703 vstupFormatHTML.setMnemonic('h');704 vstupFormatHTML.setText("HTML");705 vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text");706 707 705 odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText")); 708 706 odpovedetKomuOdkaz.setMnemonic('e'); … … 717 715 }); 718 716 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 719 737 javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava); 720 738 panelZprava.setLayout(panelZpravaLayout); … … 723 741 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() 724 742 .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() 728 746 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 729 747 .addGroup(panelZpravaLayout.createSequentialGroup() … … 736 754 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) 737 755 .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() 742 760 .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))) 746 768 .addContainerGap()) 747 769 ); … … 766 788 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 767 789 .addComponent(jLabel15) 768 .addComponent(vstupFormatHTML)) 790 .addComponent(formátProstý) 791 .addComponent(formátXHTML) 792 .addComponent(formátOboje)) 769 793 .addContainerGap()) 770 794 ); … … 817 841 .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 818 842 .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) 820 844 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 821 845 .addComponent(odpovedetKomuHotovo) … … 967 991 zprava.setPredmet(vstupPredmet.getText()); 968 992 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 } 970 1004 971 1005 if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) { … … 1103 1137 }//GEN-LAST:event_odpovedetKomuHotovoActionPerformed 1104 1138 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 1105 1161 /** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */ 1106 1162 private Collection<InternetAddressKomu> getPrijemciSQL() throws SQLException, UnsupportedEncodingException { … … 1184 1240 } 1185 1241 // 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; 1186 1246 private javax.swing.JLabel jLabel1; 1187 1247 private javax.swing.JLabel jLabel10; … … 1240 1300 private javax.swing.JTextField vstupDBjmeno; 1241 1301 private javax.swing.JTextField vstupDatabaze; 1242 private javax.swing.JCheckBox vstupFormatHTML;1243 1302 private javax.swing.JTextField vstupJmenoOdesilatele; 1244 1303 private javax.swing.JTextField vstupPredmet;