package de.fernschulen.minimail;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
public class Empfangen extends JFrame {
private static final long serialVersionUID = 2905894464790399040L;
private JTable tabelle;
private DefaultTableModel modell;
private String benutzername = null;
private String passwort = null;
private MeineAktionen beantwortenAct, weiterleitenAct;
class MeinWindowAdapter extends WindowAdapter{
@Override
public void windowOpened(WindowEvent e) {
nachrichtenEmpfangen();
}
}
class MeineAktionen extends AbstractAction {
private static final long serialVersionUID = -2679115823310162426L;
public MeineAktionen(String text, ImageIcon icon, String beschreibung, KeyStroke shortcut, String actionText) {
super (text, icon);
putValue(SHORT_DESCRIPTION, beschreibung);
putValue(ACCELERATOR_KEY, shortcut);
putValue(ACTION_COMMAND_KEY, actionText);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("beantworten"))
beantworten();
if(e.getActionCommand().equals("weiterleiten"))
weiterleiten();
}
}
Empfangen() {
super();
setTitle("E-Mail empfangen");
setLayout(new BorderLayout());
setVisible(true);
setSize(700, 300);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
beantwortenAct = new MeineAktionen("Beantworten", new ImageIcon("C:/Users/melli/Documents/ILS/Java17d/java17d_beispiele/icons/mail-reply.gif"), "Beantwortet diese E-Mail", null, "beantworten");
weiterleitenAct = new MeineAktionen("Weiterleiten", new ImageIcon("C:/Users/melli/Documents/ILS/Java17d/java17d_beispiele/icons/mail-forward.gif"), "Leitet diese E-Mail weiter", null, "weiterleiten");
add(symbolleiste(), BorderLayout.NORTH);
addWindowListener(new MeinWindowAdapter());
tabelleErstellen();
tabelleAktualisieren();
}
private void beantworten() {
int zeile=tabelle.getSelectedRow();
if (zeile > -1) {
String sender, betreff, inhalt, ID;
ID = tabelle.getModel().getValueAt(zeile, 0).toString();
sender = tabelle.getModel().getValueAt(zeile, 1).toString();
betreff = "AW: " + tabelle.getModel().getValueAt(zeile, 2).toString();
inhalt = "\n------------------Text der ursprünglichen Nachricht------------------\n" + tabelle.getModel().getValueAt(zeile, 3).toString();
new Antworten(Empfangen.this,true,ID,sender,betreff,inhalt);
tabelleAktualisieren();
}
else
JOptionPane.showMessageDialog(null, "Es wurde keine Zeile markiert");
}
private void weiterleiten() {
int zeile=tabelle.getSelectedRow();
if (zeile > -1) {
String empfaenger, betreff, inhalt, ID;
ID = tabelle.getModel().getValueAt(zeile, 0).toString();
empfaenger = null;
betreff = "WG: " + tabelle.getModel().getValueAt(zeile, 2).toString();
inhalt = "\n------------------Text der ursprünglichen Nachricht------------------\n" + tabelle.getModel().getValueAt(zeile, 3).toString();
new Weiterleitung(Empfangen.this,true,ID,empfaenger,betreff,inhalt);
tabelleAktualisieren();
}
else
JOptionPane.showMessageDialog(null, "Es wurde keine Zeile markiert");
}
private void tabelleErstellen() {
String[] spaltenNamen = {"ID", "Sender", "Betreff", "Text"};
modell = new DefaultTableModel();
modell.setColumnIdentifiers(spaltenNamen);
tabelle = new JTable();
tabelle.setModel(modell);
tabelle.setDefaultEditor(Object.class, null);
tabelle.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
tabelle.setFillsViewportHeight(true);
JScrollPane scroll = new JScrollPane(tabelle);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
add(scroll);
tabelle.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int zeile = tabelle.getSelectedRow();
String sender, betreff, inhalt, ID;
ID = tabelle.getModel().getValueAt(zeile, 0).toString();
sender = tabelle.getModel().getValueAt(zeile, 1).toString();
betreff = tabelle.getModel().getValueAt(zeile, 2).toString();
inhalt = tabelle.getModel().getValueAt(zeile, 3).toString();
new Anzeige(Empfangen.this, true, ID, sender, betreff, inhalt);
}
}
});
}
private JToolBar symbolleiste() {
JToolBar leiste = new JToolBar();
leiste.add(beantwortenAct);
leiste.add(weiterleitenAct);
return (leiste);
}
private void tabelleAktualisieren() {
Connection verbindung;
ResultSet ergebnisMenge;
String sender, betreff, inhalt, ID;
modell.setRowCount(0);
try{
verbindung = MiniDBTools.oeffnenDB("jdbc:derby:mailDB");
ergebnisMenge = MiniDBTools.liefereErgebnis(verbindung, "SELECT * FROM empfangen");
while (ergebnisMenge.next()) {
ID = ergebnisMenge.getString("iNummer");
sender = ergebnisMenge.getString("sender");
betreff = ergebnisMenge.getString("betreff");
Clob clob;
clob = ergebnisMenge.getClob("inhalt");
inhalt = clob.getSubString(1, (int) clob.length());
modell.addRow(new Object[] {ID, sender, betreff, inhalt} );
}
ergebnisMenge.close();
verbindung.close();
MiniDBTools.schliessenDB("jdbc:derby:mailDB");
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
}
}
private void nachrichtenEmpfangen() {
nachrichtenAbholen();
tabelleAktualisieren();
}
private void nachrichtenAbholen() {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(Empfangen.class.getResourceAsStream("/de/fernschulen/minimail/anmeldedaten.txt")))) {
benutzername = reader.readLine();
passwort = reader.readLine();
}
catch (IOException e) {
System.out.println("Die Anmeldedaten konnten nicht gefunden werden" + e);
}
String server = "pop.gmail.com";
Properties eigenschaften = new Properties();
eigenschaften.put("mail.store.protocol", "pop3");
eigenschaften.put("mail.pop3.host", server);
eigenschaften.put("mail.pop3.port", "995");
eigenschaften.put("mail.pop3.starttls.enable", "true");
Session sitzung = Session.getDefaultInstance(eigenschaften);
try (Store store = sitzung.getStore("pop3s")){
store.connect(server, benutzername, passwort);
Folder posteingang = store.getFolder("INBOX");
posteingang.open(Folder.READ_WRITE);
Message nachrichten[] = posteingang.getMessages();
if (nachrichten.length != 0) {
JOptionPane.showMessageDialog(this, "Es gibt "+ posteingang.getUnreadMessageCount() + " neue Nachrichten.");
for(Message nachricht : nachrichten)
nachrichtVerarbeiten(nachricht);
}
else
JOptionPane.showMessageDialog(this, "Es gibt keine neue Nachrichten.");
posteingang.close(true);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
}
}
private void nachrichtVerarbeiten(Message nachricht) {
try {
if (nachricht.isMimeType("text/plain")) {
String sender = nachricht.getFrom()[0].toString();
String betreff = nachricht.getSubject();
String inhalt = nachricht.getContent().toString();
nachrichtSpeichern(sender, betreff, inhalt);
nachricht.setFlag(Flags.Flag.DELETED, true);
}
else
JOptionPane.showMessageDialog(this, "Der Typ der Nachricht " + nachricht.getContentType() + "kann nicht verarbeitet werden.");
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
}
}
private void nachrichtSpeichern(String sender, String betreff, String inhalt) {
Connection verbindung;
verbindung=MiniDBTools.oeffnenDB("jdbc:derby:mailDB");
try {
PreparedStatement prepState;
prepState = verbindung.prepareStatement("insert into empfangen (sender, betreff, inhalt) values (?, ?, ?)");
prepState.setString(1, sender);
prepState.setString(2, betreff);
prepState.setString(3, inhalt);
prepState.executeUpdate();
verbindung.commit();
prepState.close();
verbindung.close();
MiniDBTools.schliessenDB("jdbc:derby:mailDB");
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
}
}
public void actionPerformed(ActionEvent e) {
}
}