Node.js 애플리케이션에서 Nodemailer를 사용하여 네이버 WorksMobile(구 라인웍스) SMTP 서버를 통해 이메일을 발송하는 방법을 정리합니다.
WorksMobile은 기업용 협업 메신저 및 메일 서비스로, SMTP/IMAP을 통한 외부 앱 연동을 지원합니다.
| 항목 | 값 |
|---|---|
| SMTP 서버명 | smtp.worksmobile.com |
| SMTP 포트 | 587 (STARTTLS/TLS) 또는 465 (SSL) |
| 보안 연결 | STARTTLS/TLS 권장, SSL 대체 가능 |
| 인증 | 필수 (외부 앱 비밀번호 사용) |
| 항목 | 값 |
|---|---|
| IMAP 서버명 | imap.worksmobile.com |
| IMAP 포트 | 993 (SSL) |
WorksMobile SMTP를 사용하려면 일반 계정 비밀번호가 아닌 외부 앱 전용 비밀번호를 생성해야 합니다.
외부 앱 비밀번호는 생성 시 한 번만 표시되므로, 반드시 안전한 곳에 보관하세요.
npm install nodemailer
# 또는
pnpm add nodemailer
yarn add nodemailer
npm install -D @types/nodemailer
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'smtp.worksmobile.com',
port: 587,
secure: false, // STARTTLS 사용
auth: {
user: 'your-email@company.com',
pass: 'your-external-app-password', // 외부 앱 비밀번호
},
});
STARTTLS가 지원되지 않는 환경에서는 SSL을 사용할 수 있습니다.
const transporter = nodemailer.createTransport({
host: 'smtp.worksmobile.com',
port: 465,
secure: true, // SSL 사용
auth: {
user: 'your-email@company.com',
pass: 'your-external-app-password',
},
});
import nodemailer from 'nodemailer';
interface EmailOptions {
to: string;
subject: string;
html: string;
}
const transporter = nodemailer.createTransport({
host: 'smtp.worksmobile.com',
port: 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
async function sendEmail(options: EmailOptions): Promise<void> {
await transporter.sendMail({
from: process.env.SMTP_USER,
to: options.to,
subject: options.subject,
html: options.html,
});
}
민감한 SMTP 자격 증명은 환경 변수로 관리하는 것이 안전합니다.
.env 파일SMTP_USER=your-email@company.com
SMTP_PASS=your-external-app-password
SMTP_FROM=your-email@company.com
require('dotenv').config();
const transporter = nodemailer.createTransport({
host: 'smtp.worksmobile.com',
port: 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
const mailOptions = {
from: 'sender@company.com',
to: 'recipient@example.com',
subject: '테스트 메일',
text: '안녕하세요, 이것은 테스트 메일입니다.',
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.error('이메일 발송 실패:', error);
} else {
console.log('이메일 발송 성공:', info.messageId);
}
});
const mailOptions = {
from: 'sender@company.com',
to: 'recipient@example.com',
subject: 'HTML 테스트 메일',
html: `
<h1>안녕하세요</h1>
<p>이것은 <strong>HTML 형식</strong>의 테스트 메일입니다.</p>
`,
};
await transporter.sendMail(mailOptions);
const mailOptions = {
from: 'sender@company.com',
to: 'recipient1@example.com, recipient2@example.com',
cc: 'cc@example.com',
bcc: 'bcc@example.com',
replyTo: 'reply@company.com',
subject: '다중 수신자 메일',
text: '여러 명에게 발송되는 메일입니다.',
};
await transporter.sendMail(mailOptions);
Next.js 환경에서 Server Actions를 사용하여 이메일을 발송하는 예제입니다.
// src/lib/email.ts
"use server";
import nodemailer from 'nodemailer';
const transporter = nodemailer.createTransport({
host: 'smtp.worksmobile.com',
port: 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
export async function sendContactEmail(formData: {
name: string;
email: string;
message: string;
}) {
try {
await transporter.sendMail({
from: process.env.SMTP_FROM,
to: process.env.SMTP_TO,
replyTo: formData.email,
subject: `${formData.name}님의 문의`,
html: `
<p><strong>이름:</strong> ${formData.name}</p>
<p><strong>이메일:</strong> ${formData.email}</p>
<p><strong>내용:</strong></p>
<p>${formData.message}</p>
`,
});
return { success: true };
} catch (error) {
console.error('이메일 발송 실패:', error);
return { success: false, error: '이메일 발송 중 오류가 발생했습니다.' };
}
}
secure 옵션과 포트 불일치secure: false (STARTTLS)secure: true (SSL)