Skip to content

Commit

Permalink
Merge pull request #2858 from jlawyerorg/feat/deleteAttachmentsInMails
Browse files Browse the repository at this point in the history
added option to remove attachments from eMail messages
  • Loading branch information
j-dimension authored Feb 28, 2025
2 parents ec59a32 + 0f368bd commit 3d828b8
Show file tree
Hide file tree
Showing 3 changed files with 214 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,7 @@
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
Expand Down Expand Up @@ -1417,4 +1418,79 @@ public static String getAddressesAsList(Address[] a) throws UnsupportedEncodingE

return s;
}

/**
* Entfernt aus der gegebenen MimeMessage alle Anhänge, deren Dateinamen in attachmentNames enthalten sind.
* Es wird ein neues MimeMessage-Objekt erstellt, das keine der angegebenen Anhänge mehr enthält.
*
* @param message die ursprüngliche MimeMessage
* @param attachmentNames Liste der Dateinamen, die entfernt werden sollen
* @return ein neues MimeMessage-Objekt ohne die ausgewählten Anhänge
* @throws Exception falls ein Fehler beim Verarbeiten der Nachricht auftritt
*/
public static MimeMessage removeAttachmentsFromMessage(MimeMessage message, List<String> attachmentNames) throws Exception {
if (!message.isMimeType("multipart/*")) {
return message;
}
Object content = message.getContent();
if (!(content instanceof Multipart)) {
return message;
}
Multipart originalMultipart = (Multipart) content;
Multipart newMultipart = removeAttachmentsFromMultipart(originalMultipart, attachmentNames);

// Neues MimeMessage-Objekt mit demselben Session-Objekt erstellen
MimeMessage newMessage = new MimeMessage(message.getSession());
@SuppressWarnings("unchecked")
Enumeration<Header> headers = message.getAllHeaders();
while (headers.hasMoreElements()) {
Header header = headers.nextElement();
newMessage.setHeader(header.getName(), header.getValue());
}
newMessage.setContent(newMultipart);
newMessage.saveChanges();
return newMessage;
}

/**
* Rekursive Methode zur Verarbeitung eines Multipart-Objekts.
* Sie erstellt ein neues Multipart, das alle BodyParts enthält, außer denen,
* deren Dateiname in attachmentNames enthalten ist.
*
* @param multipart das zu verarbeitende Multipart-Objekt
* @param attachmentNames Liste der Dateinamen, die entfernt werden sollen
* @return ein neues Multipart ohne die ausgewählten Anhänge
* @throws Exception falls ein Fehler beim Verarbeiten der Parts auftritt
*/
private static Multipart removeAttachmentsFromMultipart(Multipart multipart, List<String> attachmentNames) throws Exception {
MimeMultipart newMultipart = new MimeMultipart();
int count = multipart.getCount();
for (int i = 0; i < count; i++) {
BodyPart part = multipart.getBodyPart(i);
// Falls der Part selbst ein Multipart ist, rekursiv verarbeiten
if (part.isMimeType("multipart/*")) {
Multipart subMultipart = (Multipart) part.getContent();
Multipart newSubMultipart = removeAttachmentsFromMultipart(subMultipart, attachmentNames);
if (newSubMultipart.getCount() > 0) {
MimeBodyPart newPart = new MimeBodyPart();
newPart.setContent(newSubMultipart);
newMultipart.addBodyPart(newPart);
}
} else {
String disposition = part.getDisposition();
boolean isAttachment = disposition != null &&
(disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE));
if (isAttachment && part.getFileName() != null) {
String decodedFileName = MimeUtility.decodeText(part.getFileName());
if (attachmentNames.contains(decodedFileName)) {
// Diese Anhängervariante wird entfernt
continue;
}
}
// Anderenfalls den Part übernehmen
newMultipart.addBodyPart(part);
}
}
return newMultipart;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@
</MenuItem>
</SubComponents>
</Menu>
<MenuItem class="javax.swing.JMenuItem" name="mnuRemoveItem">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/icons/editdelete.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Anhang entfernen"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="mnuRemoveItemActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Container>
<Component class="javax.swing.JLabel" name="jLabel5">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -815,6 +815,12 @@ public MailContentUI() {
this.lstAttachments.setCellRenderer(new AttachmentListCellRenderer());
this.lstAttachments.setModel(new DefaultListModel());

mnuRemoveItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mnuRemoveItemActionPerformed(evt);
}
});

// Add mouse listeners to copy labels
addCopyFunctionality(lblSubject);
addCopyFunctionality(lblFrom);
Expand Down Expand Up @@ -1638,6 +1644,7 @@ private void initComponents() {
mnuSave = new javax.swing.JMenu();
mnuSearchSave = new javax.swing.JMenuItem();
mnuSaveAsFile = new javax.swing.JMenuItem();
mnuRemoveItem = new javax.swing.JMenuItem();
jLabel5 = new javax.swing.JLabel();
popAssistant = new javax.swing.JPopupMenu();
jPanel1 = new javax.swing.JPanel();
Expand Down Expand Up @@ -1684,6 +1691,15 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {

popAttachments.add(mnuSave);

mnuRemoveItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/editdelete.png"))); // NOI18N
mnuRemoveItem.setText("Anhang entfernen");
mnuRemoveItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mnuRemoveItemActionPerformed(evt);
}
});
popAttachments.add(mnuRemoveItem);

jLabel5.setText("CC:");

setBackground(new java.awt.Color(255, 255, 255));
Expand Down Expand Up @@ -2134,6 +2150,116 @@ private void cmdAssistantMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIR
}
}//GEN-LAST:event_cmdAssistantMouseReleased

private void mnuRemoveItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRemoveItemActionPerformed
// Menüpunkt deaktivieren während der Verarbeitung
mnuRemoveItem.setEnabled(false);

try {

if (this.lstAttachments.getSelectedValue() == null) {
return;
}

List<String> selectedAttachments = new ArrayList<>();
for (Object selected : this.lstAttachments.getSelectedValuesList()) {
selectedAttachments.add(selected.toString());
}

log.info("Ausgewählte Anhänge zum Entfernen: " + selectedAttachments);

MimeMessage originalMessage = (MimeMessage) emlMsgContainer.getMessage();
MimeMessage modifiedMessage = EmailUtils.removeAttachmentsFromMessage(originalMessage, selectedAttachments);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
modifiedMessage.writeTo(bos);
byte[] modifiedContent = bos.toByteArray();
bos.close();

// 4. Speichere die E-Mail als neues Dokument in der Akte
if (caseContext != null) {
try {
// Service initialisieren
ClientSettings settings = ClientSettings.getInstance();
JLawyerServiceLocator locator = JLawyerServiceLocator.getInstance(settings.getLookupProperties());
ArchiveFileServiceRemote remote = locator.lookupArchiveFileServiceRemote();

// Basis-Dateinamen generieren
String baseFilename = "Email_ohne_Anhaenge.eml";
if (lblSubject != null && !lblSubject.getText().trim().isEmpty()) {
// Verwende Betreff als Teil des Dateinamens, wenn verfügbar
String subject = lblSubject.getText().trim();
if (subject.length() > 30) {
subject = subject.substring(0, 30);
}

subject = subject.replaceAll("[\\\\/:*?\"<>|]", "_");
baseFilename = subject + "_ohne_Anhaenge.eml";
}

// Verwende FileUtils.getNewFileName, um einen eindeutigen Namen zu erhalten
// Die Methode öffnet einen Dialog oder generiert automatisch einen Namen
String uniqueFilename = FileUtils.getNewFileName(caseContext, baseFilename, true);

// Wenn der Benutzer den Dialog abgebrochen hat oder kein Name generiert werden konnte
if (uniqueFilename == null || uniqueFilename.trim().isEmpty()) {
JOptionPane.showMessageDialog(this,
"Vorgang abgebrochen - kein Dateiname angegeben.",
"Information", JOptionPane.INFORMATION_MESSAGE);
return;
}

// Füge die E-Mail als neues Dokument zur Akte hinzu
ArchiveFileDocumentsBean newDoc = remote.addDocument(
caseContext.getId(),
uniqueFilename,
modifiedContent,
null,
null
);

// Benachrichtige das System über das neue Dokument
EventBroker eb = EventBroker.getInstance();
eb.publishEvent(new DocumentAddedEvent(newDoc));

} catch (Exception e) {
log.error("Fehler beim Speichern in der Akte", e);
JOptionPane.showMessageDialog(this,
"Fehler beim Speichern in der Akte: " + e.getMessage(),
"Fehler", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(this,
"Anhang aus Nachricht entfernt.",
"Hinweis", JOptionPane.WARNING_MESSAGE);
}

// 6. Aktualisiere die lokale Anzeige
emlMsgContainer.setMessage(modifiedMessage);

// UI aktualisieren
((DefaultListModel) lstAttachments.getModel()).removeAllElements();
if (modifiedMessage.isMimeType("multipart/*")) {
try {
ArrayList<String> attachments = EmailUtils.getAttachmentNames(modifiedMessage.getContent());
for (String name : attachments) {
((DefaultListModel) lstAttachments.getModel()).addElement(name);
}
} catch (Exception e) {
log.error("Fehler beim Aktualisieren der Anhangliste", e);
}
}

} catch (Exception ex) {
log.error("Fehler beim Entfernen der Anhänge", ex);
JOptionPane.showMessageDialog(this,
"Fehler beim Entfernen der Anhänge: " + ex.getMessage(),
"Fehler", JOptionPane.ERROR_MESSAGE);
} finally {
// Menüpunkt wieder aktivieren
mnuRemoveItem.setEnabled(true);
}
}//GEN-LAST:event_mnuRemoveItemActionPerformed

private static String getFromAddress(String from, Message msg) {
String whiteListEntry = from;
try {
Expand Down Expand Up @@ -2184,6 +2310,7 @@ private void showHtml() {
private javax.swing.JLabel lblSubject;
private javax.swing.JLabel lblTo;
private javax.swing.JList lstAttachments;
private javax.swing.JMenuItem mnuRemoveItem;
private javax.swing.JMenu mnuSave;
private javax.swing.JMenuItem mnuSaveAsFile;
private javax.swing.JMenuItem mnuSearchSave;
Expand Down

0 comments on commit 3d828b8

Please sign in to comment.