发送带有接缝的活动邀请

这些天来,我的一位同事在使用带有接缝(2.x版)的邮件模板发送事件邀请时遇到了问题。 从根本上讲,这不是一个艰巨的任务,因此我将简要说明使用接缝邮件模板发送事件邀请需要做什么。

发送邮件邀请时,您需要发送带有附件的电子邮件,其中包含有关特定事件的信息。 我将创建用于发送邀请的简单模板和发送者类。

Seam 2.x包含其他组件,这些组件负责发送邮件和创建模板。 要使用此功能,我们需要在应用程序中包括接缝邮件组件,而使用maven时,我们可以这样做:

<dependency><groupId>org.jboss.seam</groupId><artifactId>jboss-seam-mail</artifactId>
</dependency>

接缝模板机制使我们可以像对标准jsp页面一样创建邮件模板。 它很容易学习,并且还可以使用标准的jsp标记(如果使用的话是JSF)。 在此示例中,我将不对接缝邮件模板化机制的使用做进一步的介绍。在下面,您可以找到用于发送邀请的模板的简单示例。

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<m:message xmlns="http://www.w3.org/1999/xhtml"xmlns:m="http://jboss.com/products/seam/mail"xmlns:h="http://java.sun.com/jsf/html"><m:header name="Content-Class" value="urn:content-classes:calendarmessage"/><m:from name="Test Mail" address="no-reply-mail@invitation.example" /><m:to name="Igor Madjeric">#{eventInvitation.recipient}</m:to><m:subject><h:outputText value="Test invitation" />
</m:subject><m:body><m:attachment contentType="text/calendar;method=CANCEL" fileName="invitation.ics">
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//Direct Scouts GmbH//INA//DE
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:#{eventInvitation.currentDateAsString}
DTSTART:#{eventInvitation.startAsString}
DTEND:#{eventInvitation.endAsString}
SUMMARY;CHARSET=UTF-8:Test invitation
UID:de827ded-5fc8-4ceb-af1b-b8d9cfbcbca8
ATTENDEE;ROLE=OWNER;PARTSTAT=NEEDS-ACTION;RSVP=FALSE:MAILTO:#{eventInvitation.recipient}
ORGANIZER:MAILTO:xxx@gmail.com
LOCATION;CHARSET=UTF-8:#{eventInvitation.location}
DESCRIPTION;CHARSET=UTF-8:#{eventInvitation.description}
SEQUENCE:0
PRIORITY:5
CLASS:PUBLIC
STATUS:CONFIRMED
TRANSP:OPAQUE
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:REMINDER
TRIGGER;RELATED=START:-PT00H15M00S
END:VALARM
END:VEVENT
END:VCALENDAR</m:attachment>
</m:body>
</m:message>

如您所见,它并不复杂,就像制作JSP页面一样。 创建邀请时,您需要注意UID,它是为其创建邀请的事件的唯一标识符,因此,如果以后需要更改有关该事件的某些内容,则只需要使用相同的UID。 在此示例中,我创建了EventInvitation模型类,其中包含事件所需的数据。 它们不包含大量数据,但是如果您需要更多数据,则可以对其进行扩展。

package ba.codecentric.mail.sender.model;import java.text.SimpleDateFormat;
import java.util.Date;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;@Name("eventInvitation")
@Scope(ScopeType.PAGE)
public class EventInvitation {SimpleDateFormat iCalendarDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmm'00'");private String recipient;private String location;private String description;/* Start and stop dates */private Date start;private Date end;public String getRecipient() {return recipient;}public void setRecipient(String recipient) {this.recipient = recipient;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getStartAsString() {return iCalendarDateFormat.format(start);}public String getEndAsString() {return iCalendarDateFormat.format(end);}public Date getStart() {return start;}public void setStart(Date start) {this.start = start;}public Date getEnd() {return end;}public void setEnd(Date end) {this.end = end;}public String getCurrentDateAsString() {return iCalendarDateFormat.format(new Date());}@Overridepublic String toString() {return "EventInvitation [recipient=" + recipient + ", location="+ location + ", description=" + description + ", start=" + start + ", end=" + end + "]";}
}

它是具有页面范围的简单接缝组件,与页面停留时间相同。 从模板中可以看到,我们使用方法..AsString设置日期值。 这是因为,我们不能简单地使用原始日期来表示邀请中的日期,而是使用下一种格式“ yyyyMMdd'T'HHmm'00'”来格式化日期。

为了填写日期,我使用了下一个简单表格:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:f="http://java.sun.com/jsf/core"
template="/includes/template.xhtml"><!-- main content -->
<ui:define name="MainContent">
<div class="WelcomeContent">
<a4j:form>
<rich:panel header="Welcom To Seam Mail Invitation Sender" style="width: 315px">
Start:<rich:calendar value="#{eventInvitation.start}"
popup="true"
datePattern="dd/M/yy hh:mm a"
showApplyButton="true"
cellWidth="24px"
cellHeight="22px" 
style="width:200px"/>
<br />
End:<rich:calendar value="#{eventInvitation.end}"
popup="true"
datePattern="dd/M/yy hh:mm a"
showApplyButton="true"
cellWidth="24px" 
cellHeight="22px" 
style="width:200px"/>
<br />
Location:<h:inputText value="#{eventInvitation.location}" id="location"/>
<br />
Description:<h:inputText value="#{eventInvitation.description}" id="description"/>
<br />
Recipient:<h:inputText value="#{eventInvitation.recipient}" id="recipient"/>
<a4j:commandButton value="Send Invitation"
action="#{mailInvitationSender.sendInvitation}" reRender="info" />
<h:panelGroup id="info">
<h:outputText value="Status: #{mailInvitationSender.status} " rendered="#{not empty mailInvitationSender.status}" />
</h:panelGroup>
</rich:panel>
</a4j:form>
</div>
</ui:define>
</ui:composition>

填充数据的简单页面没有什么复杂的。 最后,我们将研究发送者类。

package ba.codecentric.mail.sender.controller.impl;import javax.ejb.Remove;
import javax.ejb.Stateful;import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.Renderer;
import org.jboss.seam.log.Log;import ba.codecentric.mail.sender.controller.LocalMailInvitationSender;
import ba.codecentric.mail.sender.model.EventInvitation;@Name("mailInvitationSender")
@Scope(ScopeType.CONVERSATION)
@Stateful
public class StandardMailInvitationSender implements LocalMailInvitationSender {private static final String STATUS_SUCCESS = "SUCCESS";
private static final String STATUS_FAIL = "FAIL";private static String INVITATION_TEMPLATE = "/invitation.xhtml";@Logger
private static Log LOG;// Component used for rendering template.
@In(create = true)
private Renderer renderer;@In
private EventInvitation eventInvitation;private String status;public String getStatus() {
return status;
}public void setStatus(String status) {
this.status = status;
}@Override
public void sendInvitation() {
LOG.info("Send invitation method is called!");
try {
LOG.debug(eventInvitation);
renderer.render(INVITATION_TEMPLATE);
status = STATUS_SUCCESS;
} catch (Exception e) {
LOG.error(e);
status = STATUS_FAIL;
}
LOG.info("Invitation sending:" + status);
}@Remove
public void done() {
LOG.debug("Bean removed!");
}
}

这是简单的类,使用渲染器基于模板创建邮件。 因此,没有什么特别的。 当然,您需要在components.xml中配置邮件会话,但这是简单的配置。 您需要在components.xml中添加下一行:

<mail:mail-session session-jndi-name="java:/Mail" />

就这样。 您的应用程序已准备好发送邀请:)。 注意:components.xml中的上述行将创建邮件会话组件,seam将使用该组件来发送邮件。 例如,如果您使用JBoss 4.xx,则可以在“ mail-service.xml”文件中编辑配置。 但是如何配置邮件会话不在本文的讨论范围内,如果您需要有关此主题的更多信息,可以查看我较早的文章“ Configure Seam Mail”。

参考:在Igor Madjeric博客上,从我们的JCG合作伙伴 Igor Madjeric 发送带有Seam的活动邀请 。


翻译自: https://www.javacodegeeks.com/2012/10/sending-event-invitations-with-seam.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle内存管理(之二)

Oracle内存管理&#xff08;之二&#xff09; 【深入解析--eygle】 学习笔记 1.2.2 UGA和CGA UGA&#xff08;用户全局区&#xff09;由用户会话数据、游标状态和索引区组成。在共享server模式下&#xff0c;一个共享服务进程被多个用户进程共享&#xff0c;此时UGA是Shared Po…

matlab抓取股票数据,Matlab经过sina web接口获取个数即时股票数据函数实现代码

Matlab通过sina web接口获取个数即时股票数据函数实现代码代码如下&#xff1a;function stockinfo queryprice(stocktype, stockid)%stocktype 股票类型&#xff1a;sh和sz%stockid 股票编码&#xff1a;url sprintf(http://hq.sinajs.cn/list%s%d, stocktype, stockid);[so…

虚幻4毛发系统_虚幻引擎复活!苹果与Epic对决,有哪些游戏险些中枪?

最近&#xff0c;苹果和Epic的官司闹得沸沸扬扬。随着Epic旗下热门手游《堡垒之夜》遭苹果火速下架&#xff0c;两大巨头之间的冲突愈演愈烈。苹果似乎并不满足于此&#xff0c;由于Epic公开违反自家规定&#xff0c;苹果计划进一步封禁Epic维护虚幻引擎的开发者账户&#xff0…

史上最全的HTML和CSS标签常用命名规则

文件夹主要建立以下文件夹&#xff1a;  1、Images 存放一些网站常用的图片&#xff1b;  2、Css 存放一些CSS文件&#xff1b;  3、Flash 存放一些Flash文件&#xff1b;  4、PSD 存放一些PSD源文件&#xff1b;  5、Temp 存放所有临时图片和其它文件&#xff1b; …

01-JAVA语言基础

1.设计思想&#xff1a; 先以字符串的形式输入两个数字&#xff0c;然后将他们转化为int类型&#xff0c;再对两数进行相加&#xff0c;最后输出结果。 2.程序流程图&#xff1a; 3.源程序代码&#xff1a; import java.util.Scanner;public class Addition2 {public static vo…

与JodaTime的DateTime和Google Guava的供应商嘲笑

介绍 如果您是经验丰富的单元测试人员&#xff0c;那么当您看到任何与时间 &#xff0c; 并发性 &#xff0c; 随机性 &#xff0c; 持久性和磁盘I / O协同工作的代码时&#xff0c;您就会学会做笔记。 原因是测试可能非常脆弱&#xff0c;有时完全无法正确测试。 这篇文章将展…

栈实现 C语言

最近上来写了一下栈&#xff0c;理解数据结构的栈。 头文件&#xff1a;stack.h 初始化栈结构与函数定义&#xff1a; #include<stdlib.h> #include <stdio.h> #include<memory.h> #define N 100struct stack {int data[N];int top;//标识栈顶 }; typedef s…

php签名墙,肺功能检查质量控制网

2017年12月2日&#xff0c;由中华医学会呼吸病学分会/儿科分会、国家呼吸系统疾病临床医学研究中心、国家呼吸疾病医疗质量控制中心、中国肺功能联盟、中国儿童肺功能协作组主办&#xff0c;浙江省中医院承办的"2017年中国肺功能检查规范化培训及应用推广学习班暨肺功能检…

餐饮水单打印软件_开发一款餐饮手机app系统软件什么价格?有哪些方面需要考虑?...

开发一款餐饮手机app系统软件什么价格&#xff1f;有哪些方面需要考虑&#xff1f;近年来&#xff0c;餐饮类的APP如雨后春笋般快速增长&#xff0c;无论是上档次的酒店&#xff0c;还是各大餐厅&#xff0c;都有各自的专属APP。餐饮APP的开发能让大型酒店/餐厅获得更多盈利、销…

html5中如何去掉input type date默认

html5中如何去掉input type date默认样式 2.对日期时间控件的样式进行修改目前WebKit下有如下9个伪元素可以改变日期控件的UI&#xff1a;::-webkit-datetime-edit – 控制编辑区域的::-webkit-datetime-edit-fields-wrapper – 控制年月日这个区域的::-webkit-datetime-edit-…

Spring-framework应用程序启动loadtime源码分析笔记(二)——@Transactional

Transactional标识类或方法&#xff0c;使方法被执行时使用事务方式执行&#xff0c;这里只讨论PROXY方法增强方法。使用EnableTransactionManagement&#xff0c;默认modelAdviceMode.PROXY&#xff0c;通过Import(TransactionManagementConfigurationSelector.class)来判断在…

具有Spring的简单工作流引擎

几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xff0c;但该引擎也可用…

php put 参数,php – 如何在Guzzle 5中发送PUT请求的参数?

根据the manual,The body option is used to control the body of an entity enclosingrequest (e.g., PUT, POST, PATCH).记录的put’ing方法是&#xff1a;$client new GuzzleHttp\Client();$client->put(http://httpbin.org, [headers > [X-Foo > Bar],body > …

TypeScript学习笔记归纳(持续更新ing)

文章目录 前言 二、TypeScript的优势体现在哪里&#xff1f; 1、执行时间上的区别 2、基础数据类型区别 3、TS优势 三、TypeScript的关键特性 四、TypeScript的类型系统 1、什么是类型注释&#xff1f; 2、类型系统核心 - 常用类型 1&#xff09; 基本类型&#xff0…

组态王 6.55 启停plc_永宏PLC在远程控制系统中的应用

一、行业介绍本远程控制系统是给石药集团的下属子公司设计的一个控制方案。主要是配套GPRS-DTU产品实现远程plc与plc之间的数据共享。从而达到远程无线数据写入控制和读取监控的目的。二、客户需求(1) 客户可以在监控室控制至少2-3公里外的井上两个水泵的启动和停止。(2) 客户可…

Vue表格中,对数据进行转换、处理

众所周知&#xff0c;后端从Mysql取出的数据&#xff0c;一般是很难单独处理某一个Key的数据的&#xff08;需要处理的话&#xff0c;可能会浪费大量的性能。而且对页面加载时间有很大的影响&#xff09;&#xff0c;所以&#xff0c;从数据库取出的数据。只能由前端进行处理。…

Java应用程序中的SQL注入

在本文中&#xff0c;我们将讨论什么是SQL注入攻击。 以及它如何影响任何Web应用程序使用后端数据库。 在这里&#xff0c;我专注于Java Web应用程序。 开放Web应用程序安全项目&#xff08;OWAP&#xff09;列出了SQL注入是Web应用程序的主要漏洞攻击。 黑客将Web请求中的SQL代…

【转】ReactNativeweexDeviceOne对比

React Native出来有一段时间了&#xff0c;国内的weex和deviceone是近期发布的&#xff0c;我可以说从2011年就开始关注快速开发的跨平台平台技术了&#xff0c;接触过phoneGap、数字天堂、appcan等早期的移动中间件技术&#xff0c;也跟朋友也讨论过这类的轻量级框架。这些年通…

bluetooth射频已关闭请打开bluetooth射频_希杰大功率射频放大器烧了维修诊断步骤...

如果电阻值过低&#xff0c;说明电源内部存在短路&#xff0c;正常时其阻值应能达到100千欧以上;电容器应能够充放电&#xff0c;如果损坏&#xff0c;则表现为AC电源线两端阻值低&#xff0c;呈短路状态&#xff0c;否则可能是开关管击穿。然后检查直流输出部分脱开负载&#…

java中整数如何表示,在Java中如何在位级别上内部表示整数?

慕瓜9086354Java整数为32位&#xff0c;并且总是带符号的。这意味着&#xff0c;最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下&#xff1a;Bit# Weight31 -2^3130 2^3029 2^29... ...2 2^21 2^10 …