Java SMTPS로 인증·암호화하여 메일 송신(본문+첨부 파일)

소개



SMTPS로 이메일 계정을 인증한 다음 암호화하여 이메일을 전송합니다.
다음에 본문과 첨부 파일의 구성 예로 합니다.

사전에 다음 라이브러리를 준비합니다.
  • JavaMail API
  • h tp // w w. 오라 cぇ. 이 m / ch ch와 rk / 쟈 ゔ ぁ / ゔ ぁ 세이브 네 s / 드 w ぉ 아 ds / 쟈 ゔ 아 r ゔ ぇ-419426. html # 그럼 ㅁ 마이 l-1.4.7-Oh-THR JPR
  • ※ "javamail1_4_7.zip"의 링크에서 다운로드


  • 구현 예



    샘플에서는, 동작 확인하기 쉽게 main 메소드로 실행할 수 있도록 하고 있습니다.

    SMTPSTest.java
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.util.Date;
    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    import javax.mail.util.ByteArrayDataSource;
    
    /**
     *
     * @author tool-taro.com
     */
    public class SMTPSTest {
    
        public static void main(String[] args) throws MessagingException, IOException {
    
            String from = "差出人メールアドレス";
            String fromName = "差出人名を指定します";
            String subject = "件名を指定します";
            String to = "宛先メールアドレス";
            String toName = "宛名を指定します";
            String body = "これは本文です。\n\n\n\n\n\n\n\n\n\n以上。";
            String attachmentFileName = "添付ファイル名.txt";
            String attachmentFileType = "text/plain; charset=UTF-8";
            byte[] attachmentFileBody = "これは添付ファイルです。\n\n\n\n\n\n\n\n\n\n以上。".getBytes("UTF-8");
    
            String host = "メール送信サーバホスト";
            String user = "メール送信アカウント";
            String password = "メール送信アカウントパスワード";
    
            Properties properties;
            Session session;
            Store store = null;
            Transport transport = null;
            MimeMessage mimeMessage;
            MimeBodyPart messageBody;
            MimeMultipart multipart;
            InternetAddress[] address;
    
            try {
                properties = System.getProperties();
                properties.setProperty("mail.transport.protocol", "smtps");
                properties.setProperty("mail.smtp.port", "465");
                properties.setProperty("mail.smtp.auth", "true");
                properties.setProperty("mail.smtp.starttls.enable", "true");
                properties.setProperty("mail.smtp.starttls.required", "true");
                properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
                properties.setProperty("mail.smtp.socketFactory.fallback", "true");
    
                session = Session.getInstance(properties);
    
                mimeMessage = new MimeMessage(session);
                //件名は(一応)JISで
                mimeMessage.setSubject(MimeUtility.encodeText(subject, "iso-2022-jp", "B"), "iso-2022-jp");
                mimeMessage.setSentDate(new Date());
    
                address = new InternetAddress[1];
                address[0] = new InternetAddress(from);
                //差出人名は設定しなくても問題ない
                if (fromName != null) {
                    //差出人名は(一応)JISで
                    address[0].setPersonal(MimeUtility.encodeText(fromName, "iso-2022-jp", "B"));
                }
                mimeMessage.setFrom(address[0]);
    
                address[0] = new InternetAddress(to);
                //宛名は設定しなくても問題ない
                if (toName != null) {
                    //宛名は(一応)JISで
                    address[0].setPersonal(MimeUtility.encodeText(toName, "iso-2022-jp", "B"));
                }
                mimeMessage.setRecipients(Message.RecipientType.TO, address);
    
                /*
                    マルチパートのメッセージを作成する
                    構造
                        パート1: 本文
                        パート2: 添付ファイル
                 */
                multipart = new MimeMultipart();
                mimeMessage.setContent(multipart);
    
                //パート1: 本文
                messageBody = new MimeBodyPart();
                //本文のテキストは(一応)JISで
                messageBody.setText(body, "iso-2022-jp");
                messageBody.setHeader("Content-Transfer-Encoding", "7bit");
                multipart.addBodyPart(messageBody);
    
                //パート2: 添付ファイル
                messageBody = new MimeBodyPart();
                //添付ファイル名は(一応)JISで
                messageBody.setFileName(MimeUtility.encodeText(attachmentFileName, "iso-2022-jp", "B"));
                messageBody.setDataHandler(new DataHandler(new ByteArrayDataSource(new ByteArrayInputStream(attachmentFileBody), attachmentFileType)));
                multipart.addBodyPart(messageBody);
    
                transport = session.getTransport();
                transport.connect(host, user, password);
                transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
            }
            finally {
                if (store != null) {
                    try {
                        store.close();
                    }
                    catch (MessagingException e) {
                    }
                }
                if (transport != null) {
                    try {
                        transport.close();
                    }
                    catch (MessagingException e) {
                    }
                }
            }
        }
    }
    

    동작 확인


    $ javac SMTPSTest.java
    $ java SMTPSTest
    

    보낸 메일을 살펴 보겠습니다.

    지정한대로
  • 보낸 사람 이름
  • 주소
  • 제목
  • 본문
  • 첨부 파일 이름

  • 가 표시됩니다.

    첨부 파일을 열어보십시오.

    <<<<<<< HEAD

    환경



    =======

    환경






    YOUR_EDITION
    - 개발
    - Windows 10 Pro
    - JDK 1.8.0_112
    - NetBeans IDE 8.2




  • 동작 검증
  • CentOS Linux release 7.2
  • JDK 1.8.0_112


  • 웹 도구도 공개하고 있습니다.
    웹 편리 도구 @ 도구 타로

    좋은 웹페이지 즐겨찾기