发送邮件

在ActFramework发送邮件是非常简单的工作。如果你的某个类具有邮件发送方法,你需要:

  1. 使用act.mail.Mailer注解标记该类
  2. 让该类继承Mailer.Util类或者使用静态引入

    import static act.mail.Mailer.Util.*

创建邮件发送方法

  1. package com.mycom.myprj;
  2. import act.conf.AppConfig;
  3. import act.job.Every;
  4. import act.mail.Mailer;
  5. import org.osgl.logging.*;
  6. import org.osgl.util.E;
  7. import org.osgl.util.S;
  8. import javax.inject.Inject;
  9. /**
  10. * This class demonstrate how to write an email sender
  11. * in act framework.
  12. */
  13. @Mailer
  14. public class PostOffice extends Mailer.Util {
  15. public void sendWelcome(Contact who) {
  16. to(who.getEmail());
  17. subject("Welcome letter");
  18. send(who);
  19. }
  20. public void sendBye(Contact who) {
  21. to(who.getEmail());
  22. send(who);
  23. }
  24. }

创建邮件模板

为每一个邮件发送方法创建对应的模板。模板的位置和控制器响应方法模板位置依照同样规则,对于上例中的sendWelcomesendBye方法,对应的模板文件分别为:

  1. src/main/resources/rythm/com/mycom/myprj/PostOffice/sendWelcome.html:

    1. <html>
    2. <head></head>
    3. <body>
    4. @args com.mycom.myprj.Contact who
    5. <h1>Welcome @who.getFirstName()!</h1>
    6. <p>Blah Blah</p>
    7. </body>
    8. </html>
  2. src/main/resources/rythm/com/mycom/myprj/PostOffice/sendBye.html:

    1. <html>
    2. <head></head>
    3. <body>
    4. @args com.mycom.myprj.Contact who
    5. <h1>Good bye @who.getFirstName()!</h1>
    6. </body>
    7. </html>

调用邮件发送方法

你可以简单地通过方法调用发送邮件

  1. public class MyController {
  2. @Inject
  3. private PostOffice postOffice;
  4. @PostAction("/contact")
  5. public void createContact(Contact contact) {
  6. contactDao.save(contact);
  7. postOffice.sendWelcome(contact);
  8. }
  9. @PutAction("/contact/{contactId}/signOff")
  10. public void signOff(String contactId) {
  11. Contact contact = contactDao.findById(contactId);
  12. contact.signOff();
  13. contactDao.save(contact);
  14. postOffice.sendBye(contact);
  15. }
  16. }

异步调用邮件发送方法

因为涉及远程通信,邮件发送通常来讲是比较耗时的操作。如果在控制器中调用邮件发送会造成结果返回延时。通常的做法是采用异步方式发送邮件,在ActFramework中,你可以通过事件分派来实现:

  1. 使用act.event.On注解将邮件发送方法标注为异步事件响应器

    1. @On(value = "contact-created", async = true)
    2. public void sendWelcome(Contact who) {
    3. to(who.getEmail());
    4. subject("Welcome letter");
    5. send(who);
    6. }
    7. @On(value = "contact-signed-off", async = true)
    8. public void sendBye(Contact who) {
    9. to(who.getEmail());
    10. send(who);
    11. }
  2. 在需要调用邮件发送方法的时候触发事件

    1. public class MyController {
    2. @Inject
    3. EventBus eventBus;
    4. @PostAction("/contact")
    5. public void createContact(Contact contact) {
    6. contactDao.save(contact);
    7. eventBus.trigger("contact-created", contact);
    8. }
    9. @PutAction("/contact/{contactId}/signOff")
    10. public void signOff(String contactId) {
    11. Contact contact = contactDao.findById(contactId);
    12. contact.signOff();
    13. contactDao.save(contact);
    14. eventBus.trigger("contact-signed-off", contact);
    15. }
    16. }

返回目录