티스토리 뷰
1. 계정 설정 (App 비밀번호 생성)
- 보안 > Google에 로그인 > 앱 비밀번호
https://myaccount.google.com/apppasswords
로그인 - Google 계정
하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인
accounts.google.com
2. activation.jar, mail.jar 추가
-maven
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
-gradle
implementation 'javax.mail:mail:1.4'
implementation 'javax.activation:activation:1.1.1'
3. 소스
import java.util.Date;
import java.util.Properties;
import java.util.Scanner;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class SendMailToCustomers {
private static final String bodyEncoding = "UTF-8";
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
// TEST용
String gmailId = "";
String password = ""; // 발급받은 앱 패스워드
String sender = "홍길동";
sendMail(gmailId, password, sender);
System.out.println("Gmail 아이디를 입력하세요.");
String gmailId = sc.next();
System.out.println("Gmail 앱 패스워드를 입력하세요.");
String password = sc.next();
System.out.println("발신자를 입력하세요.");
String sender = sc.next();
// System.out.println("수신자와 참조인을 정확히 확인 후 발송바랍니다. 계속 진행하시려면 Y, 종료하시려면 N를 입력하세요.");
// while(true) {
// String sendYN = sc.next();
// if("Y".equals(sendYN)){
// sendMail(gmailId, password, sender);
// } else if("N".equals(sendYN)){
// System.out.println("입력을 종료합니다.");
// System.exit(0);
// } else{
// System.out.println("다시 입력해 주세요");
// }
// }
}
public static void sendMail(String gmailId, String password, String sender) throws Exception{
String subject = "테스트 메일입니다.";
//수신인
String[] recipients = {"A@gmail.com",
"B@gmail.com" };
//참조인
String[] references = {"C@gmail.com",
"D@gmail.com" };
//첨부파일
String[] attachedFiles = {"D:/util/test.txt",
"D:/util/test.txt"};
//메일 옵션 설정
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.quitwait", "false");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
try {
//메일 서버 인증 계정 설정
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(gmailId, password);
}
};
//메일 세션 생성
Session session = Session.getInstance(props, auth);
//MIME 타입 설정
MailcapCommandMap MailcapCmdMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
MailcapCmdMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
MailcapCmdMap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
MailcapCmdMap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
MailcapCmdMap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
MailcapCmdMap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(MailcapCmdMap);
//메일 송/수신 옵션 설정
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(gmailId, sender));
message.setSubject(subject);
message.setSentDate(new Date());
MimeBodyPart mbp = new MimeBodyPart();
Multipart mp = new MimeMultipart();
StringBuilder sb = new StringBuilder();
for (int i=0; i < references.length; i++) {
mbp = new MimeBodyPart();
mp = new MimeMultipart();
sb.setLength(0);
//메일에 출력할 텍스트
sb.append("<h4>안녕하세요.</h4>");
sb.append("<h4>TEST용 메일 발송입니다..</h4>");
String sendText = sb.toString();
MimeBodyPart mTextPart = new MimeBodyPart();
mTextPart.setText(sendText, bodyEncoding, "html");
mp.addBodyPart(mTextPart);
//보낼 첨부파일이 여러 개 일 경우
if(attachedFiles[i].contains(",")){
String[] attachedFiles2 = attachedFiles[i].split(",");
for (int j=0; j < attachedFiles2.length; j++) {
FileDataSource fds = new FileDataSource(attachedFiles2[j]);
mbp = new MimeBodyPart();
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
} else{
FileDataSource fds = new FileDataSource(attachedFiles[i]); //파일 읽어오기
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
message.setContent(mp);
//수신인
message.setRecipients(RecipientType.TO, InternetAddress.parse(recipients[i], false));
//참조인
message.setRecipients(RecipientType.CC, InternetAddress.parse(references[i], false));
Transport.send( message);
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
'개발 > Java' 카테고리의 다른 글
[Java] - Garbage Collection(GC) Eden 의미 (2) | 2022.09.21 |
---|---|
[Java] - Comparator (0) | 2021.10.21 |