안녕하세요:) 개발자 우디입니다! 아래 내용 관련하여 작업 중이신 분들께 도움이되길 바라며 글을 공유하니 참고 부탁드립니다😊
(이번에 벨로그로 이사오면서 예전 글을 옮겨적었습니다. 이 점 양해 부탁드립니다!)
function MainPage(props: ModalProps) {
const { openGlobalAlertModal } = props;
const isMobile = GetIsMobile();
const { state, dispatch } = useContext(ModalStateContext);
const [emailInput, setEmailInput] = useState('');
const [isEmailValid, setIsEmailValid] = useState(false);
const [isSendEmailButtonDisabled, setIsSendEmailButtonDisabled] = useState(false);
...
const checkEmail = useCallback(() => {
const emailRegExp =
/^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i;
const emailChecked = emailRegExp.test(emailInput);
setIsEmailValid(emailChecked);
}, [emailInput]);
useEffect(() => {
checkEmail();
}, [checkEmail]);
...
const onGetDownloadLinkBtnClick = () => {
...
if (!isEmailValid) {
openGlobalAlertModal(
'assets/globalAlertModalNoticeIcon.svg',
'알림',
'잘못된 형식의 이메일입니다.\n올바른 형식의 이메일을 입력해주세요.',
'Open',
);
return;
}
// send email
axiosInstance
.post('sendDownloadLinkEmail', {
email: emailInput,
})
.then(res => {
if (res.data === 'success') {
openGlobalAlertModal(
'assets/globalAlertModalSuccessIcon.svg',
'전송 완료',
'이메일로 다운로드 링크가 전송됩니다.\nPC를 통해 다운로드해주세요!',
'Open',
);
setIsSendEmailButtonDisabled(true);
...
}
})
.catch(err => {
console.log(err);
});
};
return (
<div className={styles.mainPageContainer}>
<div className={styles.mainPageInnerContainer}>
...
{isMobile ? (
<div className={styles.mainPageBottomContainerForMobile}>
<div className={styles.mainPageBottomContainerForMobileDesc}>
이메일을 입력하여 다운로드 링크를 받아보세요!
</div>
<input
className={styles.emailInput}
id="emailToGetDownloadLink"
value={emailInput}
onChange={handleChange}
placeholder="이메일을 입력해주세요"
/>
<button
type="button"
onClick={onGetDownloadLinkBtnClick}
className={styles.submitEmailButton}
disabled={isSendEmailButtonDisabled}
>
이메일로 다운로드 링크 받기
</button>
<div className={styles.mainPageBottomContainerForMobilAlertText}>
* 이메일이 수신되지 않았을 경우 스팸메일함을 확인해주세요.
</div>
</div>
) : (
...
node서버에서 메일을 보낼 수 있는 메일 전송 모듈인 nodemailer를 이용
client 단의 컴포넌트에서 post 요청을 보내면 서버 단의 app.js에서 요청을 받아 수행하는 구조로 진행함.
서버 단의 app.js
이메일 보내기 위해 필요한 함수들 정의
const nodeMailer = require('nodemailer');
...
// Send Mail Method
const mailPoster = nodeMailer.createTransport({
host: 'smtp.office365.com',
auth: {
user: '{your email}',
pass: '{your password}',
},
});
const mailOpt = (userEmail, title, contents) => {
const mailOptions = {
from: '{your email}',
to: userEmail,
subject: title,
html: contents,
};
return mailOptions;
};
const sendMail = mailOption => {
mailPoster.sendMail(mailOption, function (error, info) {
if (error) {
console.log('에러 ' + error);
} else {
console.log('전송 완료 ' + info.response);
}
});
};
post 요청을 받으면, 요청에 맞는 작업을 수행
app.post('/api/sendDownloadLinkEmail/', (req, res) => {
if (!req.body.email) {
res.status(400).json({
error: '잘못된 접근입니다.',
});
return;
}
// Email input value
const userEmail = req.body.email;
// Email additional info
const titleOfMailToSendDownloadLink = '...';
const mailOption = mailOpt(
userEmail,
titleOfMailToSendDownloadLink,
contentOfMailToSendDownloadLink,
);
sendMail(mailOption);
res.send('success');
});
메일 내용이 너무 길어서 모듈로 따로 관리