# Javamail: "Connection reset by peer: socket write error" beim Hinzufügen einer Mail



## ByeBye 148134 (30. August 2013)

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:


```
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()":


```
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:


```
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


----------



## Writtscher (30. August 2013)

Die api sagt:



> This exception is thrown when a method is invoked on a Messaging object and the Folder that owns that object has died due to some reason.
> 
> Following the exception, the Folder is reset to the "closed" state. All messaging objects owned by the Folder should be considered invalid. *The Folder can be reopened using the "open" method to reestablish the lost connection.*



Also versuch doch


```
try
                {
                    if ( folder != null && folder.exists() )
                    {
                       if (folder.closed()) {
                          folder.open(READ_WRITE);
                      }

                        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();
                }
            }
 
        }
```

(Ist nur Pseudocode.. Wirst selbe die richtigen Methoden herausfinden müssen.)


----------



## ByeBye 148134 (30. August 2013)

Schon probiert. Ich hab in Zeile 105 (vor dem Append) folgendes eingefügt:


```
//Falls der Ordner inzwischen geschlossen wurde.
if (!folder.isOpen()){
  folder.open( Folder.READ_WRITE);
}
```

Hat nichts gebracht - selbe Fehlermeldung.


----------



## Writtscher (30. August 2013)

Gut. Das ist aber der Fehler. Wirst du halt Debuggen müssen. Aber das ist auf jeden Fall der Fehler, denn du siehst auch im Stack:

```
com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:2552)
```


----------



## ByeBye 148134 (30. August 2013)

Hmm ... sieht wohl so aus.

Selbst ein gewolltes Schließen und wieder öffnen bringt nichts ...


```
folder.close( false);
if (!folder.isOpen()){
  System.out.println( "Folder re-opened!" );
  folder.open( Folder.READ_WRITE);
}
```

Für weitere Ideen bin ich sehr dankbar!


----------



## ByeBye 148134 (30. August 2013)

Was lange währt wird endlich gut.
Nach insgesamt zwei Tagen habe ich nun die Lösung - so simpel wie sie am Ende doch ist:

Zwei Zeilen haben gefehlt:


```
props.setProperty("mail.imap.ssl.enable", "true");
props.setProperty("mail.imap.ssl.trust", "*");
```

Diese Properties müssen gesetzt sein, dann funktioniert das appenden ohne Probleme!


----------

