| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- <template>
- <el-dialog title="发送邮件" :visible.sync="dialogVisible" append-to-body width="50%" :close-on-click-modal="false"
- custom-class="email-dialog">
- <el-form ref="emailForm" :model="formData" :rules="formRules" label-width="80px" label-position="right">
- <el-form-item label="收件人" prop="to">
- <el-input v-model="formData.to" placeholder="多个收件人用分号(;)分隔" clearable></el-input>
- </el-form-item>
- <el-form-item label="抄送" prop="cc">
- <el-input v-model="formData.cc" placeholder="多个抄送人用分号(;)分隔" clearable></el-input>
- </el-form-item>
- <el-form-item label="密送" prop="bcc">
- <el-input v-model="formData.bcc" placeholder="多个密送人用分号(;)分隔" clearable></el-input>
- </el-form-item>
- <el-form-item label="主题" prop="subject">
- <el-input v-model="formData.subject" placeholder="请输入邮件主题" clearable></el-input>
- </el-form-item>
- <el-form-item label="正文" prop="content">
- <avue-ueditor v-model="formData.content" :options="options"></avue-ueditor>
- </el-form-item>
- <el-form-item label="附件">
- <el-input v-model="formData.attachments" placeholder="请输入文件名" clearable></el-input>
- </el-form-item>
- </el-form>
- <span slot="footer" class="dialog-footer">
- <el-button @click="dialogVisible = false" size="medium">取 消</el-button>
- <el-button type="primary" @click="submitForm" size="medium" :loading="sending">发 送</el-button>
- </span>
- </el-dialog>
- </template>
- <script>
- import { getToken } from "@/util/auth";
- import { generateMailFile } from "@/api/iosBasicData/reports";
- export default {
- name: 'EmailDialog',
- props: {
- visible: {
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
- dialogVisible: this.visible,
- sending: false,
- options: {
- //普通上传地址
- action: "/api/blade-resource/oss/endpoint/put-file",
- customConfig: {
- menus: [
- 'head',
- 'bold',
- 'fontSize',
- 'fontName',
- 'italic',
- 'underline',
- 'strikeThrough',
- 'foreColor',
- 'backColor',
- 'link',
- 'list',
- 'justify',
- 'quote',
- 'emoticon',
- 'image',
- 'table',
- 'undo',
- 'redo'
- ],
- },
- headers: { "Blade-Auth": "Bearer " + getToken() },
- props: {
- res: "data",
- url: 'link'
- }
- },
- formData: {
- to: '',
- cc: '',
- bcc: '',
- subject: '',
- content: '',
- attachments: '',
- fileType: '',
- fileContent: ''
- },
- formRules: {
- to: [
- { required: true, message: '请输入收件人邮箱', trigger: 'blur' },
- {
- validator: this.validateEmails,
- message: '邮箱格式不正确',
- trigger: 'blur'
- }
- ],
- subject: [
- { required: true, message: '请输入邮件主题', trigger: 'blur' },
- { max: 100, message: '主题长度不能超过100个字符', trigger: 'blur' }
- ],
- content: [
- { required: true, message: '请输入邮件正文', trigger: 'blur' }
- ],
- attachments: [
- { required: true, message: '请输入附件名', trigger: 'blur' }
- ]
- },
- fileTypeList: [
- {
- key: 'Pdf',
- value: 'pdf'
- },
- {
- key: 'ImageSvg',
- value: 'svg'
- },
- {
- key: 'Excel2007',
- value: 'xls'
- },
- {
- key: 'Text',
- value: 'txt'
- },
- {
- key: 'Html',
- value: 'html'
- },
- {
- key: 'Word2007',
- value: 'doc'
- },
- {
- key: 'Csv',
- value: 'csv'
- },
- {
- key: 'Csv',
- value: 'csv'
- }
- ]
- }
- },
- watch: {
- visible(newVal) {
- this.dialogVisible = newVal
- },
- dialogVisible(newVal) {
- this.$emit('update:visible', newVal)
- if (!newVal) {
- this.resetForm()
- }
- }
- },
- methods: {
- validateEmails(rule, value, callback) {
- if (!value) return callback()
- const emails = value.split(';').filter(e => e.trim())
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
- for (const email of emails) {
- if (!emailRegex.test(email.trim())) {
- return callback(new Error(rule.message))
- }
- }
- callback()
- },
- submitForm() {
- this.$refs.emailForm.validate(valid => {
- if (valid) {
- this.sendEmail()
- }
- })
- },
- sendEmail() {
- this.sending = true
- let fileContentStrList = ["ImageSvg", "Html"]
- let nowFile = this.fileTypeList.find(f => f.key === this.formData.fileType)
- let param = {
- fileName: this.formData.attachments,
- fileType: nowFile.value,
- sendTo: this.formData.to,
- mailTitle: this.formData.subject,
- mailContent: this.formData.content,
- fileContent: this.formData.fileContent,
- fileContentStr: ''
- }
- if (fileContentStrList.indexOf(this.formData.fileType) !== -1) {
- param.fileContent = null
- param.fileContentStr = this.formData.fileContent
- }
- generateMailFile(param).then(res => {
- console.info(res)
- })
- // 模拟发送请求
- setTimeout(() => {
- this.$message.success('邮件发送成功')
- this.sending = false
- this.dialogVisible = false
- }, 1500)
- },
- resetForm() {
- this.$refs.emailForm.resetFields()
- this.formData.attachments = ''
- }
- }
- }
- </script>
- <style lang="scss">
- .email-dialog {
- border-radius: 8px;
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
- .el-dialog__header {
- border-bottom: 1px solid #f0f0f0;
- padding: 15px 20px;
- .el-dialog__title {
- font-size: 18px;
- font-weight: 600;
- color: #333;
- }
- }
- .el-dialog__body {
- padding: 20px 30px;
- .el-form-item {
- margin-bottom: 22px;
- .el-form-item__label {
- color: #666;
- font-weight: normal;
- }
- .el-input__inner,
- .el-textarea__inner {
- border-radius: 4px;
- transition: border-color 0.3s;
- &:focus {
- border-color: #409eff;
- box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
- }
- }
- }
- }
- .el-dialog__footer {
- border-top: 1px solid #f0f0f0;
- padding: 15px 20px;
- text-align: right;
- .el-button {
- min-width: 80px;
- border-radius: 4px;
- }
- }
- }
- </style>
|