Esta vez les traigo un programa que nos permite enviar correos electrónicos usando los servidores que mas frecuentamos(gmail,hotmail,live,outlook), Sabemos de ante mano que para poder enviar correos se necesita saber mas que nada que protocolo vamos a utilizar, en este caso sera el "SMTP" (Simple Mail Transfer Protocol), Protocolo de red basado en texto, utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos. También necesitamos saber que puerto utilizan los servidores a los que nos vamos a conectar, según CISCO el protocolo SMTP utiliza el puerto de salida "25", pero investigando y haciendo pruebas me entere que GMAIL,HOTMAIL,LIVE y OUTLOOK utilizan el puerto "587", después investigando un poco de teoría, me entero que generalmente usan el puerto "25" o "587" y hay otros que soportan los dos y hasta un tercer puerto ("465"), en este caso haciendo pruebas, coincidí que con el "587" es mas viable.
La aplicación ya compilada y ejecutada, nos permite iniciar la sesión después podemos poner el asunto, el correo al que va dirigido es posible también mandar un archivo adjunto y el texto.
Para esta aplicación utilice 3 API's de Java, mismos que dejare en un link:
API's : JAR
Para agregar estas librerías a mi proyecto utilice netBeans, para aquellos que no sepan como se añaden al proyecto, les dejo un post donde pueden ver como podrían agregarlas:
Link: Crear PDF, API (iText)
Agradecimientos especiales a Fernando Gonzalez Camacho quien fue de vital importancia para hacer esto posible.
Ahora les muestro una vista previa de como se vería la salida del programa al ejecutarlo:
Para finalizar les dejo el código fuente (Tres archivos) del programa y las imágenes que utilice:
Esta es la clase donde se aplica la interfaz gráfica:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Mail extends JFrame implements FocusListener, MouseListener{
public String user,pass;
private JPanel panel = new JPanel();
private JPanel panelFondo = new JPanel();
private JPanel panelEnviarSalir = new JPanel();
private JMenuBar barra = new JMenuBar();
private JMenu menuArchivo = new JMenu("Archivo");
private JMenuItem itemEnviar = new JMenuItem("enviar");
private JMenuItem itemSalir = new JMenuItem("Salir");
private JTextArea areaTexto = new JTextArea("Agregar Mensaje...");
private JLabel lblAsunto = new JLabel("Asunto: ");
private JTextField txtAsunto = new JTextField();
private JLabel lblCorreo = new JLabel("Correo: ");
private JTextField txtCorreo = new JTextField();
private JLabel lblAdjuntar = new JLabel();
private JButton botonEnviar = new JButton("Enviar");
private JButton botonSalir = new JButton("Salir");
private Correo correo;
public File selectedFile;
IniciarSesion sesion = new IniciarSesion();
public Mail(){
initComponents();
setIconImage(getIconImage());
setTitle("NIMADRES-MAIL");
setBounds(300,150,500,500);
setVisible(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(true);
}
@Override
public final Image getIconImage() {
Image iconoVentana = Toolkit.getDefaultToolkit().
getImage(ClassLoader.getSystemResource("icono.png"));
return iconoVentana;
}
public final void initComponents(){
panelFondo.setLayout(new BorderLayout());
panel.setLayout(new GridLayout(5, 3));
panel.setBackground(Color.black);
itemEnviar.setBackground(Color.black);
itemEnviar.setForeground(Color.red);
itemSalir.setForeground(Color.red);
itemSalir.setBackground(Color.black);
menuArchivo.setBackground(Color.BLACK);
menuArchivo.setForeground(Color.red);
barra.setBackground(Color.black);
menuArchivo.add(itemEnviar);
menuArchivo.add(itemSalir);
barra.add(menuArchivo);
lblAsunto.setBackground(Color.black);
lblAsunto.setForeground(Color.red);
lblAsunto.setFont(new Font("consolas",1,20));
txtAsunto.setBackground(Color.black);
txtAsunto.setForeground(Color.white);
lblCorreo.setBackground(Color.black);
lblCorreo.setForeground(Color.red);
lblCorreo.setFont(new Font("conoslas",1,20));
txtCorreo.setBackground(Color.black);
txtCorreo.setForeground(Color.white);
lblAdjuntar.setIcon(new ImageIcon(getClass()
.getResource("adjuntar.png")));
lblAdjuntar.setCursor(new Cursor(HAND_CURSOR));
areaTexto.setForeground(Color.white);
areaTexto.setBackground(Color.black);
areaTexto.setFont(new Font("Consolas",1,15));
areaTexto.setLineWrap(true);
areaTexto.setWrapStyleWord(true);
panel.add(lblAsunto);
panel.add(txtAsunto);
panel.add(lblCorreo);
panel.add(txtCorreo);
panel.add(lblAdjuntar);
add(barra, BorderLayout.NORTH);
panelFondo.add(panel,BorderLayout.NORTH);
panelFondo.add(new JScrollPane(areaTexto),BorderLayout.CENTER);
add(panelFondo);
panelEnviarSalir.setLayout(new FlowLayout());
botonEnviar.setBackground(Color.BLACK);
botonEnviar.setForeground(Color.red);
botonSalir.setBackground(Color.BLACK);
botonSalir.setForeground(Color.red);
panelEnviarSalir.add(botonEnviar);
panelEnviarSalir.add(botonSalir);
panelEnviarSalir.setBackground(Color.black);
add(panelEnviarSalir,BorderLayout.SOUTH);
botonEnviar.addActionListener(sesion);
botonSalir.addActionListener(sesion);
itemSalir.addActionListener(sesion);
itemEnviar.addActionListener(sesion);
areaTexto.addFocusListener(this);
areaTexto.setForeground(Color.LIGHT_GRAY);
lblAdjuntar.addMouseListener(this);
}
public void Inicio(final String user, final String pass) throws Exception{
correo = new Correo();
setVisible(true);
}
@Override
public void focusGained(FocusEvent arg0) {
if(areaTexto.getText().equalsIgnoreCase("Agregar Mensaje...")) {
areaTexto.setText("");
areaTexto.setForeground(Color.white);
}
}
@Override
public void focusLost(FocusEvent fe) {
if(areaTexto.getText().equalsIgnoreCase("")) {
areaTexto.setText("Agregar Mensaje...");
areaTexto.setForeground(Color.LIGHT_GRAY);
}
}
@Override
public void mouseClicked(MouseEvent me) {
if(me.getSource().equals(lblAdjuntar)){
JFileChooser fileChooser = new JFileChooser();
int returnValue = fileChooser.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
selectedFile = fileChooser.getSelectedFile();
}
}
}
@Override
public void mousePressed(MouseEvent me) {}
@Override
public void mouseReleased(MouseEvent me) {}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
class IniciarSesion extends JDialog implements ActionListener,FocusListener{
private JTextField usuario = new JTextField("ejemplo@algo.com...");
private JPasswordField password = new JPasswordField();
private JLabel lblusuario = new JLabel("Correo");
private JLabel lblpassword = new JLabel("Password");
private JPanel panel = new JPanel();
private JButton iniciar = new JButton("Iniciar");
private JButton cancelar = new JButton("Cancelar");
public IniciarSesion(){
initComponents();
setIconImage(getIconImage());
setTitle("NIMADRES");
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setBounds(500, 250, 350, 250);
setVisible(true);
}
public final void initComponents(){
panel.setLayout(null);
panel.setBackground(Color.black);
lblusuario.setText("Correo:");
lblusuario.setForeground(Color.red);
lblusuario.setBounds(75, 10, 100, 20);
lblusuario.setFont(new Font("consolas", 1, 20));
usuario.setBounds(75, 30, 200, 30);
usuario.setFont(new Font("consolas", 1, 12));
usuario.setBackground(Color.black);
usuario.setForeground(Color.white);
lblpassword.setText("Contraseña");
lblpassword.setBounds(75, 75, 150, 30);
lblpassword.setFont(new Font("consolas", 1, 20));
lblpassword.setForeground(Color.red);
password.setBounds(75, 100, 200, 30);
password.setFont(new Font("consolas", 1, 12));
password.setBackground(Color.black);
password.setForeground(Color.white);
iniciar.setBounds(65, 150, 100, 30);
iniciar.setForeground(Color.red);
iniciar.setBackground(Color.black);
cancelar.setBounds(200, 150, 100, 30);
cancelar.setForeground(Color.red);
cancelar.setBackground(Color.black);
panel.add(lblusuario);
panel.add(usuario);
panel.add(lblpassword);
panel.add(password);
panel.add(iniciar);
panel.add(cancelar);
add(panel);
iniciar.addActionListener(this);
cancelar.addActionListener(this);
usuario.addFocusListener(this);
usuario.setForeground(Color.LIGHT_GRAY);
}
@Override
public void actionPerformed(ActionEvent e) {
//Iniciar Sesion
if(e.getSource().equals(iniciar)){
user = usuario.getText();
pass = password.getText();
if(Validation(user)){
setVisible(false);
usuario.setText("");
password.setText("");
try {
Inicio(user, pass);
} catch (Exception ex) {
Logger.getLogger(Mail.class.getName())
.log(Level.SEVERE, null, ex);
}
}
else
JOptionPane.showMessageDialog(this,
"la cuenta no es valida","FATAL ERROR",
JOptionPane.ERROR_MESSAGE);
}
if(e.getSource().equals(cancelar) || e.getSource().equals(itemSalir)
|| e.getSource().equals(botonSalir)){
System.exit(0);
}
if(e.getSource().equals(itemEnviar) ||
e.getSource().equals(botonEnviar)){
try {
if(correo.enviaCfd(user, pass,txtCorreo.getText(),
txtAsunto.getText(),areaTexto.getText(),selectedFile)){
txtCorreo.setText("");
txtAsunto.setText("");
areaTexto.setText("");
selectedFile = null;
}
} catch (Exception ex) {
Logger.getLogger(Mail.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
@Override
public void focusGained(FocusEvent arg0) {
if(usuario.getText().equalsIgnoreCase("ejemplo@algo.com...")) {
usuario.setText("");
usuario.setForeground(Color.white);
}
}
@Override
public void focusLost(FocusEvent fe) {
if(usuario.getText().equalsIgnoreCase("")) {
usuario.setText("ejemplo@algo.com...");
usuario.setForeground(Color.LIGHT_GRAY);
}
}
public boolean Validation(String _Mail){
Pattern p = Pattern.compile("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$");
Matcher m = p.matcher(_Mail);
if(m.matches()){
return true;
}
return false;
}
}
}
Después hacemos la clase donde utilizamos las API's que añadimos al proyecto:
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.JOptionPane;
public class Correo {
private static final String PROTOCOL = "smtp";
private static final String SMTP_SERVER_LIVE = "smtp.live.com";
//private static final String SMTP_PORT_LIVE = "25";
private static final String SMTP_SERVER_GMAIL = "smtp.gmail.com";
private static final String SMTP_PORT_GMAIL = "587";
//private static final String SMTP_SERVER_HOTMAIL = "msn.hotmail.com";
private Properties props = new Properties();
public boolean enviaCfd(final String USERNAME,
final String PASSWORD,final String destino,
final String asunto,final String texto, File archivo){
try{
Multipart multipart = new MimeMultipart();
MimeBodyPart attachmentPart = null;
if (archivo != null) {
BodyPart _texto = new MimeBodyPart();
_texto.setText(texto);
attachmentPart = new MimeBodyPart();
FileDataSource fileDataSource = new FileDataSource(archivo);
attachmentPart.setDataHandler(new DataHandler(fileDataSource));
attachmentPart.setFileName(texto);
attachmentPart.attachFile(archivo);
multipart.addBodyPart(attachmentPart);
multipart.addBodyPart(_texto);
}
// Propiedades de la conexión
String cuenta[] = USERNAME.split("@");
SMTP_SERVER(USERNAME,cuenta[1]);
// Preparamos la sesion
Session session = Session.getDefaultInstance(props);
// Construimos el mensaje
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(destino));
message.addRecipient(Message.
RecipientType.TO,new InternetAddress(destino));
message.setSubject(asunto);
message.setText(texto);
if(archivo != null){
message.setContent(multipart);
}
// Lo enviamos.
Transport t = session.getTransport(PROTOCOL);
t.connect(USERNAME, PASSWORD);
t.sendMessage(message, message.getAllRecipients());
// Cierre.
t.close();
JOptionPane.showMessageDialog(null
,"Mensaje Enviado"
,"NIMADRES"
,JOptionPane.INFORMATION_MESSAGE);
return true;
}
catch (MessagingException | IOException e){
JOptionPane.showMessageDialog(null
,"No se pudo enviar mensaje, intentelo mas tarde"
,"Fatal Error"
,JOptionPane.ERROR_MESSAGE);
return false;
}
}
public void SMTP_SERVER(final String user,final String cuenta){
switch(cuenta){
case "gmail.com" :
props.setProperty("mail.smtp.host", SMTP_SERVER_GMAIL);
props.setProperty("mail.smtp.port", SMTP_PORT_GMAIL);
break;
case "hotmail.com" :
case "live.com.mx" :
props.setProperty("mail.smtp.host", SMTP_SERVER_LIVE);
props.setProperty("mail.smtp.port", SMTP_PORT_GMAIL);
break;
}
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.user", user);
props.setProperty("mail.smtp.auth", "true");
}
}
Al final Solo agregamos la clase Main para terminar el programa:
public class Main {
public static void main(String[] args) {
Mail m = new Mail();
}
}
Estas son las imágenes que utilice en el programa: