[Node.js] Email 발송하기[Node.js] Email 발송하기
Posted at 2020. 5. 1. 16:24 | Posted in Node.jsAPI : https://nodemailer.com/about/
■ nodemailer 설치
$ npm install nodemailer |
■ Node.js 를 통해 이메일 보내기
# 소스코드
send_email.js |
// @breif nodemailer 모듈추출 const nodemailer = require( "nodemailer" ); // @details 글로벌 범위에서 대기할 수 없으므로 래퍼( wrapper )를 사용해야 함 async function main() { // @breif 기본 SMTP 전송을 사용하여 재사용 가능한 전송 개체 생성 const transporter = nodemailer.createTransport({ host : "smtp.naver.com" // @details 네이버(smtp.naver.com), 구글(smtp.google.com), 다음(smtp.daum.net) 등 , port : 465 , secure : true // @details PORT가 465인 경우 TRUE로 설정, 다른 경우 FALSE , auth : { user : "보내는 메일 주소" , pass : "보내는 메일 비밀번호" } }); // @breif 발송할 메일의 컨테츠 정보 let info = await transporter.sendMail({ from : "\"Fred Foo 👻\" <saak@wickedmiso.com>" // @details 보내는 사람 메일주소( user 메일주소와 일치해야함 ) , to : "받는이1@naver.com, 받는이2@daum.com" // @details 받는이(들) 메일주소 , subject : "Node.js 메일전송 테스트 ✔" // @details 메일주소 , text : "HTML 속성이 활성화 되어 있으면 비활성화 됨" // @details 메일 내용 , html : "<h1>사악미소의 현대마법의 IT 공방</h1>" // @details 메일 내용(HTML) }); console.log("Message sent : %s", info.messageId); } // @breif main() 함수를 실행 main().catch( console.error ); |
# 출력결과
$ node send_email.js Message sent: <df2a072a-b321-928f-f543-75e07693ac6c@wickedmiso.com> |
'Node.js' 카테고리의 다른 글
[Node.js] socket 통신으로 파일 업로드 하기 (0) | 2020.05.14 |
---|---|
[Noe.js] 실행시 값 입력하기 (0) | 2020.05.04 |
[Node.js] Excel 파일 생성하고 데이터 읽기 (2) | 2020.05.01 |
[Node.js] Serial Port를 이용한 Arduino 이벤트 실행 (0) | 2019.06.13 |
[Node.js] Terminal 명령을 수행하는 node_cmd 모듈 (0) | 2019.05.10 |
[Node.js] Excel 파일 생성하고 데이터 읽기[Node.js] Excel 파일 생성하고 데이터 읽기
Posted at 2020. 5. 1. 13:19 | Posted in Node.jsAPI : https://www.npmjs.com/package/xlsx
■ 엑셀 데이터 읽어오기
$ npm install xlsx |
■ 엑셀 데이터 읽어오기
# 엑셀파일
# 소스코드
excel_file_read.js |
// @breif xlsx 모듈추출 const xlsx = require( "xlsx" ); // @files 엑셀 파일을 가져온다. const excelFile = xlsx.readFile( "wise_life_doctor.xlsx" ); // @breif 엑셀 파일의 첫번째 시트의 정보를 추출 const sheetName = excelFile.SheetNames[0]; // @details 첫번째 시트 정보 추출 const firstSheet = excelFile.Sheets[sheetName]; // @details 시트의 제목 추출 // @details 엑셀 파일의 첫번째 시트를 읽어온다. const jsonData = xlsx.utils.sheet_to_json( firstSheet, { defval : "" } ); console.log( jsonData ); |
# 출력결과
$ node excel_file_read.js |
■ 엑셀 파일 작성하기
# 소스코드
excel_write_file.js |
// @breif xlsx 모듈추출 const xlsx = require( "xlsx" ); // @breif 가상의 엑셀파일을 생성한다. const book = xlsx.utils.book_new(); // -------------------------------------------------------------------- // @breif 1번 시트 // @breif aoa_to_sheet 방식으로 데이터를 생성한다. const doctors = xlsx.utils.aoa_to_sheet( [ [ "학과", "직급", "이름", "나이" ] , [ "흉부외과", "병원장", "주전", "67" ] , [ "흉부외과", "교수", "천명태", "52" ] , [ "흉부외과", "치프", "도재학", "39" ] , [ "소아외과", "레지던트", "장겨울", "29" ] , [ "산부인과", "레지던트", "추민하", "34" ] , [ "산부인과", "레지던트", "명은원", "28" ] , [ "신경외과", "교수", "민기준", "55" ] , [ "신경외과", "치프", "용석민", "33" ] , [ "신경외과", "레지던트", "안치홍", "38" ] , [ "신경외과", "레지던트", "허선빈", "31" ] , [ "응급의학과", "조교수", "봉광현", "40" ] , [ "응급의학과", "펠로우", "배준희", "31" ] ] ); // @breif CELL 넓이 지정 doctors["!cols"] = [ { wpx : 130 } // A열 , { wpx : 100 } // B열 , { wpx : 80 } // C열 , { wch : 60 } // D열 ] // @breif 첫번째 시트에 작성한 데이터를 넣는다. xlsx.utils.book_append_sheet( book, doctors, "DOCTOR" ); // -------------------------------------------------------------------- // @breif 2번 시트 // @details json_to_sheet 방식으로 데이터를 생성한다. const nurses = xlsx.utils.json_to_sheet( [ { A : "학과", B : "직급", C : "이름", D : "나이" } , { A : "흉부외과", B : "PA간호사", C : "소이현", D : "33" } , { A : "소아외과", B : "PA간호사", C : "한현희", D : "29" } , { A : "산부인과", B : "분만실간호사", C : "한한승주현희", D : "41" } , { A : "산부인과", B : "PA간호사", C : "은선진", D : "36" } , { A : "간담췌외과", B : "수간호사", C : "송수빈", D : "45" } , { A : "간담췌외과", B : "병동간호사", C : "이영하", D : "35" } , { A : "간담췌외과", B : "병동간호사", C : "김재환", D : "28" } , { A : "간담췌외과", B : "PA간호사", C : "국해성", D : "32" } , { A : "간담췌외과", B : "이식코디네이터", C : "함덕주", D : "37" } , { A : "신경외과", B : "PA간호사", C : "황재신", D : "39" } , { A : "응급의학과", B : "응급실간호사", C : "선우희수", D : "26" } ], { header : ["A", "B", "C", "D"], skipHeader : true } ); // @breif CELL 넓이 지정 nurses["!cols"] = [ { wpx : 130 } // A열 , { wpx : 100 } // B열 , { wpx : 80 } // C열 , { wch : 60 } // D열 ] // @details 두번째 시트에 작성한 데이터를 넣는다. xlsx.utils.book_append_sheet( book, nurses, "NURSES" ); // -------------------------------------------------------------------- // @files 엑셀파일을 생성하고 저장한다. xlsx.writeFile( book, "dramatis_personae.xlsx" ); |
# 실행결과
$ node excel_write_file.js |
'Node.js' 카테고리의 다른 글
[Noe.js] 실행시 값 입력하기 (0) | 2020.05.04 |
---|---|
[Node.js] Email 발송하기 (0) | 2020.05.01 |
[Node.js] Serial Port를 이용한 Arduino 이벤트 실행 (0) | 2019.06.13 |
[Node.js] Terminal 명령을 수행하는 node_cmd 모듈 (0) | 2019.05.10 |
[Node.js] SCRAPING을 위한 cheerio 모듈과 cheerio-httpcli 모듈 (0) | 2019.05.08 |
[JAVA] JVM 프로그램의 메모리 영역[JAVA] JVM 프로그램의 메모리 영역
Posted at 2020. 4. 27. 20:19 | Posted in JAVA출처 : Do it! 코틀린 프로그래밍
프로그램이 사용하는 메모리 영역에는 여러가지가 있다.
명령어가 들어가는 코드 영역과,
프로그램이 컴파일되면 문자열이나 정적 변수나 문자열 등이 들어가는 정적 메모리 영역인 데이터( Data ) 영역이 존재한다.
JVM에서는 이 영역을 메서드 정적 영역( Method Static Area )으로도 부룬다.
또 실행중 생성되는 객체는 동적 메모리 영역인 힙( Heap ) 이라고 불리는 곳에서 만들어 진다.
추가적으로 코드 블록인 중괄호( { } ) 안에 사용한 변수나 함수 호출 블록은 임시로 쓰이는 메모리 영역인 스택( Stack )에 들어가며,
중괄호 블록이 끝나면 임시로 사용한 변수는 스택에 제거된다.
데이터 영역은 정해져 있어서 실행중에 오류가 날 가능성은 적다.
힙과 스택은 프로그램이 동작하는 도중에 위 그림의 화살표 방향으로 채워지기 때문에 너무 많은 메모리를 할당하는 객체가 있다면
Out of Memory 오류가 날 수 있고, 함수 호출이 재귀적으로 너무 많이 일어나면
Stack Overflow 오류가 발생할 수 있다.
JVM을 사용하는 프로그램에는 동적 메모리 영역의 객체가 사용된 뒤 아무 참조가 없으면 자동으로 삭제하는
GC( Garbase Collector )가 존재한다.
GC란 일종의 쓰레기 청소부 역할을 해서, 우리도 모르게 쓸모없는 객체를 치워 주는 일을 한다고 생각하면 된다.
'JAVA' 카테고리의 다른 글
[JAVA] Windows 10 컴퓨터, JAVA 8 버전 설치하기 (0) | 2020.07.18 |
---|---|
[JAVA] 자바 개발자로서 알아야 하는 것들 (3) | 2020.02.18 |
[JAVA] 객체지향 개발과 관련 용어 (0) | 2019.12.27 |
[JAVA] Java의 역사와 JVM, 알아두어야 하는 상식 (0) | 2019.11.06 |
[JAVA] JAVA에서 Map 이란? (0) | 2018.07.17 |
[Kotlin] 코틀린 프로젝트 시작하기[Kotlin] 코틀린 프로젝트 시작하기
Posted at 2020. 4. 27. 00:12 | Posted in Kotlin■ 코틀린 프로젝트 시작하기
#01. 코틀린의 main( ) 함수는 프로그램의 실행 진입점
자바 같은 객체 지향 언어에서 프로그램을 실행하려면 최소한 하나의 클래스와 그 안에 main( ) 함구가 있어야 한다.
하지만 코틀린은 선언한 클래스가 없는데도 불구하고 main( )함수와 println( ) 함수를 통해 콘솔에 문자열 "Hello Kotlin"을 출력하고 있다.
코틀린 코드는 JVM에서 실행되며, main( ) 함수가 있는 파일 이름을 기준으로 자바 클래스가 자동 생성된다.
# 소스코드
helloKotlin.kt |
fun main(args:Array<String>) { println("Hello Kotlin!"); } |
위 코드를 저장하고 역컴파일 하면 아래와 같은 결과를 얻을 수 있다.
# 역컴파일
public final class HelloKotlinKt { public static final void main( ) { String var0 = "Hello Kotlin!"; System.out.println( var0 ); } // $FF : synthetic method public static void main(String[] var0) { main( ); } } |
# Eclipse 역컴파일 결과
※ 컴파일러 버전에 따라 결과가 다르게 보일 수 있다.
#02. 변환된 main( ) 메서드의 의미
public은 가시성 지시자로 이 메서드의 접근 방법을 가리킨다.
public은 helloKotlinKt 클래스의 외부 어디에서도 접근할 수 있다는 의미이다.
static은 이 메서드 정적 메서드임을 나타내고 있다.
static으로 선언하면 프로그램의 정적 메모리 영역에 객체가 만들어지기 때문에 객체의 생성 없이 호출해 사용할 수 있게 된다.
final은 최종 메서드임을 나타낸다.
void는 메서드가 반환할 것이 없는 경우 지정한다.
#03. 코틀린의 main( ) 메서드에서 매개변수를 사용할 경우
main( ) 메서드에서 매개변수 args : Array<string>을 사용하면 자바에서는 String[] args로 변환된다.
이 args는 main( )에 전달할 외부의 인자들을 가리키고, 명령행에서 입력받은 값을디 차례로 배열에 들어가 된다.
명령행 인자를 사용하기 위해 아래 코드를 작성해보자.
mainArgs.kt |
fun main( args : Array<String> ) { println( args[0] ); // 외부 첫 번째 인자 println( args[1] ); // 외부 두 번째 인자 println( args[2] ); // 외부 세 번째 인자 println( args[3] ); // 외부 네 번째 인자 } |
작성한 코드는 Run > Run Configurations 항목을 선택하여 실행할 수 있다.
프로그램을 실행하면 아래와 같은 결과를 얻을 수 있다.
# 출력결과
나이트엘프 언데드 오크 휴먼 |
명령행에서 입력받은 인자를 각각 args[0], args[1], args[2], args[3] 문자열 형태로 저장한 것이다.
※ Eclipse에서 Run Configurations 실행 방법
'Kotlin' 카테고리의 다른 글
[Kotlin] Eclipse를 이용한 Kotlin 작업환경 구성 (0) | 2020.03.01 |
---|---|
[Kotlin] 코틀린이란? (0) | 2020.02.12 |