I had created a nodejs mail server on a AL2023 linux vm using SMTP server npm package. I am able to receive email successfully, but I am not able to send emails. I have configured ports 25 and 587 on security group. Not sure what else is needed to be done.
I start the server on ports 25 and 587. when mail is sent to the server it gets received successfully but when i try to send mail using my custom server, i am not able to send.
on server i have tried commands like netstat -tuln
to check if the correct ports are open which is working correctly.
i was able to use the same code of send mail client with gmail as mail server and it worked correctly. for sure the issue must be in some configuration of my mail server
server code
import path from "node:path";
import dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname + './../../.env')});
import fs from 'fs';
import connectDB from "./db";
import logger from "./logger";
import { SMTPServer } from "smtp-server";
import { simpleParser } from "mailparser";
import MailRepository from "./repositories/mail.repository";
const repo = new MailRepository();
const server = new SMTPServer({
onConnect(session, cb) {
cb();
},
onMailFrom(address, session, cb) {
cb();
},
onRcptTo(address, session, cb) {
cb();
},
onData(stream, session, callback) {
simpleParser(stream)
.then((parsed) => {
const obj = {
mail: JSON.parse(JSON.stringify(parsed)),
};
repo.create(obj);
callback(null);
})
.catch((err) => {
console.error("Error parsing email:", err);
callback(err);
});
},
disabledCommands: ["AUTH"],
disableReverseLookup: true,
logger: false,
secure: false,
hideSTARTTLS: true,
hide8BITMIME: true,
hidePIPELINING: true,
hideSMTPUTF8: true,
});
const serverFor587 = new SMTPServer({
authOptional: false,
onAuth(auth, session, cb){
try{
logger.info('587 on auth : username - '+ auth.username + ' password - ' + auth.password);
if (auth.username === 'demo' && auth.password === 'Demo@123') {
cb(null, { user: 'demo' });
} else {
cb(new Error('Authentication failed'));
}
}
catch(err){
logger.error('on auth error :' + err);
cb(new Error("Authentication Failed"));
}
},
onConnect(session, callback) {
logger.info('Client connected, sending greeting...');
callback();
},
onData(stream, session, callback) {
logger.info('ondata');
stream.pipe(process.stdout);
stream.on('end', callback);
},
onClose(session) {
console.log('Connection closed from:', session.remoteAddress);
},
secure: false,
needsUpgrade: true, // Enable STARTTLS
key: fs.readFileSync('/etc/letsencrypt/live/mail.demo.in/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/mail.demo.in/fullchain.pem')
});
serverFor587.on('error', (err) => {
logger.error('Error:', err);
});
connectDB()
.then(() => {
server.listen(25, () => logger.info("mail server running on port 25 for receiving mails"));
serverFor587.listen(587, () => logger.info("mail server running on port 587 for sending mails"));
})
.catch((err) => {
logger.error("db connection failed !!! ", err);
});
send mail client
import nodemailer from 'nodemailer';
import logger from "./../logger/log.js";
export class SendMails{
private transporter = nodemailer.createTransport({
host: 'mail.demo.in',
port: 587,
secure: false,
auth: {
user: 'demo',
pass: 'Demo@123'
},
tls: {
rejectUnauthorized: false
}
});
constructor(){
this.transporter
.verify()
.then(result => logger.info("mailer connected "+ result))
.catch(err => logger.error("error in mail connection " + err));
}
async sendMail(frm: string, to: string, cc:string, bcc:string, sbjct: string, text: string, html: string){
await this.transporter.sendMail(
{
from: frm,
to: to,
subject: sbjct,
text: text,
html: html,
cc:cc,
bcc:bcc,
},
function (error, info) {
if (error) {
logger.error(error);
} else {
logger.info("Email sent: " + info.response);
}
}
);
}
}
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744863731a4597854.html
评论列表(0条)