Send a simple mail

Boas pessoal, estou tentando cirar um pequeno aplicativo que envia um mail bem simples para uma determinado e-mail.

Ja baixei o Javamail e ja importei todos os jar files que estao na pasta lib para o meu projecto , copiei um codigo de uma pesquisa que fiz no google, mas estou tendo alguns problemas. abaixo segue o exemplo que apanhei no google :

package teste;


import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;


public class SimpleSender {
    
   
   public static void send(String smtpServer, String to, String from, String subject, String body)
  {
    try
    {
      Properties props = System.getProperties();

      props.put("mail.smtp.host", smtpServer);
      Session session = Session.getDefaultInstance(props, null);

    
      Message msg = new MimeMessage(session);

     
      msg.setFrom(new InternetAddress(from));
      msg.setRecipients(Message.RecipientType.TO,
      InternetAddress.parse(to, false));

 
      msg.setSubject(subject);
      msg.setText(body);

  
      msg.setHeader("Luis", "Luis");
      msg.setSentDate(new Date());

 
      Transport.send(msg);

      System.out.println("Message sent OK.");
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
  }


 
   public static void main(String args[]){
      try
    {
      String smtpServer="mail.bpc.ao";
      String to="luis@bpc.ao";
      String from="luis@bpc.ao";
      String subject="Primeiro envio de email";
      String body="Esta é uma mensagem de teste.";

      send(smtpServer, to, from, subject, body);
    }
    catch (Exception ex)
    {
      System.out.println(" Hello ");
    }

    System.exit(0);

            
       
   } 
}

Eu nunca utilizei este recusro e gostaria de alguem me desse uma ajuda em como mandar um mail simples apartir de uma class.

O meu codigo nao da erro ao compilar, mas quando eu executo ele me da o dois erros :

Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
        at teste.SimpleSender.send(SimpleSender.java:24)
        at teste.SimpleSender.main(SimpleSender.java:61)

Estes erros referem as seguintes instruções :

Message msg = new MimeMessage(session);
send(smtpServer, to, from, subject, body);

Por favor algume me de uma mao com esse problema !

Obrigado desde ja !

Envio de Email Simples

Classe para Email com Anexo

flw

Olá

[quote=LuisClaudio] Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource at teste.SimpleSender.send(SimpleSender.java:24) at teste.SimpleSender.main(SimpleSender.java:61) [/quote]

Tudo indica que o pacote JAF não foi encontrado. Baixe o Java Activation Framework porque o JavaMail precisa dele para descobrir o MIME-Type. No código é preciso fazer o import
import javax.activation.*;

No Java 6 o Java Activation Framework já vem junto.

[]s
Luca

Pessoal estava zapeando na net tentando encontrar uma solução para enviar um email com um anexo em PDF, simplesmente isso …

Mas depois de muito procurar não encontrei nada que fosse muito sucinto
e explícito.

Portanto aproveito o momento para deixar minha solução, que foi
baseada em várias outras, para resolver este pequeno problema que acredito que num futuro próximo muitos vão encontrar pois o Mustang está para sair da “Fábrica” e algumas mudanças importantes que estão acontecendo não serão tão simples para developers iniciantes ou aqueles que vem de outras linguagens.

Começando, usaremos o JavaMail 1.4(mail.jar) e o JAF 1.1(activation.jar) disponíveis no site da sun ou direto no Java 6, se for o caso. Nos dois Links que eu encontrei

http://www.javafree.org/javabb/rss/viewtopic.jbb?t=853741

Explicam um pouco de cada coisa. Mas não servem, em partes, para o
JavaMail 1.4 pois não existe mais a classe demo relacionada como “a
solução” que seria a ByteArrayOutputStream que não está disponível
mais nesses releases.

Bom como a maioria deve saber criar o email não é problema

Apesar de que autenticar quebra o paradigma pois a responsabilidade da
autenticação deve ser delegada a uma classe autenticadora e não a
própria api de email

Para autenticar um SMTP ou POP3 faça uma classe como essa:

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MailAuth extends Authenticator {
    private String usuario = null;
    private String senha = null;
   
    public MailAuth(String usuario, String senha) {
    	this.usuario = usuario;
    	this.senha = senha;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(usuario,senha);
    } 
}

Para enviar o email crie uma classe, um método ou um servlet conforme for sua necessidade segue um exemplo:

public void EnviaEmailComAnexo(String para, String assunto, String corpo, String arquivo)
	throws AddressException, MessagingException, IOException {

	Properties props = new Properties();
	props.put("mail.smtp.host", smtp.guj.com.br);
                // Esse cara aqui só é necessário se o servidor SMTP precisar de
				// autenticação
                // Se não precisar arranque a linha abaixo ou mude o valor para
				// false
	props.put("mail.smtp.auth", "true");
	MailAuth auth = new MailAuth('José', 'Moreira');
	Session session = Session.getInstance(props, auth);
                // Para testes deixe o debug do session ligado ele mostra
				// informações interessantes
	session.setDebug(true);
                // Cria uma nova Mensagem MIME
	MimeMessage msg = new MimeMessage(session);
	msg.setFrom(new InternetAddress('jose@maria.com.br'));
	msg.setRecipients(Message.RecipientType.TO, para);
	msg.setSubject(assunto);
	msg.setSentDate(new Date());
                // Aqui criam-se as partes do MIME (Multipart) Email
                // Partes que têm somente texto poderia ser HTML
	MimeBodyPart mbpTexto = new MimeBodyPart();
	mbpTexto.setText(corpo);
	Multipart mp = new MimeMultipart();
	mp.addBodyPart(mbpTexto);
	if (arquivo != null) {
                        // Cria a outra parte do MIME para anexar o arquivo
		MimeBodyPart mbpAnexo = new MimeBodyPart();
                        // Indica o nome do arquivo não coloque o caminho
						// completo
                        // Neste exemplo vai ficar o caminho completo para
						// facilitar c:\jose\maria.pdf
		mbpAnexo.setFileName(arquivo);
		mbpAnexo.setDataHandler(carregaArquivo(arquivo));
		mp.addBodyPart(mbpAnexo);
	}
                // Seta o multipart mail dentro do MimeMessage
	msg.setContent(mp);
                // Envia enfim o email para o bendito destinatário
	Transport.send(msg);
	
}

Agora que vem a parte não tão explícita, a questão do uso do JAF com Javamail para encontrar o mime/type do pdf

Segue o código para resolver :

private DataHandler carregaArquivo(String arquivo) throws IOException {
		InputStream file = new FileInputStream(arquivo);
		return new DataHandler(new ByteArrayDataSource(file, "application/pdf"));
}

Criamos um DataHandler da API JAF para ser usado com o setDataHandler da API Javamail tomando como base um InputStream do tipo File FileInputStream o que poderia ser qualquer outro tipo de InputStream, ou seja não precisamos ter o arquivo gravado efetivamente
no disco :slight_smile:

Importante resaltar o MIME/Type application/pdf é o mime do PDF

Vários conceitos de java foram utilizados para enviar um email.
Conceitos principalmente J2EE que para muitos não são conhecidos, que é o caso da JavaBeans Activation Framework, tornando a resposta para um simples proplema um pouco demorada.

Bom finalmente fica ai um exemplo bem completo de como enviar email, enviar email com anexo diferente de arquivo texto e enviar um email autenticando em um servidor SMTP.

Pode ser que isso seja assunto para um tutorial mais detalhado, fico a disposição para a confecção do mesmo.

Abraço a todos espero que lhes seja de muita valia

Francisco Guerios
www.infosist.com.br