首先说说自己怎么碰到了这个问题,公司的邮箱用的是sina的企业邮箱,也就是说我们托管给了sina,而我们的OA系统还要向员工们的邮箱发送一些邮件作为提示,或者是通知,这就有了一个需求,需要使用Domino去发邮件,OK,用Lotusscript写一个发邮件的功能,相信稍有经验的TX都会的,但是这里有个问题,你需要sina那边能够把公司的IP拉到白名单里去,而这需要做什么不是一个开发人员可以决定的,所以我们就遇到了3个问题:
1、当有人在OA上推荐一篇文档的时候,可能会给很多很多人发邮件,而mx.sina.net最多只允许我们的服务器与其建立5个连接,即前5个收件人可以顺利地收到邮件,而后面的人,因为这个限制就会出现无法收到邮件的问题,这个还算能忍吧...
2、在一个工作流中,我们需要邮件提示下一个节点的用户,而使用Domino邮件服务器连接sina服务器的方式,在用户点的很快的情况下,因为堵信的问题,会出现后一个节点的人,有时比前一个节点的人先收到信,尽管理论上来说,一般不会发生,还算能忍,但的确不爽...
3、最后,一个问题,导致我不得不重写了发邮件的方法,OK,因为我们的邮件服务器经常要群发给sina的企业邮箱,CBL不知道那根筋拧了,把我们拉到黑名单里去了...我不知道是不是我们的群发导致了这样的结果,还是设置有问题,反正不是我能解决的东西了,而管理员也不知道该怎么做,但用户的需求还在?怎么办?
好吧,这个时候为了解决上面的3个问题,我们很自然地想到了一个解决的办法,如果我们是像在outlook里那样去发邮件的话,那岂不是什么问题都解决了?OK!我们来做个类似于outlook的东东吧!
作为一个专职Lotus的开发人员,你会写这样的东东吗?不知道你会不会,反正我是不会...
好在有思路,就有解决的方法,于是搜搜网上的Java们是怎么干的?结果搜到了JavaMail的jar包,于是使用LS2J(好的,我会再写一篇关于LS2J的文章,防止有些TX不知道怎么用)的技术,我们直接引用了JavaMail的jar包,然后稍加改良后,一测试,OK,问题解决了!
使用了3个.java文件,这里呈上:
1.MailSenderInfo.java
package com.util.mail;
/**
* 发送邮件需要使用的基本信息
*/
import java.util.Properties;
public class MailSenderInfo {
// 发送邮件的服务器的IP和端口
private String mailServerHost;
private String mailServerPort = "25";
// 邮件发送者的地址
private String fromAddress;
// 邮件接收者的地址
private String toAddress;
// 登陆邮件发送服务器的用户名和密码
private String userName;
private String password;
// 是否需要身份验证
private boolean validate = false;
// 邮件主题
private String subject;
// 邮件的文本内容
private String content;
// 邮件附件的文件名
private String[] attachFileNames;
/**
* 获得邮件会话属性
*/
public Properties getProperties(){
Properties p = new Properties();
p.put("mail.smtp.host", this.mailServerHost);
p.put("mail.smtp.port", this.mailServerPort);
p.put("mail.smtp.auth", validate ? "true" : "false");
return p;
}
public String getMailServerHost() {
return mailServerHost;
}
public void setMailServerHost(String mailServerHost) {
this.mailServerHost = mailServerHost;
}
public String getMailServerPort() {
return mailServerPort;
}
public void setMailServerPort(String mailServerPort) {
this.mailServerPort = mailServerPort;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] fileNames) {
this.attachFileNames = fileNames;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String textContent) {
this.content = textContent;
}
}
2.SimpleMailSender.java
package com.util.mail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* 简单邮件(不带附件的邮件)发送器
*/
public class SimpleMailSender {
/**
* 以文本格式发送邮件
* @param mailInfo 待发送的邮件的信息
*/
public boolean sendTextMail(MailSenderInfo mailInfo) {
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
if (mailInfo.isValidate()) {
// 如果需要身份认证,则创建一个密码验证器
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
//Added by Shemin
String toList = getMailList(mailInfo.getToAddress().split(","));
InternetAddress[] iaToList = InternetAddress.parse(toList);
//mailMessage.setRecipient(Message.RecipientType.TO,iaToList);
mailMessage.setRecipients(Message.RecipientType.TO,iaToList);
//message.setRecipients(Message.RecipientType.TO,iaToList);
// 创建邮件的接收者地址,并设置到邮件消息中
// Address to = new InternetAddress(mailInfo.getToAddress());
//mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// 设置邮件消息的主要内容
String mailContent = mailInfo.getContent();
mailMessage.setText(mailContent);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/**
* 以HTML格式发送邮件
* @param mailInfo 待发送的邮件信息
*/
public static boolean sendHtmlMail(MailSenderInfo mailInfo){
// 判断是否需要身份认证
MyAuthenticator authenticator = null;
Properties pro = mailInfo.getProperties();
//如果需要身份认证,则创建一个密码验证器
if (mailInfo.isValidate()) {
authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(pro,authenticator);
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(sendMailSession);
// 创建邮件发送者地址
Address from = new InternetAddress(mailInfo.getFromAddress());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailInfo.getToAddress());
// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setRecipient(Message.RecipientType.TO,to);
// 设置邮件消息的主题
mailMessage.setSubject(mailInfo.getSubject());
// 设置邮件消息发送的时间
mailMessage.setSentDate(new Date());
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
mailMessage.setContent(mainPart);
// 发送邮件
Transport.send(mailMessage);
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
public 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();
}
}
3.MyAuthenticator.java
package com.util.mail;
import javax.mail.*;
public class MyAuthenticator extends Authenticator{
String userName=null;
String password=null;
public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
注意,3个.java需要在一个package中,不在com.util.mail里没有关系,但要打包到一起。
下面是调用的代码,这里开始是LotusScript了:
%REM
Agent SendMailByJava
Description: Comments for Agent
%END REM
Option Public
Option Declare
UseLSX "*javacon"
Use "JavaMailSend"
Use "Common.lss"
Dim session As NotesSession
Dim userName As NotesName
Dim jSession As javasession
Dim mailInfoClass As Javaclass
Dim smsClass As Javaclass
Dim mailInfo As JavaObject
Dim sms As JavaObject
Sub Initialize
Dim MemberList As Variant
Dim SendList As String
MemberList = FullTrim(ArrayUnique(expandGroupListMembers("IT课")))
SendList = Join(FullTrim(ArrayUnique(getPersonsEmailAddress(MemberList))),",")
Set jSession = New Javasession()
Set mailInfoClass = jSession.Getclass("com/util/mail/MailSenderInfo")
Set smsClass = jSession.Getclass("com/util/mail/SimpleMailSender")
Set mailInfo = mailInfoClass.Createobject()
mailInfo.setMailServerHost("smtp.sina.net")
mailInfo.setMailServerPort("25")
mailInfo.setValidate(True)
mailInfo.setUserName("admin@126.com")
mailInfo.setPassword("***")
mailInfo.setFromAddress("admin@126.com")
mailInfo.setToAddress(SendList)
mailInfo.setSubject("JavaMail解析邮件地址邮箱标题 ")
mailInfo.setContent("JavaMail测试邮箱,链接测试: http://ww.126.com")
Set sms = smsClass.Createobject()
sms.sendTextMail(mailInfo)
End Sub
上面的东西就是用的LS2J技术,UseLSX "*javacon" 是必须要有的,Use "JavaMailSend"是我们的3个.java所在的java库的名称,需要匹配,剩下的相信不难理解,里面还有我自己写的扩展群组套群组的方法,和得到用户Email地址的方法,在此我们是取出了公司所有IT课成员的邮箱地址,并发信,但这部分内容和本主题无关所以带过不讲了。