내가 작성한 파일첨부 메일 전송 코드는 다음과 같고, FileNotFoundException은 convert 메소드의 try-catch문에서 FileOutputStream 과정에서 발생했다.

public Map sendMail(Map mailparam, MultipartFile multipartFile, String uri) throws Exception {
	MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
	mailparam.forEach((key, value) -> body.add((String) key, value));
    
	if(multipartFile!=null) body.add("files", new FileSystemResource(convert(multipartFile)));
	Map resultMap = JsonToMap(sendMail(body, uri));

	// 서버 오류
	if (...) { throw new Exception("메일전송 에러 발생"); }
	return resultMap;
}

// MultipartFile을 File로 변환하는 메소드
private File convert(MultipartFile file) throws IOException {
	File convertedFile = new File(file.getOriginalFilename());
	try (FileOutputStream fos = new FileOutputStream(convertedFile)) {
		fos.write(file.getBytes());
	}
	return convertedFile;
}

 

해당 에러가 발생했을 때 해결방법으로 처음 적용했던 방법은 IntelliJ를 관리자 권한으로 실행시킨 것이다. 
이 방법은 로컬환경에서는 임시로 해결이 되었으나, 개발과 운영서버에 배포 후에는 다시 같은 에러가 발생하였다.

 

 

그 이후, 문제의 FileOutputStream이 있는 convert 메소드를 사용하지 않고 multipartFile.getResource()를 사용하니 액세스 거부없이 파일을 가져올 수 있었다.

public Map sendMail(Map mailparam, MultipartFile multipartFile, String uri) throws Exception {
	MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
	mailparam.forEach((key, value) -> body.add((String) key, value));
    
	if(multipartFile!=null) body.add("files", multipartFile.getResource());
	Map resultMap = JsonToMap(sendMail(body, uri));

	// 서버 오류
	if (...) { throw new Exception("메일전송 에러 발생"); }
	return resultMap;
}

 

 

 

 

 

+ Recent posts