码云地址: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
}
/**
* 发送带附件的邮件
* 带昵称
* 方法中必须传text、body、html任意一个才能携带附件
*/
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>
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!