James使用Mailet接收外网邮件通知提醒

2023-12-20 18:05:00

项目场景:

??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发送一封邮件,看下控制台打印的结果。?

控制台输出了信息,证明验证成功。?

文章来源:https://blog.csdn.net/u011974797/article/details/135102070
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。