problemas con javax.mail

sara
19 de Octubre del 2005
Hola a todos,

mi problema es el siguiente. Tengo una aplicación desde la que se realiza envío de mails a una serie de destinatarios.

Este es el método que utilizo.

/**
* Nombre del método: sendAttachmentsSmtpMail.
* Descripción del método: Enviará un mail normal por smtp con ficheros atachados.
* Entradas: Un destinatario del mail, el remitente, el asunto, el cuerpo, el usuario de correo, el puerto de envío, la contraseña del usuario de correo, una colección de dataBeans de ficheros y la dirección de donde se recogen los ficheros.
* Salidas:
*/
public void sendAttachmentsSmtpMail(String destinatario, String remitente, String asunto, String cuerpo, String puerto, String mailUser, String mailPassword, Collection attachments, String filesUri) throws javax.mail.MessagingException, SendFailedException, MailException {
// Declaración de variables.
MimeMessage message; // Mensaje de javamail.
Transport transport; // Transporte para javamail.
javax.mail.Session mailSession; // Sesión de javamail.
Multipart mp; // Mensaje multipart para envío de ficheros.
FileDataSource fds; // String con la url del fichero.
MimeBodyPart mbp; // Para el contenido con ficheros.
Iterator iterator; // Iterator para recorrer la colección.

// Operaciones.
try {
// Se manda un mail al empleado.
mailSession = javax.mail.Session.getInstance(System.getProperties(),null);
// Define message
message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(remitente));
message.addRecipient(Message.RecipientType.TO,new InternetAddress(destinatario));
message.setSubject(asunto, "ISO-8859-1");
message.setText(cuerpo, "ISO-8859-1");
mp = new MimeMultipart();
iterator = attachments.iterator();
while (iterator.hasNext()) {
EdpFicheroDataBean fichero = (EdpFicheroDataBean)iterator.next();
fds = new FileDataSource(filesUri + fichero.getDescripcion());
mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fichero.getNombre());
mp.addBodyPart(mbp);
message.setContent(mp);
}
mbp = new MimeBodyPart();
//mbp.setFileName("Lista de teléfonos.txt");
mbp.setText(cuerpo, "ISO-8859-1");
mp.addBodyPart(mbp);
message.setContent(mp);
// Define transport
transport = mailSession.getTransport("smtp");
transport.connect(puerto,mailUser,mailPassword);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
} catch (SendFailedException e) {
e.printStackTrace();
throw new MailException();
} catch (javax.mail.MessagingException e) {
e.printStackTrace();
throw new MailException();
}

El problema es que si yo como destinatario le paso una dirección de mail que no existe, por ejemplo 'smoral', el mail se envía y no salta ningún error cuando en realidad esa direccion de correo no existe. Este lo puedo controlar yo de alguna manera desde la clase o es el servidor de correo el que se encarga ya de devolver el mail o lanzar un error?

A ver si me podéis ayudar ya que ando un poco perdida y no se bien como va todo esto.

Muchas gracias y un saludo.

sara

mrx345
19 de Octubre del 2005
hola, sara...

por supuesto que se puede controloar el hecho de que un correo se construya con una direccion de remitente invalida. esto se hace diciendole al servidor que exija autenticacion de usuario antes de mandatr un mail, por lo tanto la direcion de remitente debe estar asociada a un buzon con su respectiva contraseña.

Antes que todo hat que ubicarse en un contexto.

Me imagino que el codigo de arriba debe estar en una clase la cual es la que se encarga de formar el mail, tiene un metodo que recibe el remitente(from), el destinatario(to) el asunto(subject), el mensaje...
Si no es asi te recomiendo que sigas este modelo.

Lo unico que tienes que hacer para que el servidor pida autenticacion de usuario es crear el siguiente constructor

protected javax.mail.Session session;
protected java.util.Properties properties;
protected javax.mail.Transport channel;


public MyClass(String server,boolean auth) throws javax.mail.NoSuchProviderException{

server_address = new java.lang.String(server);
properties = java.lang.System.getProperties();
properties.put("mail.smtp.host", server_address);
properties.put("mail.smtp.auth",auth+"");
session = javax.mail.Session.getDefaultInstance(properties);

channel = session.getTransport("smtp");

}

De esta forma cada vez que te conectes al sevidor le tendras que enviar el el usuario y su password.

channel.connect(server_address,login,password);

No te olvides de cerrar el canal una vez enviado el mail

channel .close()



Espero que esto sea de tu ayuda