James使用Mailet接收外网邮件通知提醒
项目场景:
??James邮件服务器在收到外网的邮件时,没有提醒,只能自己登录邮件系统从james里面读取,才能看到新邮件。
??现在需要加上短信通知提醒,或者其他的通知方式。
解决方案:
? ?使用
Apache James Mailet可以实现这个需求,官网:Apache James Mailet
????????Mailet简介
????????Mailet API是一个用来创建邮件处理程序的简单的API,它被配置在邮件服务器端执行,分匹配器Matcher和Mailet的接口两种,匹配器根据特定的条件匹配邮件消息,并触发相应的Mailet。
Mailet这个词是跟Servlet相似,功能也相似,他们的共同之处都是在服务器端触发并执行,只是Servlet的Matcher通常是 url的pattern,跟Servlet的接口一样,Mailet也有init()方法,service()方法和destroy()方法。即他们都有 类似的生命周期,Mailet的简单可编程接口可以用来做一些邮件处理,比如反垃圾邮件,检查邮件病毒以及邮件博客等等,利用移动设备可发送email的功能,可以做到手机通过mail发送信息到邮件服务器交给Mailet处理,形成移动博客的模型。
Mailet的运行需要mailet-2.3.jar和mailet-api-2.3.jar两个包的支持,James本身就有这两个包,可不作修改,但在开发的时候还是需要开发者自己将这两个包导入到工程的Build path中或配置到系统环境变量中。?
示例代码:
既然我们知道Mailet可以实现这样的功能,那么就用Mailet做一个Hello的例子,我这里用idea做示例,其他开发工具也是没问题的。?
1、创建个java程序
项目名为:MyMailet,我这里的包目录是com.test.mail,结构目录如下:
2、导入jar包
到james目录找到:james-2.3.2\work\james-1703036033108\SAR-INF\lib,这里work下面的文件夹名称可能不一样。
把mail-1.4.1.jar、mailet-2.3.jar和mailet-api-2.3.jar三个包导入项目,版本以自己的为准。
3、创建类
我们创建两个自定义类Matcher和Mailet
package com.test.mail;
import javax.mail.MessagingException;
import org.apache.mailet.GenericRecipientMatcher;
import org.apache.mailet.MailAddress;
public class Matcher extends GenericRecipientMatcher {
public boolean matchRecipient(MailAddress recipient) throws MessagingException {
//用户为test的邮件不处理
// if (recipient.getUser().indexOf("test")!=-1) {
// return false;
// }
//处理所有的邮件
return true;
}
}
package com.test.mail;
import java.io.IOException;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.apache.mailet.GenericMailet;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
public class Mailet extends GenericMailet {
public void service(Mail mail) {
try {
MailAddress ma = mail.getSender();
MimeMessage mm = mail.getMessage();
System.out.println("sender:"+ma.toInternetAddress().toString());
System.out.println("subject:"+mm.getSubject());
System.out.println("Received a piece of Email");
/*
* 这里可以添加自己的业务逻辑
* 比如通过http请求调用服务接口,实现短信通知
* 注意需要引入所需的jar包
*/
}catch (Exception e){
e.printStackTrace();
}
}
}
?大家可以看到可以在Mailet类里面编写自己的业务逻辑,比如通过http请求调用服务接口,实现短信通知,注意需要引入所需的jar包。
4、把项目打成jar包
这里说下用idea和MyEclipse不同的打包方式
? ? ? ? 通过idea把项目打成jar包
? ? ? ? ? ? ? ? 1.点击 File ==> Project Structure
? ? ? ? ? ? ? ? 2.Artifacts ==> 点击加号 ==> 选择JAR ==> 选择From modules with dependencies
? ? ? ? ? ? ? ? ?3.在弹出的窗口中点击“确定”
? ? ? ? ? ? ? ? ?4.配置Jar包的输出路径,可以删除多余的依赖包
?
? ? ? ? ? ? ? ? ?5.Create Manifest
?
? ? ? ? ? ? ? ? ?6.然后开始构建Jar包,点击顶部菜单栏中的“Build” -> “Build Artifacts” -> “Build”。
?
? ? ? ? ? ? ? ? ?7.构建Jar包结束,找到输出的jar包,用压缩工具打开,查看里面的内容有没有问题
?
?? ? ? ? 通过MyEclipse把项目打成jar包
? ? ? ? ? ? ? ? 1.右键点击项目Export ==> java ==>?JAR file
?
? ? ? ? ? ? ? ? 2.配置输出路径导出
?
? ? ? ? ? ? ? ? ?3.构建Jar包结束,找到输出的jar包,用压缩工具打开,查看里面的内容有没有问题
5、将打包好的jar包复制到james
? ? ? ? 1.在james-2.3.2\apps\james\SAR-INF目录下新建一个lib文件夹,将打包好的jar文件复制到刚刚新建的lib文件夹下。
? ? ? ? ?注意:因为我线上的代码是用了http相关的依赖包,所以我把相关的依赖包也复制到这里了,如果你们也使用了依赖包,也需要一同复制进来。
6、james配置config.xml文件
打开config.xml配置文件:?james-2.3.2\apps\james\SAR-INF\config.xml
找到这段配置
<mailetpackages>
<mailetpackage>org.apache.james.transport.mailets</mailetpackage>
<mailetpackage>org.apache.james.transport.mailets.smime</mailetpackage>
</mailetpackages>
<matcherpackages>
<matcherpackage>org.apache.james.transport.matchers</matcherpackage>
<matcherpackage>org.apache.james.transport.matchers.smime</matcherpackage>
</matcherpackages>
把我们刚编写的Mailet和Matcher所在位置配置进去就可以了
<mailetpackages>
<mailetpackage>com.test.mail</mailetpackage>
<mailetpackage>org.apache.james.transport.mailets</mailetpackage>
<mailetpackage>org.apache.james.transport.mailets.smime</mailetpackage>
</mailetpackages>
<matcherpackages>
<mailetpackage>com.test.mail</mailetpackage>
<matcherpackage>org.apache.james.transport.matchers</matcherpackage>
<matcherpackage>org.apache.james.transport.matchers.smime</matcherpackage>
</matcherpackages>
这样就完成了包的配置。我们都知道,Mailet的工作过程是:首先由Matcher来匹配所接收到的邮件,然后提交给相应的Mailet处理,但是哪个匹配器对应哪个Mailet呢?我们还需要配置Mailet的对应关系。同样在config.xml中找到下面的代码:?
<mailet match="All" class="PostmasterAlias"/>
?在这段代码下面加入我们自己的Mailet:
<mailet match="Matcher" class="Mailet"/>
?这样就完成了我们自定义的Mailet的配置部署工作了。重启James服务器,则此Mailet即可生效。??
测试结果:
我们向james发送一封邮件,看下控制台打印的结果。?
控制台输出了信息,证明验证成功。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!