Imagem com JavaMail ( de modo que não peça a permissão para abri-lá no leitor de email)

9 respostas
R

Boa Tarde,

Estou com uma dúvida estou usando JavaMail para enviar emails com o Java, para criar um cabeçalho em todos os emails eu pego a imagem e coloco no inicio do html da mensagem (corpo da mensagem).Porém, no leitor de emails aparece aquela para abrir a imagem ( ela não vem aberta por padrão ). Tá certo achei que isso fosse um padrão já que recebo várias mensagens que precisam ser clicadas na barra para abrir a imagem.

A mensagem relacionada a carregar conteúdo remoto, mas como eu faço para o conteúdo não ser remoto já que é um email?

PORÉM, ao utilizar papel de carta do outlook express não aparece essa mensagem.

Alguma sugestão?

9 Respostas

C

Você pode criar seu email como multipart/alternative e colocar a imagem junto ao email como uma referencia.

Exemplo:

ByteArrayOutputStream bos = ....// sua imagem
	MimeBodyPart imagePart = new MimeBodyPart();
		// Loading the image
		DataSource ds = new ByteArrayDataSource(bos.toByteArray(), "image/png");
		imagePart.setDataHandler(new DataHandler(ds));
		imagePart.setFileName("selo.png");
		// Setting the header
		imagePart.setHeader("Content-ID", "<image>");
		imagePart.setDisposition("inline");

Ai no email voce faz a referência:

<img alt="Selo" src="cid:image" >

Abraço

R

Não entendi isso porque cid:image?

<img alt="Selo" src="cid:image" >

Está enviando o email aparece apenas a mensagem Selo ( em vez da imagem )

C

o cid seria o id da imagem que voce informou.

imagePart.setHeader("Content-ID", "<image>");

Estranho não ter funcionado. Envie seu código!

Abraço

R
Multipart corpo; //está em outra parte do código mas  pra saber qual o tipo da variavel corpo

MimeBodyPart mbp1 = new MimeBodyPart();

URL url = new URL(imagem);
BufferedImage image = ImageIO.read(url);
			
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "png", bos);
			
MimeBodyPart imagePart = new MimeBodyPart();   
// Loading the image   
DataSource ds = new ByteArrayDataSource(bos.toByteArray(), "image/png");   
imagePart.setDataHandler(new DataHandler(ds));   
imagePart.setFileName("selo.png");   
// Setting the header   
imagePart.setHeader("Content-ID", "<image>");   
imagePart.setDisposition("inline");  
		    
if(corpo == null)
   corpo = new MimeMultipart();
		    
corpo.addBodyPart(imagePart); 
		    
String tag_imagem = "<img alt='Selo' src='cid:image' />";

String htmlText = tag_imagem + "<br><br>" + mensagem + "<br>"
					+ rodape;

mbp1.setContent(htmlText, "text/html");
C

Cria o corpo assim:

MimeMultipart corpo = new MimeMultipart("alternative");

ou assim:

MimeMultipart corpo = new MimeMultipart("related");
R

Agora deu certo em partes.Não usei essa string no construtor.

Se eu coloco a MimeBodyPart que tem a imagem em uma Multpart e coloca como content da mensagem, ela aparece por padrão na padrão ( como eu preciso ), porém a imagem vai como anexo também. ( isso está certo? )

Além disso, não sei se tem como colocar dois Multpart na mesma mensagem.

O certo seria colocar mensagem do email, anexos e imagem em um mesmo multipart e referenciá-la pelo cid:image? Esse apontamento do src não está funcionando…

R

Ao colocar tudo no mesmo Multipart a imagem não acha nada no src ( fica aquele icone de imagem não encontrada ), e a imagem aparece abaixo carregada no anexo.Assim como uma cópia dela em anexo.

R

Alguma sugestão para me ajudar?

P

Prezados amigos, estou com um problema semelhante ao relatado nesse tópico, porém ainda não consegui enviar a imagem no corpo do e-mail e sim somente como anexo. Se puderem me ajudar, segue abaixo o codigo que eu estou utilizando.

public TesteEMAIL() throws AddressException, MessagingException {
        //objeto para definicao das propriedades de configuracao do provider  
        Properties props = new Properties();
        //Propriedades da mensagem  
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.host", "smtp.gmail.com");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.port", "587");
        final String pwd = "XXXXXX";
        final String remetente = "[email removido]";
        String destinatario = "[email removido]";
        //obtendo um Session com a configuração   
        //do servidor SMTP definida em props  
        Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() { 
            @Override
                protected PasswordAuthentication getPasswordAuthentication() { 
                    return new PasswordAuthentication( 
                            remetente, pwd);
                }});
        //criando a mensagem  
        MimeMessage message = new MimeMessage(session);
        //substituir pelos e-mails desejados  
        Address from = new InternetAddress(remetente);
        Address to = new InternetAddress(destinatario);
        //configurando o remetente e o destinatario  
        message.setFrom(from);
        message.addRecipient(RecipientType.TO, to);
        //configurando a data de envio,  o assunto e o texto da mensagem  
        message.setSentDate(new Date());
        message.setSubject("Assunto da mensagem");
        //message.setText("Texto da mensagem!");
        String imagem = "C:\\Users\\xxxxx\\Desktop\\Metodologia.jpg";
        message.setText(imagem);
    //    message.setText(new FileDataSource(imagem));
        //enviando  
        Transport.send(message);
    }

Um detalhe é que nos exemplos enviadas, vocês estão tratando a mensagem como multipart, mas como eu vou trabalhar somente com a imagem e não vou colocar texto, seria necessário?

Criado 29 de abril de 2010
Ultima resposta 30 de jul. de 2012
Respostas 9
Participantes 3