본문 바로가기

Web

SMTP - IMAP/SMTP (메일서버)사용해서 메일 발송

1. SMTP 서버

SMTP 서버(메일 발송하는 서버)
: ① POP3 (메일을 수신 받을 경우 PC에 저장됨/단,서버에는 저장하지 X),
 ② IMAP3 (메일을 수신받을 경우 PC와 서버에 저장)

=> 도메인이 필수조건 ( -> localhost, 127.0.0.1, IP주소 X)
도메인 : 화이트 도메인(white domain) - SPF로 서버에 등록시 100% 메일을 송 수신

=> 무조건 SMTP 서버를 쓰고 , POP3 or IMAP 중 선택1하는 형태

● TLS(전송통신보안 정책) 레벨
SHA1 -> TLS 1.0
SHA2 -> TLS 1.2
SHA3 -> TLS 1.3

● MIME
=> 인터넷 프로토콜 서비스 HTTP로 서로 통신하는 전자우편

 

 

2. SMTP 서버 이용해서 메일 전송 (네이버메일 활용함)

● 네이버메일 설정 (서버 주소 확인)

 

3. 해당 정보를 메일로 발송하기 (qamailok.do 생성)

① maven 에서 javamail API 와
JavaBeans(TM) Activation Framework ( jdk 8 이상일 경우만) 라이브러리
다운받아 점프 시킴 (module path 말고 classpath로 점프시켜야함)
- 간단하게 구현해보기 위해 JavaMail API는 compat 버전 사용 , 현재 jdk - 11 쓰기 때문에 javax.activation 추가로 다운 받음


② 코드 세부 설명
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String ename=request.getParameter("ename");
		String fromemail=request.getParameter("fromeamil");
		String epass=request.getParameter("epass");
		String subject=request.getParameter("subject");
		String mailtext=request.getParameter("mailtext");​

1 ) 메일 서버 (기본정보)
		String host = "smtp.naver.com";
		String login_user = "네이버아이디";
		String login_pass = "";
		String to_mail = "네이버메일@naver.com"; // 받는 메일주소

2 ) properties 활용해서 SMTP 설정값 세팅 - 파일을 따로 만들지 않고 do에서 바로 생성
		//메일서버 SMTP 세팅 설정 값
        Properties pp = new Properties();
        //메일서버 도메인주소
		pp.put("mail.smtp.host", host);
        //메일서버 전송 port 번호
		pp.put("mail.smtp.port", 587);
        //로그인에 대한 암호화 사용
		pp.put("mail.smtp.auth", "true");
        //메일 회신 주소가 잘못 되어 반송 되는 사항
		pp.put("mail.smtp.debug", "true");
        //메일 발송에 대한 소켓 포트 통신
		pp.put("mail.smtp.socketFactoty.port", 587);
		//TLS(전송통신보안 정책)
		pp.put("mail.smtp.ssl.protocols", "TLSv1.2");​

3 ) 해당 서비스에 자동 로그인으로 서버에 접근하는 암호화 형태의 코드
 - session 클래스 로드시 유의!

	Session ss = Session.getDefaultInstance(pp, new Authenticator() {
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			// TODO Auto-generated method stub
			return new PasswordAuthentication(login_user,login_pass);
		}
	});​


4 ) 실제 발송 실행하는 코드

	try {
		//MIME => 인터넷 프로토콜 서비스 HTTP로 서로 통신하는 전자우편
		MimeMessage msg = new MimeMessage(ss);
        
        //보내는 사람의 정보 (이메일,이름)
		msg.setFrom(new InternetAddress(fromemail,ename));
        
        //받는사람의 정보
    msg.addRecipient(Message.RecipientType.TO,new InternetAddress(to_mail));
		//메일 제목
    msg.setSubject(subject);
		//메일 내용
    msg.setText(mailtext);
		//메일 발송
    Transport.send(msg);
		
        //최종 결과값 출력
        PrintWriter pw = response.getWriter();
		pw.write("<script>"
				+ "alert('메일 발송이 정사적으로 되었습니다.');"
				+ "location.href='./qamail.jsp';"
				+ "</script>");
		pw.close();
		
	} catch (Exception e) {
		System.out.println("메일 발송 실패");
	}


5 ) 발송 실행



6 ) 전체 코드

public class qamailok extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String ename=request.getParameter("ename");
		String fromemail=request.getParameter("fromeamil");
		String epass=request.getParameter("epass");
		String subject=request.getParameter("subject");
		String mailtext=request.getParameter("mailtext");
		//SMTP (메일 발송하는 서버), 
		//POP3(메일을 수신 받을 경우 PC에 저장됨/단,서버에는 저장하지 X)
		//IMAP3(메일을 수신받을 경우 PC와 서버에 저장)
		
		//메일 서버 (기본정보)
		String host = "smtp.naver.com";
		String login_user = "네이버아이디";
		String login_pass = "";
		String to_mail = "네이버메일@naver.com"; // 받는 메일주소
		
		//메일서버 SMTP 세팅 설정값
		Properties pp = new Properties();
		pp.put("mail.smtp.host", host);
		pp.put("mail.smtp.port", 587);
		pp.put("mail.smtp.auth", "true");
		pp.put("mail.smtp.debug", "true");
		pp.put("mail.smtp.socketFactoty.port", 587);
		//TLS(전송통신보안 정책)
		pp.put("mail.smtp.ssl.protocols", "TLSv1.2");
		
		//해당 서비스에 자동 로그인으로 서버에 접근하는 암호화 형태의 코드
		Session ss = Session.getDefaultInstance(pp, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				// TODO Auto-generated method stub
				return new PasswordAuthentication(login_user,login_pass);
			}
		});		
		try {
			//MIME => 인터넷 프로토콜 서비스 HTTP로 서로 통신하는 전자우편
			MimeMessage msg = new MimeMessage(ss);
			msg.setFrom(new InternetAddress(fromemail,ename));
			msg.addRecipient(Message.RecipientType.TO,new InternetAddress(to_mail));
			msg.setSubject(subject);
			msg.setText(mailtext);
			Transport.send(msg);
			PrintWriter pw = response.getWriter();
			pw.write("<script>"
					+ "alert('메일 발송이 정상적으로 되었습니다.');"
					+ "location.href='./qamail.jsp';"
					+ "</script>");
			pw.close();			
		} catch (Exception e) {
			System.out.println("메일 발송 실패");
		}
	}
}

 

'Web' 카테고리의 다른 글

security 모든 형태 구조 + properties 활용  (0) 2024.07.05
[jsp] jsp 에서 split 사용  (0) 2024.07.05
로그인 / 로그아웃  (0) 2024.07.03