emailService.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. const nodemailer = require('nodemailer');
  2. // 邮件配置 - 使用环境变量或默认配置
  3. const emailConfig = {
  4. service: process.env.EMAIL_SERVICE || 'qq',
  5. auth: {
  6. user: process.env.EMAIL_USER || 'your-email@qq.com',
  7. pass: process.env.EMAIL_PASS || 'your-app-password'
  8. }
  9. };
  10. // 接收邮箱配置
  11. const receiverEmail = process.env.ADMIN_EMAIL || 'admin@yourcompany.com';
  12. // 检查邮件配置是否有效
  13. const isEmailConfigured = emailConfig.auth.user !== 'your-email@qq.com' &&
  14. emailConfig.auth.pass !== 'your-app-password' &&
  15. receiverEmail !== 'admin@yourcompany.com';
  16. // 创建邮件传输器(仅在配置有效时)
  17. const transporter = isEmailConfigured ? nodemailer.createTransport(emailConfig) : null;
  18. /**
  19. * 发送联系我们留言通知邮件
  20. * @param {Object} contactData 联系信息
  21. * @returns {Promise<boolean>} 发送结果
  22. */
  23. async function sendContactNotification(contactData) {
  24. try {
  25. // 检查邮件配置是否有效
  26. if (!isEmailConfigured || !transporter) {
  27. console.log('邮件服务未配置,跳过发送通知邮件');
  28. return false;
  29. }
  30. const { name, email, phone, company, subject, message, createdAt } = contactData;
  31. const mailOptions = {
  32. from: emailConfig.auth.user,
  33. to: receiverEmail,
  34. subject: `【网站留言】${subject}`,
  35. html: `
  36. <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
  37. <h2 style="color: #333; border-bottom: 2px solid #4CAF50; padding-bottom: 10px;">
  38. 新的联系我们留言
  39. </h2>
  40. <div style="background-color: #f9f9f9; padding: 20px; border-radius: 5px; margin: 20px 0;">
  41. <h3 style="color: #555; margin-top: 0;">联系人信息</h3>
  42. <p><strong>姓名:</strong> ${name}</p>
  43. <p><strong>邮箱:</strong> <a href="mailto:${email}">${email}</a></p>
  44. ${phone ? `<p><strong>电话:</strong> ${phone}</p>` : ''}
  45. ${company ? `<p><strong>公司:</strong> ${company}</p>` : ''}
  46. <p><strong>留言时间:</strong> ${new Date(createdAt).toLocaleString('zh-CN')}</p>
  47. </div>
  48. <div style="background-color: #fff; padding: 20px; border: 1px solid #ddd; border-radius: 5px;">
  49. <h3 style="color: #555; margin-top: 0;">留言主题</h3>
  50. <p style="font-size: 16px; font-weight: bold; color: #333;">${subject}</p>
  51. <h3 style="color: #555;">留言内容</h3>
  52. <div style="background-color: #f5f5f5; padding: 15px; border-radius: 3px; line-height: 1.6;">
  53. ${message.replace(/\n/g, '<br>')}
  54. </div>
  55. </div>
  56. <div style="margin-top: 20px; padding: 15px; background-color: #e8f5e8; border-radius: 5px;">
  57. <p style="margin: 0; color: #666; font-size: 14px;">
  58. <strong>提示:</strong>请及时回复客户留言,可直接回复到客户邮箱:<a href="mailto:${email}">${email}</a>
  59. </p>
  60. </div>
  61. </div>
  62. `
  63. };
  64. const result = await transporter.sendMail(mailOptions);
  65. console.log('邮件发送成功:', result.messageId);
  66. return true;
  67. } catch (error) {
  68. console.error('邮件发送失败:', error);
  69. return false;
  70. }
  71. }
  72. /**
  73. * 发送自动回复邮件给客户
  74. * @param {Object} contactData 联系信息
  75. * @returns {Promise<boolean>} 发送结果
  76. */
  77. async function sendAutoReply(contactData) {
  78. try {
  79. // 检查邮件配置是否有效
  80. if (!isEmailConfigured || !transporter) {
  81. console.log('邮件服务未配置,跳过发送自动回复邮件');
  82. return false;
  83. }
  84. const { name, email, subject } = contactData;
  85. const mailOptions = {
  86. from: emailConfig.auth.user,
  87. to: email,
  88. subject: `感谢您的留言 - ${subject}`,
  89. html: `
  90. <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
  91. <h2 style="color: #4CAF50;">感谢您的留言!</h2>
  92. <p>尊敬的 ${name},</p>
  93. <p>感谢您通过我们的网站联系我们。我们已经收到您的留言,我们的工作人员会在24小时内回复您。</p>
  94. <div style="background-color: #f9f9f9; padding: 15px; border-radius: 5px; margin: 20px 0;">
  95. <p><strong>您的留言主题:</strong>${subject}</p>
  96. <p><strong>提交时间:</strong>${new Date().toLocaleString('zh-CN')}</p>
  97. </div>
  98. <p>如有紧急事务,请直接拨打我们的客服电话:<strong>400-xxx-xxxx</strong></p>
  99. <hr style="border: none; border-top: 1px solid #eee; margin: 30px 0;">
  100. <p style="color: #666; font-size: 14px;">
  101. 此邮件为系统自动发送,请勿直接回复。<br>
  102. 如需联系我们,请访问:<a href="https://yourwebsite.com">https://yourwebsite.com</a>
  103. </p>
  104. </div>
  105. `
  106. };
  107. const result = await transporter.sendMail(mailOptions);
  108. console.log('自动回复邮件发送成功:', result.messageId);
  109. return true;
  110. } catch (error) {
  111. console.error('自动回复邮件发送失败:', error);
  112. return false;
  113. }
  114. }
  115. module.exports = {
  116. sendContactNotification,
  117. sendAutoReply
  118. };