UNPKG

vpn.email

Version:
201 lines (200 loc) 6.75 kB
"use strict"; const smtpTransport = require("nodemailer-smtp-transport"); const nodemailer = require("nodemailer"); const util = require("./util"); const ramdonString = require("./randomString"); const async = require("async"); const proxyViaEmailTest = 'test@Vpn.Email'; exports.getImapHost = (email) => { const yahoo = (domain) => { if (/yahoo.co.jp$/.test(domain)) return 'yahoo.co.jp'; if (/((.*\.){0,1}yahoo|yahoogroups|yahooxtra|yahoogruppi|yahoogrupper)(\..{2,3}){1,2}$/.test(domain)) return 'yahoo.com'; if (/(^hotmail|^outlook|^live|^msn)(\..{2,3}){1,2}$/.test(domain)) return 'hotmail.com'; if (/^(me|^icould|^mac)\.com/.test(domain)) return 'me.com'; return domain; }; const emailSplit = email.split('@'); if (emailSplit.length !== 2) return null; const domain = yahoo(emailSplit[1]); const ret = { imap: 'imap.' + domain, smtp: 'smtp.' + domain, SmtpPort: [587, 465], ImapPort: 993, imapSsl: true, smtpSsl: true, haveAppPassword: false, ApplicationPasswordInformationUrl: [] }; switch (domain) { // yahoo domain have two different // the yahoo.co.jp is different other yahoo.* case 'yahoo.co.jp': { ret.imap = 'imap.mail.yahoo.co.jp'; ret.smtp = 'apple.smtp.mail.yahoo.co.jp'; } break; // gmail case 'google.com': case 'googlemail.com': case 'gmail': { ret.haveAppPassword = true; ret.ApplicationPasswordInformationUrl = [ 'https://support.google.com/accounts/answer/185833?hl=zh-Hans', 'https://support.google.com/accounts/answer/185833?hl=ja', 'https://support.google.com/accounts/answer/185833?hl=en' ]; } break; // yahoo.com case 'rocketmail.com': case 'y7mail.com': case 'ymail.com': case 'yahoo.com': { ret.imap = 'imap.mail.yahoo.com'; ret.smtp = (/^bizmail.yahoo.com$/.test(emailSplit[1])) ? 'smtp.bizmail.yahoo.com' : 'smtp.mail.yahoo.com'; ret.haveAppPassword = true; ret.ApplicationPasswordInformationUrl = [ 'https://help.yahoo.com/kb/SLN15241.html', 'https://help.yahoo.com/kb/SLN15241.html', 'https://help.yahoo.com/kb/SLN15241.html' ]; } break; // gmx.com case 'gmx.com': { ret.smtp = 'mail.gmx.com'; } break; // aim.com case 'aim.com': { ret.imap = 'imap.aol.com'; } break; // outlook.com case 'windowslive.com': case 'hotmail.com': case 'outlook.com': { ret.imap = 'imap-mail.outlook.com'; ret.smtp = 'smtp-mail.outlook.com'; } break; // apple mail case 'me.com': { ret.imap = 'imap.mail.me.com'; ret.smtp = 'smtp.mail.me.com'; } break; // 163.com case '126.com': case '163.com': { ret.imap = 'appleimap.' + domain; ret.smtp = 'applesmtp.' + domain; ret.SmtpPort = [465]; } break; case 'sina.com': case 'yeah.net': { ret.SmtpPort = [465]; ret.smtpSsl = false; } break; } return ret; }; exports.sendEmail = (option, to, text, fromEmail, sbject, cb) => { let transporter = nodemailer.createTransport(smtpTransport(option)); let sendMailOption = { from: fromEmail, to: [to], text: text, subject: sbject, attachments: [{ filename: ramdonString.getRamdomFileName(4, '_') + '.bin', content: text }] }; console.log('send email to :', to); transporter.sendMail(sendMailOption, cb); }; exports.testSMTP = (host, user, password, port, tls, CallBack) => { const option = { host: host, port: port, requireTLS: tls, auth: { user: user, pass: password } }; let transporter = nodemailer.createTransport(smtpTransport(option)); transporter.verify(err => { if (err) { if (/Invalid login/.test(err.message)) return CallBack(new Error('passwordErrMsg')); if (/Greeting never received|Connection timeout/.test(err.message)) return CallBack(new Error('hostPortTimeOut')); if (/getaddrinfo ENOTFOUND/.test(err.message)) return CallBack(new Error('hostAddrErr')); if (/unable to verify the first certificate|Hostname\/IP doesn't match certificate's/.test(err.message)) return CallBack(new Error('hostCertError')); if (/ECONNREFUSED/.test(err.message)) return CallBack(new Error('ECONNREFUSED')); return CallBack(new Error('UnknowErr')); } CallBack(); }); }; exports.tryConnectEmail = (SockSession) => { const env = SockSession.imapArray; env.systemPassword = null; const option = { host: env.smtpServer, port: parseInt(env.smtpPortNumber), requireTLS: env.smtpSsl, auth: { user: env.smtpUserName, pass: env.smtpUserPassword } }; const key = SockSession.keyPair; env.dummyData = ramdonString.getRamdomFileName(Math.random() * 8000, ' '); env.publicKey = key.publicKeyUTF8; async.waterfall([ next => util.Encrypt(JSON.stringify(env), SockSession.vpnEmailPublicKey, key.privateKeyUTF8, SockSession.keyPairPassword, next), (data, next) => { const mail = { from: env.email, to: [proxyViaEmailTest], subject: 'test', attachments: [{ content: data }] }; const transporter = nodemailer.createTransport(smtpTransport(option)); transporter.sendMail(mail, next); } ], (err, data) => { if (err) return; console.log('SMTP sent mail success!'); SockSession.sentEmail = new Date().getTime(); env.dummyData = null; }); };