在我們公司門戶網站里面,如果有需要,我們可以提供一個頁面給用戶反饋信息,以便獲得寶貴的用戶信息反饋或者一些產品咨詢的記錄,一般這個結合郵件發送到負責人的郵箱即可。本篇隨筆結合后端發送郵件的操作,把相關信息發送到門戶網站的負責人郵箱里面。
1、客戶反饋界面
我們這個主題主要介紹BootstrapVue的使用,雖然我們有時候使用了常規的HTML元素,不過也是使用了Bootstrap的樣式來處理界面的。
本篇隨筆繼續介紹BootstrapVue中的表單組件 b-form 及表單元素的使用。在線反饋界面如下所示。

在這里主要通過一些常規的數據錄入獲得客戶的反饋即可。
Vue模板的HTML界面代碼如下所示
<b-form @submit="onSubmit" class="mt-4 mb-5"> <b-form-group id="input-group-1" label-for="input-1" class="mb-4"> <b-form-input id="input-1" v-model="form.name" required placeholder="請輸入您的姓名"></b-form-input> </b-form-group> <b-form-group id="input-group-2" label-for="input-2" class="mb-4"> <b-form-input id="input-2" v-model="form.phone" required placeholder="請輸入您的手機/郵箱"></b-form-input> </b-form-group> <b-form-group id="input-group-3" label-for="input-3" class="mb-4"> <b-form-select id="input-3" v-model="form.suggest" placeholder="反饋類型" :options="suggest" required></b-form-select> </b-form-group> <b-form-group id="input-group-4" label-for="input-3" class="mb-5"> <b-form-textarea id="input-4" v-model="form.message" required rows="5" placeholder="請輸入您想說的話"></b-form-textarea> </b-form-group> <b-button type="submit" block variant="info">提 交</b-button> </b-form>
而其中data里面定義了表單對應的數據,如下所示
form: { name: '', phone: '', suggest: null, message: '', }, suggest: [ { value: null, text: '反饋類型' }, { value: '需求上報', text: '需求上報' }, { value: '商務洽談', text: '商務洽談' }, { value: '意見建議', text: '意見建議' }, { value: '其它', text: '其它' } ],
在數據提交的時候,我們根據正則表達式來判斷一下對應的數據,當然我們也可以使用BootstrapVue的表單驗證控件來處理,具體可以參考BootstrapVue的表單驗證組件。
async onSubmit (evt) { evt.preventDefault() const phoneReg = /^1[3456789]\d{9}$/ const emailReg = /^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/ if (!phoneReg.test(this.form.phone) && !emailReg.test(this.form.phone)) { this.$bvToast.toast(`提交失敗,請輸入正確的手機號或郵箱號`, { title: '提交結果', variant: 'danger', autoHideDelay: 5000 }) return }
而其中 this.$bvToast.toast 使用了BootstrapVue 冒泡提示組件。
通過this.$bvToast.toast()Vue組件實例注入從應用程序中的任何位置生成動態toast,而無需在應用程序中放置<b-toast>組件。
使用this.$bvToast.toast()方法生成toasts。該方法接受兩個參數:
message: toast主體的內容(字符串或VNodes數組)。必填的。將不會顯示帶有空消息的Toasts。有關將VNodes數組作為消息傳遞的示例,請參閱Advanced usage部分。options: 用於提供標題和/或附加配置選項的可選選項對象。title選項可以是字符串或VNodes數組
options參數接受<b-toast>組件以camelCase name格式而不是kebab case格式接受的大多數道具(static和visible的除外)。
接着我們收集客戶的信息,組合后調用后端發送郵件接口,發送郵件即可,最后提示用戶發送是否成功。
var type = '反饋' var html = ` <p><strong>發信人姓名:</strong></p> <p>${this.form.name}</p> <p><strong>發信人聯系方式:</strong></p> <p>${this.form.phone}</p> <p><strong>發信人反饋類型:</strong></p> <p>${this.form.suggest}</p> <p><strong>發信人留言:</strong></p> <p>${this.form.message}</p> ` const flag = SendMail(html, type) if (flag) { this.form = { name: '', phone: '', message: '' } this.$bvToast.toast(`提交成功,我們將盡快與您取得聯系!`, { title: '提交結果', variant: 'success', autoHideDelay: 5000 }) } else { this.$bvToast.toast(`提交失敗,請稍后重試!`, { title: '提交結果', variant: 'danger', autoHideDelay: 5000 }) }
2、郵件的發送處理
關於郵件的發送,之前有參考過 nodemailer,這個使用node環境發送郵件的組件,不過我們現在的BootstrapVue項目的前端不符合這個條件,除非引入 nuxt ,讓頁面先在后端運行再推送給前端展示。
關於nodemailer的學習,可以參考下:https://github.com/nodemailer/nodemailer,或者官網:https://nodemailer.com/about/
它的使用代碼如下所示:
"use strict"; const nodemailer = require("nodemailer"); // async..await is not allowed in global scope, must use a wrapper async function main() { // Generate test SMTP service account from ethereal.email // Only needed if you don't have a real mail account for testing let testAccount = await nodemailer.createTestAccount(); // create reusable transporter object using the default SMTP transport let transporter = nodemailer.createTransport({ host: "smtp.ethereal.email", port: 587, secure: false, // true for 465, false for other ports auth: { user: testAccount.user, // generated ethereal user pass: testAccount.pass, // generated ethereal password }, }); // send mail with defined transport object let info = await transporter.sendMail({ from: '"Fred Foo 👻" <foo@example.com>', // sender address to: "bar@example.com, baz@example.com", // list of receivers subject: "Hello ✔", // Subject line text: "Hello world?", // plain text body html: "<b>Hello world?</b>", // html body }); console.log("Message sent: %s", info.messageId); // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com> // Preview only available when sending through an Ethereal account console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info)); // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou... }
不過前面說了,我們不使用這個,就一筆帶過,談談我們后端使用ABP接口發送郵件的處理吧。
我們前端封裝一個調用后端接口發送郵件的通用處理函數,如下所示。
function privateSendEmail(email, subject, body) { var data = { email, subject, body } return request({ url: '/abp/services/app/Account/SendEmail', method: 'post', data: data }) }
再簡單封裝一下發送反饋信息的郵件操作函數,如下所示。
export async function SendMail(html, type) { //發送郵件 type = type || '反饋' const mailOptions = { from: `一條來自【廣州愛奇迪】網站的${type} wuhuacong@163.com`, to: 'wuhuacong@163.com', subject: `一條來自【廣州愛奇迪】網站的${type}`, //郵件標題 html, //郵件內容 var email = 'wuhuacong@163.com' var subject = `一條來自【廣州愛奇迪】網站的${type}` var result = false await privateSendEmail(email, subject, html).then(data => { result = data.success return result }) }
這樣我們在組件里面,直接引入這個封裝函數進行調用即可。
import { SendMail } from '@/api/system/mail'
最后發送操作。

再次回到后端的ABP郵件發送接口上,我之前在隨筆《循序漸進VUE+Element 前端應用開發(33)--- 郵件參數配置和模板郵件發送處理》中介紹過郵件發送的操作,我們ABP框架后端是基於AbpMailkitModule組件進行發送郵件的,只需要配置好相關發送郵件的信息即可。

Module中初始化中處理下對應的自定義發送和自定義配置項的處理類。

然后在使用的應用服務類中注入對應的郵件發送接口以供使用。

我們簡單定義一個發送郵件的DTO對象,用來接收來自客戶的反饋信息,如下所示。
/// <summary> /// 常規郵件信息 /// </summary> public class SendEmailDto { [Required] [MaxLength(AbpUserBase.MaxEmailAddressLength)] public string Email { get; set; } /// <summary> /// 內容 /// </summary> [Required] public string Body { get; set; } /// <summary> /// 標題 /// </summary> [Required] public string Subject { get; set; } }
最后直接發送郵件處理即可。
/// <summary> /// 發送常規郵件內容 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task SendEmail(SendEmailDto input) { await _emailSender.SendAsync(new System.Net.Mail.MailMessage { To = { input.Email }, Subject = input.Subject, Body = input.Body, IsBodyHtml = true }); LogHelper.Logger.Info($"校驗郵件發送給:{input.Email}, 發送郵件成功"); }
發送處理后,我們就會在郵箱中收到郵件信息,如下所示。

以上只是簡單對用戶信息進行收集,我們如果在系統各種常規的處理中,也可以通過郵件和系統用戶進行信息通知,如找回密碼、更新密碼,重要操作、工作提醒通知等等操作。
系列文章如下所示:
循序漸進BootstrapVue,開發公司門戶網站(1)---基於Bootstrap網站模板構建組件界面
循序漸進BootstrapVue,開發公司門戶網站(2)--- 使用wow.js動畫組件以及自定義的CSS樣式處理動態效果
循序漸進BootstrapVue,開發公司門戶網站(3)--- 結合郵件發送,收集用戶反饋信息
循序漸進BootstrapVue,開發公司門戶網站(4)--- 使用b-carousel-slide組件實現圖片輪播以及vue-awesome-swiper實現圖片滑動展示
循序漸進BootstrapVue,開發公司門戶網站(5)--- 使用實際數據接口代替本地Mock數據
循序漸進BootstrapVue,開發公司門戶網站(6)--- 門戶網站后端內容管理
