如何用javamail定时发送邮件
例如:我想在3天后的中午12:00发送给别人邮件
还有就是每天的中午12点给别人发送邮件,而且这些个邮件地址是从一个jsp传来的
例如今天给a@https://www.doczj.com/doc/8c17033938.html,发,当执行过jsp后,jsp输入的是b@https://www.doczj.com/doc/8c17033938.html,,以后就给b@https://www.doczj.com/doc/8c17033938.html,发
而且jsp传过来的邮件地址数目是多个的,每天需要给多人在固定一时间内发邮件
定时触发器
有许多开源项目
Timer + 多线程
我在这里使用的Java计时器框架是由Java开发人员Tom White构建的一个简单通用的计划框架,以用于执行任意复杂的计划任务,他使我们实现灵活的计划策略成为可能。Java计时器框架的本身在这里不作过多的介绍,详细信息在IBM developerWorks中国网站。
我们主要讨论如何利用Java计时器框架在Solaris平台来实现邮件的定时发送、JavaMail发送邮件的实现以及在Solaris平台上如何以后台方式运行整个邮件定时发送的应用。
下载本文的源代码,参考具体实现。
1.1 形成schedule.jar包
schedule.jar包中的目录结构如下:
我们将数据库的连接、日志、邮件和计划框架的通用类形成一个与具体应用要求无关的schedule.jar包。利用javac将编译生成的目标class文件存在当前目录的classes文件夹下,然后通过jar -cvf schedule.jar ./*命令生成schedule.jar包。
1.1.1 Oracle数据库连接的建立
位于db目录下,通过thin方式建立与Oracle的数据库连接,具体的实现参见《J2EE应用中与Oracle数据库的连接》一文。
1.1.2 日志
以后台方式定时运行的应用应特别注意日志的功能,因为只有通过分析详细的日志信息才能准确掌握应用的执行情况。在logs目录下为Logs.java文件,代码如下:
package com.j2ee.logs;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class Logs
{
private String logType="";
private String server="/schedule/logs/server.log";
private String task="/schedule/implements/nohup.out";
private SimpleDateFormat dateFormat =
new SimpleDateFormat("【yyyy年MM月dd日 E a HH:mm:ss 】");
/**
* @param logType server task
*/
public Logs(String logType)
{
this.logType=logType;
}
public void print(String msg)
{
try
{
String path="";
if (logType.equals("server"))
path=server;
if (logType.equals("task"))
path=task;
//
BufferedWriter out
= new BufferedWriter(new FileWriter(path,true)); String str=dateFormat.format(new Date());
if (logType.equals("task"))
out.newLine();
out.write(str,0,str.length());
out.write(msg,0,msg.length());
out.newLine();
out.close();
}
catch(Exception e)
{
System.out.println("Logs.print:"+e.getMessage());
}
}
};
通过类中的构造器,可以生成两个日志文件:server.log和nohup.out。server.log用来记录计时器框架本身定时调度的日志信息,通过它来判断定时调度服务每天是否正常运行;nohup.out用来记录在具体应用中的调试信息,例如:在应用中通过System.out.println()输出的信息将记录在nohup.out文件中。
1.1.3 邮件
位于mail目录下,包括以下一些文件:
1)Debug.java 发送邮件时的调试信息
2)EMailContents.java 邮件的正文,为了使邮件接受者对收到的邮件有一个好的视觉效果,可以先写一个统一的HTML邮件模板,在模板中填充相应的内容。EmailContents类完成这一功能。效果如下:
3)Mailer.java 发送邮件的主方法。它调用MailThread类中的方法创建一个发送邮件的线程。
4)MailThread.java 发送邮件线程类。它调用MailHelper中的方法来完成发送邮件的工作。
5)MailHelper.java 发送邮件的实现类。在类的createAndSendMail方法中包括了发送邮件一系列必须的过程,它可以完成一些邮件的正文、附件、抄送、回执等功能。在邮件的实现中用到了两个jar包:mail.jar 和activation.jar。
1.1.4 计划框架
计划框架的详细内容可以通过本文前面提供的连接去详细了解,本文该部分的代码也出自IBM网站。
1.2 邮件定时发送的实现
这部分主要用到前面schedule.jar中的类来实现与具体应用要求相适应的应用。在implements目录下有三个类:
1)ScheduleTask.java 包含一个main方法,在本例中"每天计划3点开始执行计划好的任务"。
2)ScheduleThread.java 线程类,在该类的run方法中,可以添加不同类型的计划定时执行的任务类来完成不同的定时执行的任务,在本例中调用了Mails类中的sendMail方法来定时发送邮件。
3)Mails.java 按照一定的业务逻辑规则实现邮件的发送。
1.3 邮件定时发送应用的运行
包括应用的启动和停止,在Solaris上我们可以编写两个脚本:start和stop来完成该工作。
1.3.1 Start脚本
Start脚本内容如下:
echo '************************************************************'
CLASSPATH=.:/schedule/implements/jar/schedule.jar:
/schedule/implements/jar/classes12.zip:
/schedule/implements/jar/mail.jar:/schedule/implements/jar/activation.jar
export CLASSPATH
echo 'set schedule running environment success.'
nohup java com.j2ee.implement.ScheduleTask &
echo 'start schedule task success.'
echo 'view logs:'
echo ' /schedule/implements/nohup.out'
echo ' /schedule/logs/server.log'
date >> /schedule/logs/server.log
echo '计划框架成功启动' >> /schedule/logs/server.log
echo '************************************************************'
这里有两个关键点:CLASSPATH的设置和nohup运行方式。在CLASSPATH中必须提供用到的所有jar 包,多个jar包用":"分隔;"&"表示以后台方式运行,"nohup"使应用的运行不依赖于当前的会话,如果不以"nohup"方式的话,即" java com.j2ee.implement.ScheduleTask &",当你关闭你当前的会话时,应用将终止运行。可以使用"ps -ef | grep java"来查看应用运行的进程号。
当然也可以通过手工交互的方式完成上述步骤来运行应用。
1.3.2 Stop脚本
Stop脚本内容如下:
echo '************************************************************'
ps -e | grep java >> ps.out
kill -9 `cut -c 2-6 ps.out`
rm ps.out
date >> /schedule/logs/server.log
echo '计划框架成功停止' >> /schedule/logs/server.log
echo 'stop schedule task success.'
echo '************************************************************'
该脚本中主要通过" ps -e | grep java"命令将输出信息重定向到"ps.out"文件中,在从文件中获得进程号,然后将它kill掉。同样也可以通过手工的方式将它kill。
一般的问题在SUN中国的技术社区都能找的到的建议你去看看.
这篇是切过来的你可以去SUN中国技术社区下载具体实例
若其Type为tex/plain就可直接读出,代码如下:
总结
Java简化了企业解决方案的开发、部署和管理等相关的复杂问题,它是面向对象的编程语言,同时也是具有平台独立性、高性能的服务器端编程语言。它提供的标准系统框架和服务适合团体开发,可控制性好,与其它资源的集成性好。采用Java为编程工具开发高性能、高可用性的WebMail服务器具有非常重要的意义。
javamail邮件服务发送总结
首先我们得得到属性文件!
Properties props = new Properties();
然后将你要SMTP的服务器添加带此:bean.getServer()
props.put("mail.smtp.host", bean.getServer());
props.put("mail.transport.protocol", "smtp");
// props.put("mail.smtp.connectiontimeout", "10000");
这个注释是延时
// props.put("mail.smtp.timeout", "10000");
props.put("mail.smtp.auth", "true");如果你的smtp有验证则需要把后面写为true!一般163 soh u 等都需要验证!
MyAuthenticator auth = new MyAuthenticator(bean.getUser(), bean.getPassword());一个验证类在下面会贴出来
sendMailSession = Session.getDefaultInstance(props,
(Authenticator) auth);
然后我们得到session将配置文件与验证类写进去
sendMailSession.setDebug(true);//需要调试可以打
MimeMessage msg = new MimeMessage(sendMailSession);
InternetAddress fromAddress = new InternetAddress(bean.getFrom());
msg.setFrom(fromAddress); 发送人地址
// msg.setRecipient(Message.RecipientType.TO, new InternetAddress(bean.ge tTo())); 收件人地址
if(bean.getToEmail()!=null){
for(int i=0;i msg.addRecipients(Message.RecipientType.TO, bean.getToEmail()[i]); } 多个可以这样写(同收件人地址) } // Get two Object mp = new MimeMultipart(); BodyPart bp = new MimeBodyPart(); // Set Subject msg.setSubject(bean.getSubject(), "UTF-8"); 标题 // Set Context bean.setContext(new String(bean.getContext().getBytes("UTF-8"),"UTF-8 ")); bp.setContent(""+bean.getContext(),"text/html;charset=utf-8"); 内容 mp.addBodyPart(bp); 将标题与内容添加 //Set Ps if(bean.getFile()!=""){ 如果有附件则运行下面代码 bp = null; 先清空他 bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(bean.getFile()); bp.setDataHandler(new DataHandler(fileds)); bp.setFileName(fileds.getName()); 将文件set 进去 mp.addBodyPart(bp); 添加文件 } msg.setSentDate(new java.util.Date()); set时间 msg.setContent(mp); 将所有信息内容set msg.saveChanges();保存 transport = sendMailSession.getTransport("smtp"); System.out.println("Sending Mail...."); transport.connect(bean.getServer(), bean.getUser(), bean.getPassword()); transport.sendMessage(msg, msg.getAllRecipients()); 发送所有 transport.close(); System.out.println("OK."); 呵呵。最近研究邮件发送系统。总算搞出来了。 ~现在总结总结。其实也不算总结。给点注释就OK了 呵呵。。 看上面注释 下面是验证内: package org.softeem.mail; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class MyAuthenticator extends Authenticator { private String username; private String userpass; public MyAuthenticator(String un, String up) { super(); username = un; userpass = up; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, userpass); } } 今天在研究javamail发信的过程中,出现了一些小问题,现总结如下,以免后来者走些不必要的弯路,先把完整的能够正常运行的代码示例粘贴如下: 发邮件源代码: package com.hyq.test; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class MailExample { public static void main (String args[]) throws Exception { String host = "https://www.doczj.com/doc/8c17033938.html,"; //发件人使用发邮件的电子信箱服务器 String from = "你自己的电子信箱"; //发邮件的出发地(发件人的信箱) String to = "收件人信箱"; //发邮件的目的地(收件人信箱) // Get system properties Properties props = System.getProperties(); // Setup mail server props.put("mail.smtp.host", host); // Get session props.put("mail.smtp.auth", "true"); //这样才能通过验证 MyAuthenticator myauth = new MyAuthenticator("你自己的电子信箱", "你自己的信箱密码"); Session session = Session.getDefaultInstance(props, myauth); // session.setDebug(true); // Define message MimeMessage message = new MimeMessage(session); // Set the from address message.setFrom(new InternetAddress(from)); // Set the to address message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set the subject message.setSubject("测试程序!"); // Set the content message.setText("这是用java写的发送电子邮件的测试程序!"); message.saveChanges(); Transport.send(message); } } 校验发信人权限的方法 package com.hyq.test; import javax.mail.PasswordAuthentication; class MyAuthenticator extends javax.mail.Authenticator { private String strUser; private String strPwd; public MyAuthenticator(String user, String password) { this.strUser = user;