Статьи

Отправка приглашений на мероприятия с помощью шва

В эти дни у одного из моих коллег возникли проблемы с отправкой приглашения на мероприятие с использованием почтовых шаблонов со швом (версия 2.x). По сути, это не должно быть трудной задачей, поэтому я вкратце объясню, что нужно сделать для отправки приглашения на событие с использованием шаблонов почтовых швов.

При отправке приглашения по электронной почте необходимо отправить электронное письмо с приложением, в котором содержится информация о конкретном событии. Я создам простой шаблон и класс отправителя, который будет использоваться для отправки приглашения.

Seam 2.x включает в себя дополнительные компоненты, которые отвечают за отправку писем и создание шаблонов. Чтобы использовать эти функции, нам нужно включить в приложение компоненты шовной почты, с помощью maven мы можем сделать это следующим образом:

1
2
3
4
<dependency>
    <groupId>org.jboss.seam</groupId>
    <artifactId>jboss-seam-mail</artifactId>
</dependency>

Механизм шаблонов шва позволяет нам создавать почтовый шаблон, как мы делаем это для стандартных страниц JSP. Это легко и просто для изучения, и вы также можете использовать стандартные теги JSP, JSF, если вы используете его. В этом примере я не буду углубляться в использование механизма шаблонов почтовых швов. Ниже вы можете найти простой пример шаблона, используемого для отправки приглашения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!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:h="http://java.sun.com/jsf/html">
 
 
      <m:header name="Content-Class" value="urn:content-classes:calendarmessage"/>
      <m:from name="Test Mail" address="[email protected]" />
      <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:[email protected]
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, который содержит данные, необходимые для события. Они не содержат много данных, но вы можете расширить их, если вам нужно больше.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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());
   }
   @Override
   public String toString() {
       return "EventInvitation [recipient=" + recipient + ", location="+ location + ", description=" + description + ", start=" + start + ", end=" + end + "]";
   }
}

Это простой компонент шва с областью страницы, оставьте столько же, сколько страница. Из шаблона видно, что мы использовали методы ..AsString для установки значений дат. Это потому, что мы не можем просто использовать необработанную дату для представления даты в приглашении, вместо того, чтобы форматировать даты, используя следующий формат «yyyyMMdd’T’HHmm’00 ′».

Для заполнения дат я использовал следующую простую форму:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!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"
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>

Ничего сложного, просто простая страница для заполнения данными. И в конце мы посмотрим в классе отправителя.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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!");
}
}

Это простой класс, который использует рендерер для создания почты на основе шаблона. Так что в этом нет ничего особенного. Конечно, вам нужно настроить почтовый сеанс в файле component.xml, но это простая конфигурация. Вам нужно добавить следующую строку в components.xml:

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

И это все. Ваша заявка готова к отправке приглашений :). Примечание: строка выше в файле component.xml создаст компонент почтовой сессии, который будет использоваться seam для отправки писем. Например, если вы используете JBoss 4.xx, вы можете редактировать конфигурацию в файле «mail-service.xml». Но как настроить почтовый сеанс выходит за рамки этого поста, если вам нужна дополнительная информация по этой теме, вы можете проверить один из моих старых постов «Настройка почтовой рассылки».

Ссылка: Отправка приглашений на мероприятия с помощью Seam от нашего партнера по JCG Игоря Маджерича в блоге Игоря Маджерика .