JavaMail para Android - Email Com anexo

4 respostas
samirrolemberg

Olá a todos.

estou tentando mandar um e-mail com um anexo apartir de uma aplicação android para um e-mail X utilizando uma conta do google como conta de envio.

Testei alguns exemplos em Java e conseguia normalmente com um codigo enviar um arquivo apartir do caminho que eu especificasse.

tentei portar pro Android, mas o jar não entende alguma coisas que são da aplicação desktop.

Então tive de recorrer a um codigo diferente e aos jars do JavaMail.jar activation.jar e additionnal.jar .

tentei fazer como no exemplo da pagia do autor do port, mas o email com anexo (o mais importante) não funciona. ou geralmente ele envia algo com o nome que eu havia especificado pro caminho como invalido.

eu estou usando esse codigo:

public class MailJavaSender {  
  
    //cria as propriedades necessárias para o envio de email  
    public void senderMail(final MailJava mail) throws  
         UnsupportedEncodingException, MessagingException {  
  
        Properties props = new Properties();  
        props.setProperty("mail.transport.protocol", "smtp");  
        props.setProperty("mail.host", mail.getSmtpHostMail());  
        props.setProperty("mail.smtp.auth", mail.getSmtpAuth());  
        props.setProperty("mail.smtp.starttls.enable", mail.getSmtpStarttls());  
        props.setProperty("mail.smtp.port", mail.getSmtpPortMail());  
        props.setProperty("mail.mime.charset", mail.getCharsetMail());  
  
        props.put("mail.smtp.socketFactory.port", mail.getSmtpPortMail());              
        props.put("mail.smtp.socketFactory.class",                      
                "javax.net.ssl.SSLSocketFactory");              
        props.put("mail.smtp.socketFactory.fallback", "false");              
        props.setProperty("mail.smtp.quitwait", "false");               
  
        //classe anonima que realiza a autenticação  
        //do usuario no servidor de email.  
        Authenticator auth = new Authenticator() {  
            public PasswordAuthentication getPasswordAuthentication() {  
                return new PasswordAuthentication(  
                                   mail.getUserMail(), mail.getPassMail()  
                 );  
            }  
        };  
  
        // Cria a sessao passando as propriedades e a autenticação  
        Session session = Session.getDefaultInstance(props, auth);  
        // Gera um log no console referente ao processo de envio  
        session.setDebug(true);  
  
        //cria a mensagem setando o remetente e seus destinatários  
        Message msg = new MimeMessage(session);  
        //aqui seta o remetente  
        msg.setFrom(new InternetAddress(  
                          mail.getUserMail(), mail.getFromNameMail())  
         );  
        boolean first = true;  
        for (Map.Entry<String, String> map : mail.getToMailsUsers().entrySet()) {  
            if (first) {  
                //setamos o 1° destinatario  
                msg.addRecipient(Message.RecipientType.TO,  
                          new InternetAddress(map.getKey(), map.getValue())  
                 );  
                first = false;  
            } else {  
                //setamos os demais destinatarios  
                msg.addRecipient(Message.RecipientType.CC,  
                          new InternetAddress(map.getKey(), map.getValue())  
                 );  
            }  
        }  
  
        // Adiciona um Assunto a Mensagem  
        msg.setSubject(mail.getSubjectMail());  
  
        // Cria o objeto que recebe o texto do corpo do email  
        MimeBodyPart textPart = new MimeBodyPart();  
        textPart.setContent(mail.getBodyMail(), mail.getTypeTextMail());  
  
        // Monta a mensagem SMTP  inserindo o conteudo, texto e anexos  
        Multipart mps = new MimeMultipart();  
        for (int index = 0; index < mail.getFileMails().size(); index++) {  
  
            // Cria um novo objeto para cada arquivo, e anexa o arquivo  
            MimeBodyPart attachFilePart = new MimeBodyPart();  
            FileDataSource fds =   new FileDataSource(  
                 mail.getFileMails().get(index)  
             );  
            attachFilePart.setDataHandler(new DataHandler(fds));  
            attachFilePart.setFileName(fds.getName());  
  
            //adiciona os anexos da mensagem  
            mps.addBodyPart(attachFilePart, index);  
  
        }  
  
        //adiciona o corpo texto da mensagem  
        mps.addBodyPart(textPart);  
  
        //adiciona a mensagem o conteúdo texto e anexo  
        msg.setContent(mps);  
  
        // Envia a Mensagem  
        Transport.send(msg);  
    }  
  
}

com esse

public class MainActv extends Activity {
    EditText text;
    Button add;
    EditText response;
    Button send;
    Button save;
	
    String txt = "";
    
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tela);
    
        text = (EditText)findViewById(R.id.text);
        add = (Button) findViewById(R.id.add);
        send = (Button) findViewById(R.id.send);
        save = (Button) findViewById(R.id.send);
        response = (EditText) findViewById(R.id.response);
        
        final AlertDialog.Builder out = new AlertDialog.Builder(this);
        out.setPositiveButton("OK", new DialogInterface.OnClickListener() {	
        	@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.cancel();
			}
		});
        
        save.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					//salvar(txt, getPackageName()+"/files/");
					salvar(txt);
					response.setText("Salvo");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					response.setText(e.getMessage());
				}
			}
		});
        add.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					text.setText(txt);
					response.setText("Adicionado");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					response.setText(e.getMessage());
				}
			}
		});
        send.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					enviar("@gmail.com", "Galaxy Tab", "", "TEste", "@hotmail.com", "data.data.br.com.app\\files\\"+"arquivo.txt");
					response.setText("Enviado!");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					response.setText(e.getMessage());
				}
			}
		});

    }
    public void enviar(String email, String nome, String senha, String assunto, String emaildestino, String caminhoAnexo) throws Exception{
        MailJava mj = new MailJava();
        //configuracoes de envio
        mj.setSmtpHostMail("smtp.gmail.com");
        mj.setSmtpPortMail("465");
        mj.setSmtpAuth("true");
        mj.setSmtpStarttls("true");
        mj.setUserMail(email);
        mj.setFromNameMail(nome);
        mj.setPassMail(senha);
        mj.setCharsetMail("ISO-8859-1");
        mj.setSubjectMail(assunto);
        mj.setBodyMail("text/html");
        mj.setTypeTextMail(MailJava.TYPE_TEXT_HTML);

        //sete quantos destinatarios desejar
        Map<String, String> map = new HashMap<String, String>();
        map.put("@hotmail.com", "Email - Hotmail");

        mj.setToMailsUsers(map);

        //seta quatos anexos desejar
        List<String> files = new ArrayList<String>();
        files.add(caminhoAnexo);

        mj.setFileMails(files);

        new MailJavaSender().senderMail(mj);

    }
    
    public void salvar(String txt) throws Exception{
    	File f = new File("data.data.br.com.app\\files\\"+"arquivo.txt");
    	f.mkdirs();
    	FileOutputStream fos = null;   
        fos = openFileOutput(f.getPath(), Context.MODE_WORLD_WRITEABLE);             
	    fos.write(txt.getBytes());   
	    fos.close();	
    }

eu conseguia enviar um arquivo para o email, mas o conteudo nao era o que eu queria e o nome dele chegava com o nome do caminho.

tipo datadatabrcomappfile.txt

é a minha primeira aplicação de android, mas não faço mais idéia pra aonde correr.

algupem tem um exemplo com apenas anexo? minha prioridade não é nem o corpo do email mas sim o anexo.

4 Respostas

samirrolemberg

consegui.

eu passei a usar um cógido que eu já havia testado mas que eu achava que estava errado.

era só ter lido com atenção!

não vou postar aqui diretamente mas vou deixar o src com o androidmanifest dele de presente.

gilsonjunio

cara vc conhece algum tutorial de como criar uma app para receber e enviar email?

valeu

max.analista

Qual a importação para XStrem? Porque você utilizou ela? Qual seria o processo para exportação em PDF?

samirrolemberg

Sinceramente eu não uso mais esse método para enviar e-mail.

a longo prazo ele fica uma bosta.

utilize uma combinação de Commons Email com a dependência do Java Mail para Android

http://commons.apache.org/proper/commons-email/

https://code.google.com/p/javamail-android/

Sobre o XStream eu uso a biblioteca comum dele com Dom4J (fornecido pelo XStream mesmo).

Para exportar um arquivo pdf use o iText.

Criado 31 de julho de 2011
Ultima resposta 27 de mar. de 2013
Respostas 4
Participantes 3