import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Folder; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Store; import javax.mail.Transport; import javax.mail.Flags.Flag; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public final class MailIMAP { // Email server properties private static String host = "mailserver.com"; private static String user = "user"; private static String pass = "pass"; // IMAP properties private static String imapProtocol = "imap"; // Unfortunately there is no way to know sent folder name using Java code, // so it must be specified as a property private static String folderName = "Sent Items"; // Message accounts private static String fromAccount = "someone@mailserver.com"; private static String toAccount = "anotherone@mailserver.com"; /** * User/password authenticator */ private static class MailAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pass); } } /** * Send mail and copy it to "Sent Items" folder * @param args * @throws Exception */ public static void main(String [] args) throws Exception { // Java Mail properties Properties props = System.getProperties(); props.put("mail.smtp.host", host); props.put("mail.smtp.auth", "true"); // Mail session authentified Session session = Session.getInstance(props, new MailAuthenticator()); // Send message Message message = new MimeMessage(session); message.setSubject("Test"); message.setFrom(new InternetAddress(fromAccount)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAccount)); message.setText("Body text"); Transport.send(message); // Copy message to "Sent Items" folder as read Store store = session.getStore(imapProtocol); store.connect(host, user, pass); Folder folder = store.getFolder(folderName); folder.open(Folder.READ_WRITE); message.setFlag(Flag.SEEN, true); folder.appendMessages(new Message[] {message}); store.close(); } }
Hola,
El cómo añades el correo a la carpeta enviados es funcional pero no correcto, porque no te garantizas que se haya enviado el correo. Para saber si un correo se ha enviado correctamente, parcialmente o no se ha enviado, hay que usar el TransportEvent que se desencadena al enviar el mensaje. Es en ese punto, donde ya tenemos si se ha enviado correctamente o no, cuando debemos añadir el correo a la carpeta enviados.
Internet está lleno de trozos de códigos de programas que o bien no funcionan o bien no son del todo correctos. Al final, en vez de servir Internet para ayudar, lo unico que hace es enseñar malas prácticas y liarlo todo mas.
Gracias por la aclaración, César.
En cualquier caso, como reza el lema del blog estos apuntes no son para instruir al aprendiz, sino para recordarme a mí mismo cómo he resuelto una situación concreta en un momento determinado.