Grails3开发邮件发送小demo

Grails集成邮件发送,可发送html以及附件
码云地址:https://gitee.com/GntLee/grails_email
新建项目,在build.gradle中引入email依赖:

compile 'org.grails.plugins:mail:2.0.0.RC6'

grails-app/conf/application.yml最后面加入邮件配置:

---
grails:
mail:
host: 'smtp.qq.com' #主机
port: 465 #端口
username: '2268999743@qq.com' #你的邮箱名称
password: 'ghbrdwnopyxheage' #邮箱授权码,注意:此处并非登录密码,而是开通邮件发送功能的授权码
defaultEncoding: UTF-8
props:
mail.smtp.port: 465
mail.smtp.auth: true
mail.smtp.starttls.enable: true
mail.smtp.socketFactory.port: 465
mail.smtp.socketFactory.class: 'javax.net.ssl.SSLSocketFactory'
mail.smtp.socketFactory.fallback: true
default:
from: '2268999743@qq.com' #默认发件人

注意:格式必须按照如上对其。

接下来创建邮件发送控制器:

package com.mail

import grails.converters.JSON

class MailController {

//注入邮件服务
def mailService

def index() {

}

/**
* 发送带html的邮件
* 带昵称
* to 收件人,字符串,多个收件人有英文逗号隔开
*/
def sendHtml() {

def info = [:]

//收件人
String recipients = params.recipients
//昵称
String nickname = params.nickname

try {
mailService.sendMail {
//application.yml中配置的发件人
from "${nickname}<${grailsApplication.config.grails.mail.username}>"
to "${nickname}<${recipients}>" //"<昵称>邮箱"
subject '邮件标题'
// body(view:'template',model:[message:'测试邮件,收到此邮件不用回复!'])
html(view:'template',model:[message:'测试邮件,收到此邮件不用回复!'])
//html "<a href='http://www.baidu.com'>百度</a>"
}
info = [result:true, msg: "邮件发送成功!"]
} catch (e) {
log.error("邮件发送失败,errorMsg={}",e)
info = [result:false, msg: "邮件发送失败!"]
}
render info as JSON
}

/**
* 发送带附件的邮件
* 带昵称
* 方法中必须传textbodyhtml任意一个才能携带附件
*/
def sendAttach() {

def info = [:]

//收件人
String recipients = params.recipients
//昵称
String nickname = params.nickname

try {
mailService.sendMail {

//多附件
multipart true

//application.yml中配置的发件人
from "${nickname}<${grailsApplication.config.grails.mail.username}>"

//"<昵称>邮箱"
to "${nickname}<${recipients}>"

subject '邮件标题'

attach (new File("E:\\water.png"))
text "测试邮件"
}
info = [result:true, msg: "邮件发送成功!"]
} catch (e) {
log.error("邮件发送失败,errorMsg={}",e)
info = [result:false, msg: "邮件发送失败!"]
}
render info as JSON
}
}

gsp页面,页面我这里用的layui前端框架,需要用的自行到layui官网下载:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>邮件测试</title>
<asset:stylesheet href="layui/css/layui.css"/>
<style>
.main{width:80%;margin:5% auto;}
</style>
</head>

<body>
<div class="main">
<h1>邮件测试</h1>
<div>
<button class="layui-btn layui-btn-normal" id="htmlMail">HTML邮件</button>
<button class="layui-btn layui-btn-warm" id="attachMail">带附件邮件</button>
</div>
</div>
<asset:javascript src="layui/layui.js"/>

<script>
layui.use(["jquery","layer","form"],function () {
var $ = layui.jquery,layer = layui.layer,form = layui.form;
$("#htmlMail").click(function(){
layer.open({
title: "HTML",
type: 1,
area: ["400px","300px"],
btn: ["发送","取消"],
content: '<form class="layui-form layui-form-pane" action="" style="width:80%;margin:15px auto;">' +
' <div class="layui-form-item">' +
' <label class="layui-form-label">收件人邮箱</label>' +
' <div class="layui-input-inline">' +
' <input type="text" name="recipients" id="recipients" lay-verify="requeired|email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">' +
' </div>' +
' </div>' +
' <div class="layui-form-item">' +
' <label class="layui-form-label">你的昵称</label>' +
' <div class="layui-input-inline">' +
' <input type="text" name="nickname" id="nickname" lay-verify="requeired|email" placeholder="请输入你的昵称" autocomplete="off" class="layui-input">' +
' </div>' +
' </div>' +
'</form>',
yes: function (index) {
var recipients = $("#recipients").val().trim();
var nickname = $("#nickname").val().trim();
if(recipients=='') {layer.msg("邮箱不能为空!");return false;}
if(nickname=='') {layer.msg("昵称不能为空!");return false;}
var load = layer.msg("邮件发送中...",{icon:16,time:100000,shade:["#000",0.5]});
$.post("${createLink(controller: "mail", action: "sendHtml")}",{recipients:recipients,nickname:nickname},function(res){
layer.close(load);
if(res.result==true) {
layer.alert(res.msg,{icon:1},function () {
layer.closeAll();
});
}else{
layer.alert(res.msg,{icon:2});
}
});
}
});
});

$("#attachMail").click(function(){
layer.open({
title: "带附件",
type: 1,
area: ["400px","300px"],
btn: ["发送","取消"],
content: '<form class="layui-form layui-form-pane" action="" style="width:80%;margin:15px auto;">' +
' <div class="layui-form-item">' +
' <label class="layui-form-label">收件人邮箱</label>' +
' <div class="layui-input-inline">' +
' <input type="text" name="recipients" id="recipients" lay-verify="requeired|email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">' +
' </div>' +
' </div>' +
' <div class="layui-form-item">' +
' <label class="layui-form-label">你的昵称</label>' +
' <div class="layui-input-inline">' +
' <input type="text" name="nickname" id="nickname" lay-verify="requeired|email" placeholder="请输入你的昵称" autocomplete="off" class="layui-input">' +
' </div>' +
' </div>' +
'</form>',
yes: function (index) {
var recipients = $("#recipients").val().trim();
var nickname = $("#nickname").val().trim();
if(recipients=='') {layer.msg("邮箱不能为空!");return false;}
if(nickname=='') {layer.msg("昵称不能为空!");return false;}
var load = layer.msg("邮件发送中...",{icon:16,time:100000,shade:["#000",0.5]});
$.post("${createLink(controller: "mail", action: "sendAttach")}",{recipients:recipients,nickname:nickname},function(res){
layer.close(load);
if(res.result==true) {
layer.alert(res.msg,{icon:1},function () {
layer.closeAll();
});
}else{
layer.alert(res.msg,{icon:2});
}
});
}
});
});
});
</script>
</body>
</html>

template页面:

<!doctype html>
<html>
<head>
<meta name="layout" content="main"/>
<title>tips.</title>
<asset:link rel="icon" href="favicon.ico" type="image/x-ico" />
<style>
.main{
width:80%;
margin:5% auto;
background: #c9ab2c;
}
.message{
color:#fff;
}
.wrap { width: 64px; height: 64px; position: relative; }
.outer { position: absolute; width: 100%; height: 100%; background: url(icon-spin-s.png) no-repeat; animation: spin 800ms infinite linear; }
.inner, .inner2 { position: absolute; width: 38px; height: 38px; border-radius: 40px; overflow: hidden; left: 13px; top: 13px; }
.inner { opacity: 1; background-color: #89abdd; animation: second-half-hide 1.6s steps(1, end) infinite; }
.inner2 { opacity: 0; background-color: #4b86db; animation: second-half-show 1.6s steps(1, end) infinite; }
.spiner, .filler, .masker { position: absolute; width: 50%; height: 100%; }
.spiner { border-radius: 40px 0 0 40px; background-color: #4b86db; transform-origin: right center; animation: spin 800ms infinite linear; left: 0; top: 0; }
.filler { border-radius: 0 40px 40px 0; background-color: #4b86db; animation: second-half-hide 800ms steps(1, end) infinite; left: 50%; top: 0; opacity: 1; }
.masker { border-radius: 40px 0 0 40px; background-color: #89abdd; animation: second-half-show 800ms steps(1, end) infinite; left: 0; top: 0; opacity: 0; }

.inner2 .spiner, .inner2 .filler { background-color: #89abdd; }
.inner2 .masker { background-color: #4b86db; }

@keyframes spin {
0% { transform: rotate(360deg); }
100% { transform: rotate(0deg); }
}
@keyframes second-half-hide {
0% { opacity: 1; }
50%, 100% { opacity: 0; }
}
@keyframes second-half-show {
0% { opacity: 0; }
50%, 100% { opacity: 1; }
}
</style>
</head>

<body>
<div class="main">
<span class="message">${message}</span>
<div class="wrap">
<div class="outer"></div>
<div class="inner">
<div class="spiner"></div>
<div class="filler"></div>
<div class="masker"></div>
</div>
<div class="inner2">
<div class="spiner"></div>
<div class="filler"></div>
<div class="masker"></div>
</div>
</div>
</div>
</body>
</html>
  • 发表于 2017-11-15 18:09
  • 阅读 ( 1379 )
  • 分类:grails

0 条评论

请先 登录 后评论
不写代码的码农
Jonny

程序猿

65 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章