Java

[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]

 

 

Leave a Reply

error: Content is protected !!