Enviar e-mail com texto e anexo [RESOLVIDO]

7 respostas Resolvido
java
G

Criei um código para enviar e-mails com texto e anexo, porém, ao executar, a exceção IOException aparece mesmo tendo um arquivo(a mensagem que aparece é “IOException wilhe sending message”). Poderiam ajudar?

[CODE]

public void enviarComArquivo(File arquivo, String titulo, String descricaoEmail, String destinatario,
String copia) {

final String email = "[email removido]"; 
	final String password = "senha"; 
	String host = "smtp";

	Properties props = new Properties();
	props.put("mail.smtp.auth", "true");
	props.put("mail.smtp.starttls.enable", "true");
	props.put("mail.smtp.host", host);
	props.put("mail.smtp.port", "porta");

	Session session = Session.getInstance(props, new Authenticator() {
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(email, password);
		}
	});

	try {
		MimeMessage message = new MimeMessage(session);
		MimeBodyPart mbp = new MimeBodyPart();
		Multipart mp = new MimeMultipart();

		message.setFrom(new InternetAddress(email));

		message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
		message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(copia));
		message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse("[email removido]"));

		message.setSubject(titulo);

		message.setText(descricaoEmail);

		DataSource file = new FileDataSource(arquivo.getName());
		message.setDisposition(Part.ATTACHMENT);
		message.setDataHandler(new DataHandler(file));
		message.setFileName(file.getName());

		mp.addBodyPart(mbp);
		message.setContent(mp);

		Transport.send(message);

	} catch (MessagingException me) {
		JOptionPane.showMessageDialog(null, me.getMessage());
	}

}

7 Respostas

L

Posta a exceção completa.

G

Diz o seguinte:

javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.IOException: No MimeBodyPart content at com.sun.mail.smtp.SMTPTransport.sendMessage

L

Ao realizar o envio o valor de descricaoEmail está null? Pelo que li, tem que mandar pelo menos uma string vazia como corpo da mensagem.

G

De todos os parâmetros, o único que tem algo ‘null’ é o filePath do arquivo. e dos restante, MimeBodyPart.

G

Consegui resolver a exceção ao adicionar “mbp.attachFile(arquivo);” no código, porém no e-mail mostra apenas o arquivo e não o texto (descricaoEmail) junto.

[CODE]

public void enviarComArquivo(File arquivo, String titulo, String descricaoEmail, String destinatario,
String copia) {

final String email = "[email removido]"; 
	final String password = "senha"; 
	String host = "smtp";

	Properties props = new Properties();
	props.put("mail.smtp.auth", "true");
	props.put("mail.smtp.starttls.enable", "true");
	props.put("mail.smtp.host", host);
	props.put("mail.smtp.port", "porta");

	Session session = Session.getInstance(props, new Authenticator() {
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(email, password);
		}
	});

	try {
		MimeMessage message = new MimeMessage(session);
		MimeBodyPart mbp = new MimeBodyPart();
		Multipart mp = new MimeMultipart();

		message.setFrom(new InternetAddress(email));

		message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
		message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(copia));
		message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse("[email removido]"));

		message.setSubject(titulo);

		message.setText(descricaoEmail);

		DataSource file = new FileDataSource(arquivo.getName());
		message.setDisposition(Part.ATTACHMENT);
		message.setDataHandler(new DataHandler(file));
		message.setFileName(file.getName());

               mbp.attachFile(arquivo);
		mp.addBodyPart(mbp);
		message.setContent(mp);

		Transport.send(message);

	} catch (MessagingException me) {
		JOptionPane.showMessageDialog(null, me.getMessage());
	}

}
L
Solucao aceita

Tente adicionar o texto do email como outro bodypart:

MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(descricaoEmail);

//...

mp.addBodyPart(textBodyPart);
G

Obrigado @Lucas_Camara! Resolveu meu problema! Segue o código finalizado e funcional:

public void enviarComArquivo(File arquivo, String titulo, String descricaoEmail, String destinatario,
String copia) {

	final String email = "[email removido]"; 
	final String password = "senha"; 
	String host = "smtp";

	Properties props = new Properties();
	props.put("mail.smtp.auth", "true");
	props.put("mail.smtp.starttls.enable", "true");
	props.put("mail.smtp.host", host);
	props.put("mail.smtp.port", "porta");

	Session session = Session.getInstance(props, new Authenticator() {
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(email, password);
		}
	});

	try {
		MimeMessage message = new MimeMessage(session);
		MimeBodyPart mbp = new MimeBodyPart();
		Multipart mp = new MimeMultipart();
        MimeBodyPart textBodyPart = new MimeBodyPart();

		message.setFrom(new InternetAddress(email));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(destinatario));
		message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(copia));
		message.setRecipients(Message.RecipientType.BCC, InternetAddress.parse("[email removido]"));

		message.setSubject(titulo);
		textBodyPart.setText(descricaoEmail);
		mp.addBodyPart(textBodyPart);

		DataSource file = new FileDataSource(arquivo.getName());
		message.setDisposition(Part.ATTACHMENT);
		message.setDataHandler(new DataHandler(file));
		message.setFileName(file.getName());

        mbp.attachFile(arquivo);
		mp.addBodyPart(mbp);
		message.setContent(mp);

		Transport.send(message);

	} catch (MessagingException me) {
       JOptionPane.showMessageDialog(null, me.getMessage());
	}
}
Criado 4 de agosto de 2020
Ultima resposta 5 de ago. de 2020
Respostas 7
Participantes 2