Mentre il codice della classe CRAM_MD5 (utilizzata per l'autenticazione) è il seguente:
codice:
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;

public class CRAM_MD5 {

   private static void bcopy(byte[] in, byte[] out) {
      for(int j=0; j<in.length; j++) out[j] = in[j];
   }

   private static String norm(String s) { return (s.length() < 2) ? "0" + s : s; }

   private static int conv(int val) { return (val < 0) ? 256 + val : val;}

   private static String toHexDigest(byte[] dig) {
      String res = "";
      for(int j=0; j<dig.length; j++) res += norm(Integer.toHexString(conv(dig[j])));
      return res;
   }

   public static String getLoginString(String user, String pass, String challenge) throws Exception {

      byte[] decMsg = (new sun.misc.BASE64Decoder()).decodeBuffer(challenge);
      byte[] k_ipad = new byte[64];
      byte[] k_opad = new byte[64];
      byte[] digest = null;

      bcopy(pass.getBytes("UTF8"), k_ipad);
      bcopy(pass.getBytes("UTF8"), k_opad);

      for(int j=0; j<64; j++) {
         k_ipad[j] ^= (byte) 0x36;
         k_opad[j] ^= (byte) 0x5c;
      }

      // Inner MD5
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update( k_ipad );
      md.update( decMsg );
      digest = md.digest();

      // Outer MD5
      MessageDigest md2 = MessageDigest.getInstance("MD5");
      md2.update( k_opad );
      md2.update( digest );

      String result = toHexDigest( md2.digest() );

      return (new sun.misc.BASE64Encoder()).encode( (user + " " + result).getBytes("UTF8") );
   }
}
Delle considerazioni vanno fatte su alcuni dei parametri:
1) L'elenco dei destinatari in copia può essere vuoto (può non essere necessario inviare la mail in copia a qualcuno). Per far questo si passa alla classe un array di dimensione 0:
codice:
String[] cc = new String[0]
2) fileName e nomeFileVis possono essere diversi: il primo indica il file fisico su disco (con tutto il percorso), mentre il secondo indica il nome che verrà visualizzato nella mail; questo significa che il file che io voglio inviare (quello in mio possesso) può chiamarsi "pippo.txt", ma voglio che il destinatario lo veda come se si chiamasse "Pluto.txt";

3) nomeUtente indica il nome che verrà visualizzato nel campo "From:" del destinatario (ad esempio, "LeleFT"), mentre from indica l'indirizzo e-mail associato al mittente;

4) Mentre per la conferma di lettura è possibile specificare un indirizzo a cui inviarla, per la conferma di recapito ciò non può essere fatto: la conferma di recapito torna indietro all'indirizzo e-mail del mittente. Per questo è previsto solamente un parametro booleano (confReceipt) che specifica se richiederla o meno.


Correzioni e suggerimenti sono sempre ben accetti.


Ciao.