一 搭建
1 前期准备
准备一台服务器,保证安装了jdk,版本1.8及以上,并配置了环境变量,操作步骤略
准备james安装包
准备foxmail等邮件客户端
准备数据库驱动包
2 配置域名
vi /etc/hosts # 新增代码 # ip 为当前服务器ip,后面的域名为自定义域名 35.1.1.196 hylink.net.cn # 重启网卡,使域名生效 /etc/init.d/network restart
3 解压james程序包
在服务器找个合适位置,解压即可,代码略
4 修改配置文件
找到解压目录下的conf文件夹
4.1 修改domainlist.xml
localhost替换成之前设置的域名
<domainlist class="org.apache.james.domainlist.jpa.JPADomainList"> <autodetect>true</autodetect> <autodetectIP>true</autodetectIP> <!-- <defaultDomain>localhost</defaultDomain> --> <defaultDomain>hylink.net.cn</defaultDomain> </domainlist>
4.2 修改james-database.properties
# Use derby as default database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver database.url=jdbc:derby:../var/store/derby;create=true database.username=app database.password=app # Supported adapters are: # DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE vendorAdapter.database=DERBY
database.url
指定数据库,因此需要提前创建好数据库,表不用管,james会默认创建系统表
vendorAdapter.database
参考注释,修改成对应的数据库类型
database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
database.url=jdbc:derby:../var/store/derby;create=true
database.username=app
database.password=app
根据数据库类型,替换成对应参数
4.3 修改mailetcontainer.xml
localhost修改成之前配置的域名
<context> <!-- <postmaster>postmaster@localhost</postmaster> --> <postmaster>postmaster@hylink.net.cn</postmaster> </context>
将文件存储替换成数据库存储
<mailet match="All" class="ToRepository"> <repositoryPath>file://var/mail/error/</repositoryPath> <!-- An alternative database repository example follows. --> <!-- <repositoryPath>db://maildb/deadletter/error</repositoryPath> --> </mailet> # 替换成 <mailet match="All" class="ToRepository"> <!-- <repositoryPath>file://var/mail/error/</repositoryPath> --> <!-- An alternative database repository example follows. --> <repositoryPath>db://maildb/deadletter/error</repositoryPath> </mailet>
4.4 修改smtpserver.xml
取消注释,并修改为之前配置的域名
<!-- <helloName autodetect="true">myMailServer</helloName> -->
5 添加数据库驱动包
james默认是文件存储,因为我们修改成了数据库存储,因此需要数据库的驱动包,下载好驱动包,存放到conf文件夹下的lib目录即可
6 后台启动
nohup sh ./run.sh & >james.log
7 添加用户
切换到bin目录下
./james-cli.sh adduser test@hylink.net.cn 123456
因为是内网使用,所以我们需要创建至少两个用户,一个发送、一个接受
8 测试
这里使用的foxmail,安装好之后,随便用一个创建好的账号进行登录,登录进去之后,在设置-账号处,点击新建,将另一个创建好的账号添加进去,在右侧的服务器配置处,收件服务器和发件服务器填当前服务器ip,端口为默认端口(143、25),保存应用即可
之后就可以按照正常发送邮件的方式进行邮件发送、接受测试即可
二 kettle使用
新建作业或转换--核心对象--发送邮件
双击发送邮件,在地址菜单下,收件人地址和发件人地址,分别填写新建james账号,在服务器菜单下,SMTP服务器填写服务器ip,端口号25
之后按照kettle正常的编写逻辑,创建脚本即可
三 java代码调用
直接附上示例代码
package com.hylink.mail;
import lombok.extern.slf4j.Slf4j;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
/**
* Created by shengjk1 on 2016/11/4.
* Blog Address:http://blog.csdn.net/jsjsjs1789
*/
@Slf4j
public class SendMail {
private static SendMail instance = null;
private SendMail() {
}
public static SendMail getInstance() {
if (instance == null) {
instance = new SendMail();
}
return instance;
}
public void send(String[] to, String[] cs, String[] ms, String subject,
String content, String formEmail, String[] fileList) {
try {
Properties p = new Properties(); // Properties p =
// System.getProperties();
p.put("mail.smtp.auth", "true");
p.put("mail.transport.protocol", "smtp");
p.put("mail.smtp.host", "35.1.1.196");//邮件服务器的地址
p.put("mail.smtp.port", "25");
// 建立会话
Session session = Session.getInstance(p);
Message msg = new MimeMessage(session); // 建立信息
BodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
msg.setFrom(new InternetAddress(formEmail)); // 发件人
String toList = null;
String toListcs = null;
String toListms = null;
// 发送,
if (to != null) {
toList = getMailList(to);
new InternetAddress();
InternetAddress[] iaToList = InternetAddress
.parse(toList);
msg.setRecipients(Message.RecipientType.TO, iaToList); // 收件人
}
// 抄送
if (cs != null) {
toListcs = getMailList(cs);
new InternetAddress();
InternetAddress[] iaToListcs = InternetAddress
.parse(toListcs);
msg.setRecipients(Message.RecipientType.CC, iaToListcs); // 抄送人
}
// 密送
if (ms != null) {
toListms = getMailList(ms);
new InternetAddress();
InternetAddress[] iaToListms = InternetAddress
.parse(toListms);
msg.setRecipients(Message.RecipientType.BCC, iaToListms); // 密送人
}
msg.setSentDate(new Date()); // 发送日期
msg.setSubject(subject); // 主题
msg.setText(content); // 内容
// 显示以html格式的文本内容
messageBodyPart.setContent(content, "text/html;charset=utf-8");
multipart.addBodyPart(messageBodyPart);
// 2.保存多个附件
if (fileList != null) {
addTach(fileList, multipart);
}
msg.setContent(multipart);
// 邮件服务器进行验证
Transport tran = session.getTransport("smtp");
tran.connect("35.1.1.196", //邮件服务器地址
"admin@hylink.net.cn",//邮箱地址
"123456");//邮箱的密码
tran.sendMessage(msg, msg.getAllRecipients()); // 发送
System.out.println("邮件发送成功");
} catch (Exception e) {
log.info("邮件发送时异常", e);
}
}
// 添加多个附件
public void addTach(String[] fileList, Multipart multipart)
throws MessagingException, UnsupportedEncodingException {
for (int index = 0; index < fileList.length; index++) {
MimeBodyPart mailArchieve = new MimeBodyPart();
FileDataSource fds = new FileDataSource(fileList[index]);
mailArchieve.setDataHandler(new DataHandler(fds));
mailArchieve.setFileName(MimeUtility.encodeText(fds.getName(),
"utf-8", "B"));
multipart.addBodyPart(mailArchieve);
}
}
private String getMailList(String[] mailArray) {
StringBuffer toList = new StringBuffer();
int length = mailArray.length;
if (mailArray != null && length < 2) {
toList.append(mailArray[0]);
} else {
for (int i = 0; i < length; i++) {
toList.append(mailArray[i]);
if (i != (length - 1)) {
toList.append(",");
}
}
}
return toList.toString();
}
public static void main(String[] args) {
forSend("测试", null);
}
public static void forSend(String subject, String content) {
SendMail send = SendMail.getInstance();
String[] to = {"user@hylink.net.cn"};//收件人的地址
String[] cs = null;
String[] ms = null;
if (content == null || content.length() == 0) {
content = "这是邮件内容,仅仅是测试,不需要回复";
}
String fromEmail = "admin@hylink.net.cn";//发件人的地址
String[] arrArchievList = null;
// 2.保存多个附件
send.send(to, cs, ms, subject, content, fromEmail, arrArchievList);
}
}