[JAVA] SMTP 메일 발송시 CID 방식으로 이미지 첨부하는 방법(ATT00001.bin 파일로 보일 때 해결방법)
이메일 발송시 이메일 내용 상단에 고객사별 로고 이미지를 img 태그에 url 방식으로 넣어주었다.
그러나 outlook과 이메일 보는 업무 사이트 등에서 이미지가 보이지 않았다.
아래는 그 예의 샘플 메일 발송코드이다.
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
class TstMail {
public static void main(String[] args) throws Exception{
System.out.println("Sending mail...");
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.mymailserver.com");
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
Transport transport = session.getTransport();
MimeMessage message = new MimeMessage(session);
message.setSubject("HTML mail with images");
message.setFrom(new InternetAddress("me@sender.com"));
message.setContent("<h1>메일본문 내용이야</h1>" + "<img src="http://www.google.com/images/test.gif">", "text/html");
message.addRecipient(Message.RecipientType.TO, new InternetAddress("test@test.com"));
transport.connect();
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
}
}
해결책을 알아보던 중 CID 라는 것을 알게 되었다. 이메일에 이미지를 url 링크방식으로 넣을 때 보안상 문제가 될 수 있어 사용하는 방식 중에 하나인 듯 하다.
CID(Content-ID)
이미지를 메일에 파일로 첨부하고 이메일 내용에 HTML IMG 태그에 CID 값을 설정해두면 메일이 열릴때 이미지를 해당 태그 위치에 보여주는 방법이다. 첨부된 이미지를 참조할 때는[cid] 라는 프로토콜과 메일헤더에 [content-id]를 사용하게 된다.
CID 방식의 메일 발송 샘플 코드는 다음과 같다.
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.Properties;
class TestMail {
public static void main(String[] args) throws Exception{
System.out.println("Sending mail...");
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.testMailserver.com");
props.setProperty("mail.user", "user");
props.setProperty("mail.password", "pwd");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
Transport transport = session.getTransport();
MimeMessage message = new MimeMessage(session);
message.setSubject("HTML mail with images");
message.setFrom(new InternetAddress("me@sender.com"));
// This HTML mail have to 2 part, the BODY and the embedded image
MimeMultipart mimeMultipart = new MimeMultipart("related");
// first part (the html)
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = "<H1>안녕하세요</H1><img src="cid:logo-image">";
messageBodyPart.setContent(htmlText, "text/html");
// add it
mimeMultipart.addBodyPart(messageBodyPart);
// second part (the image)
messageBodyPart = new MimeBodyPart();
// DataSource fds = new FileDataSource("C:imageslogo.gif"); // 로컬 경로
DataSource fds = new FileDataSource("/upload/logo.gif"); //서버 경로
messageBodyPart .setDataHandler(new DataHandler(fds));
messageBodyPart .setHeader("Content-ID","<logo-image>");
// add it
mimeMultipart.addBodyPart(messageBodyPart );
// put everything together
message.setContent(mimeMultipart);
transport.connect();
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
}
}
실제 사용하는 백엔드 코드에 CID관련 코드를 추가 후 메일 발송테스트를 하였는데
아웃룩에서는 이미지가 잘 보였으나 이메일을 확인하기 위해 사내 사이트에 로그인해서 확인했는데
이미지는 보이지 않고, ATT00001.bin 파일이 첨부되어 있고 그 이름만 로고 이미지 위치에 보여졌다.
해당 이슈를 해결하기 위해 다음 예제 코드를 시도하여 해결하였다. 그러나 이미지는 보이지 않는다.
아래 방법 역시 아웃룩에서는 정상적으로 이미지가 보인다.
mbp.setHeader("Content-ID", "<img-logo>");
//add this to avoid unwanted attachment.
mbp.setDisposition(MimeBodyPart.INLINE);
mbp.attachFile(new File(filePath));
mp.addBodyPart(mbp);
또는
mbp = new MimeBodyPart();
mbp.attachFile(new File(filePath));
mbp.setContentID("<img-logo>");
mbp.setDisposition(MimeBodyPart.INLINE);
mp.addBodyPart(mbp);
아래 선언방식은 문제되지 않았다.
// Multipart mp = new MimeMultipart();
MimeMultipart mp = new MimeMultipart("related");
[REFERENCE]
- https://stackoverflow.com/questions/55390869/un-necessary-attachment-added-in-the-mail-while-triggering-mail-using-java-mail
- https://icksss.tistory.com/entry/javamail-%EB%A1%9C-%EB%A9%94%EC%9D%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0body-%EC%97%90-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%B2%A8%EB%B6%80
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=deeperain&logNo=221387866492
- https://stackoverflow.com/questions/55390869/un-necessary-attachment-added-in-the-mail-while-triggering-mail-using-java-mail
- https://superuser.com/questions/309530/prevent-nail-from-attaching-my-message-as-a-bin-file
- https://stackoverflow.com/questions/40168941/how-can-i-avoid-the-creation-of-at00001-bin-file-instead-of-the-image-as-a-bod
- https://www.androidbugfix.com/2022/02/how-to-prevent-inline-images-from-being.html