B
ByeBye 148134
Guten Morgen zusammen,
ich habe folgendes Problem:
Ich bekomme mehrere Mails von einem Kunden, der diese mit einem MFP-Gerät verschickt. Dieses Gerät hängt an die Message-ID unschöne Zeichen dran, weshalb mein weiterer Prozess nicht mehr funktioniert.
Ich hatte nun die Idee, diese Mails (also die MessageID) per Javamail zu editieren und dann wieder in den selben Ordner zu schieben.
Das Programm funktioniert bei Mails ohne Anhang, allerdings haben alle diese betroffenen Mails ein PDF angehängt. Und dann bekomme ich einen unschönen Fehler.
Hier aber zunächst das Programm:
Die Klasse "MyMimeMessage" überschreibt lediglich die Methode "updateMessageID()":
Ich bekomme folgende Ausgabe:
Ich habe das ganze auch schon mit Wireshark beobachtet... Die Verbindung wird getrennt, sobald die neu erstellte Mail wieder in das Postfach geschoben wird ...
Was könnte hier falsch laufen?
Vielen Dank schonmal für eure Hilfe!
CrazyBread
ich habe folgendes Problem:
Ich bekomme mehrere Mails von einem Kunden, der diese mit einem MFP-Gerät verschickt. Dieses Gerät hängt an die Message-ID unschöne Zeichen dran, weshalb mein weiterer Prozess nicht mehr funktioniert.
Ich hatte nun die Idee, diese Mails (also die MessageID) per Javamail zu editieren und dann wieder in den selben Ordner zu schieben.
Das Programm funktioniert bei Mails ohne Anhang, allerdings haben alle diese betroffenen Mails ein PDF angehängt. Und dann bekomme ich einen unschönen Fehler.
Hier aber zunächst das Programm:
Code:
package ChangeMessageID;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeMessage;
/*
* Holt sich eine Mail aus einem Postfach, ändert die MessageId und speichert
* sie anschließend wieder im Postfach
*
* Funktioniert nur mit Mails ohne Anhang
*/
public class ChangeMessage
{
public static void getMail() throws MessagingException
{
Folder folder = null;
Store store = null;
String imapHost = "<IP>";
String username = "<Name>";
String password = "<PW>";
try
{
// Get system properties
Properties props = System.getProperties();
// Mail-Server properties: Session need information
// Host, User, Passwd etc.
props.put( "mail.imap.host", imapHost );
//props.put( "mail.smtp.port", imapPort);
props.put( "mail.imap.auth", "true" );
// initialisation of auth-class to mail-account to authenticate;
// in session needed
MailAuthenticator auth = new MailAuthenticator( username, password );
// session: for connection with mail-server
//Session session = Session.getDefaultInstance( props, auth );
Session session = Session.getDefaultInstance(props, auth);
// show console debug-messages
session.setDebug( false );
// store: to deposit messages
store = session.getStore( "imap" );
store.connect( imapHost, username, password );
// folder: is a folder-object for Mails
folder = store.getFolder( "TestOrdner" );
folder.open( Folder.READ_WRITE );
Message message[] = folder.getMessages();
System.out.println( message.length+" Messages gefunden" );
for ( int i = 0; i < message.length; i++ )
{
Message m = message[i];
//Header Information
// Enumeration headers = m.getAllHeaders();
// while ( headers.hasMoreElements() )
// {
// Header h = (Header) headers.nextElement();
// System.out.println( h.getName() + ": " + h.getValue() );
// }
MyMimeMessage newmsg = new MyMimeMessage( (MimeMessage) message[i] );
try
{
if ( folder != null && folder.exists() )
{
System.out.println( "-----------------------\nMessage: " + (i+1) );
//set new ID of messages
String[] s = newmsg.getHeader( "Message-ID" );
String newHeader = s[0].substring( 0, s[0].indexOf( ">" ) + 1 );
System.out.print( "Set Message-ID to: " + newHeader );
//set new header
newmsg.setHeader( "Message-ID", newHeader );
System.out.println( " - Done.\n" );
//mark all messages as unread
newmsg.setFlag( Flags.Flag.SEEN, false );
//save changes do you have make
System.out.print( "Save changes to mail." );
newmsg.saveChanges();
System.out.println( " - Done.\n" );
System.out.print( "Append mail to folder." );
folder.appendMessages( new Message[]
{
newmsg
} );
System.out.println( " - Done.\n" );
m.setFlag( Flags.Flag.DELETED, true );
System.out.print( "Expunge Mailbox." );
folder.expunge();
System.out.println( " - Done." );
System.out.println( "-----------------------\n" );
}
}
catch ( MessagingException e )
{
e.printStackTrace();
}
}
}
catch ( Exception err )
{
System.out.println( err );
}
finally
{
folder.close( false );
store.close();
System.out.println( "<<< Folder und Store geschlossen >>>" );
}
}
public static void main( String[] args )
{
try
{
getMail();
}
catch ( MessagingException ex )
{
ex.printStackTrace();
}
}
public static void savefile(String FileName, InputStream is) throws IOException {
File f = new File(FileName);
FileOutputStream fos = new FileOutputStream(f);
byte[] buf = new byte[4096];
int bytesRead;
while((bytesRead = is.read(buf))!=-1) {
fos.write(buf, 0, bytesRead);
}
fos.close();
}
}
class MailAuthenticator extends Authenticator
{
private final String user;
private final String password;
public MailAuthenticator( String user, String password )
{
this.user = user;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication( this.user, this.password );
}
}
Die Klasse "MyMimeMessage" überschreibt lediglich die Methode "updateMessageID()":
Code:
package ChangeMessageID;
import com.sun.mail.imap.IMAPMessage;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* Überschreibt die Klasse MimeMessage, da diese bei der Änderung der
* Message ID über die Methode updateMessageID() diese wieder auf den
* ursprünglichen Wert überschreibt
*
* @author Dominik Sust
* @creation 28.08.2013 11:13:40
*/
class MyMimeMessage extends MimeMessage
{
public MyMimeMessage( MimeMessage mimeMessage ) throws MessagingException
{
super( mimeMessage );
}
@Override
protected void updateMessageID() throws MessagingException
{
setHeader( "Message-ID", this.getMessageID() );
}
}
Ich bekomme folgende Ausgabe:
Code:
run:
1 Messages gefunden
-----------------------
Message: 1
Set Message-ID to: <520255330068D443@mailsdag.de.signintra.com> - Done.
Save changes to mail. - Done.
Append mail to folder.<<< Folder und Store geschlossen >>>
javax.mail.FolderClosedException: * BYE JavaMail Exception: java.net.SocketException: Connection reset by peer: socket write error
at com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:2552)
at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:2674)
at com.sun.mail.imap.IMAPFolder.appendMessages(IMAPFolder.java:1429)
at ChangeMessageID.ChangeMessage.getMail(ChangeMessage.java:113)
at ChangeMessageID.ChangeMessage.main(ChangeMessage.java:148)
Ich habe das ganze auch schon mit Wireshark beobachtet... Die Verbindung wird getrennt, sobald die neu erstellte Mail wieder in das Postfach geschoben wird ...
Was könnte hier falsch laufen?
Vielen Dank schonmal für eure Hilfe!
CrazyBread