【实战】使用Java结合Sendmail邮件服务器+Quartz开源框架定时发邮件
1、安裝sendmail(centos6.3下默認yum源,默認sendmail系統(tǒng)自帶) yum install sendmail* -y
問題1:會遇到發(fā)郵件和啟動很慢或者My unqualified host name (iZ23ole851hZ) unknown; sleeping for retry
解決辦法:vim /etc/hosts 11.11.11.11 localhost.localdomain localhost? yourhost 127.0.0.1? localhost.localdomain localhost
systemctl enable sendmail.
servicesystemctl start sendmail
systemctl restart sendmail
systemctl?? status sendmail
測試發(fā)送一封郵件到自己的郵箱:
mail abc@qq.com
Subject: qweqwe?? ---》回車
asdasd? ----》Ctrl+D
EOT
到郵箱看看是否收到該郵件,收到則配置成功
2.修改sendmail配置文件
1.修改/etc/mail/sendmail.mc 刪掉dnl注釋 TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl 修改Addr 為0.0.0.0 DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl 2.然后M4,生成配置文件?m4 sendmail.mc > sendmail.cf 3.同時修改/etc/mail/access,開通訪問權(quán)限? 【這里一定要修改否則連不上sendmail service】
Connect:localhost.localdomain?????????? RELAY
Connect:localhost?????????????????????? RELAY
Connect:127.0.0.1?????????????????????? RELAY
Connect:xx.xx.xxx.x???????????????????? RELAY???? 工作場所的網(wǎng)絡(luò)外網(wǎng)IP
Connect:server ip???????????????????????? RELAY???? 你自己的linux 外網(wǎng)ip
###windows 10 64bit
第二步:使用eclipse搭建Quartz開源定時任務(wù)調(diào)度框架以及測試sendmail郵件發(fā)送功能。
1.新建Java project,把如下代碼放入到src下面。? 假設(shè)package是com.mailtest; 也可以自己新建package。
構(gòu)建需要的jar包:
項目->buid path->mail.1.7.4.jar
會用log4j的朋友,也可以使用它排錯。
代碼一:
import javax.mail.*; public class MailAuthenticator extends Authenticator
{
??? //******************************
??? //由于發(fā)送郵件的地方比較多,
??? //下面統(tǒng)一定義用戶名,口令.
??? //******************************
??? public static String HUAWEI_MAIL_USER = "user";? ///這里是linux server的ssh的用戶名
??? public static String HUAWEI_MAIL_PASSWORD = "xxxxx";? ///這里是linux server的ssh的密碼
??? public MailAuthenticator()
??? {
??? }
??? protected PasswordAuthentication getPasswordAuthentication()
??? {
??????? return new PasswordAuthentication(HUAWEI_MAIL_USER, HUAWEI_MAIL_PASSWORD);
??? }
}
代碼二:
import javax.mail.*;import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendMail {
??? //要發(fā)送Mail地址
??? private String mailTo = null;
??? //Mail發(fā)送的起始地址
??? private String mailFrom = null;
??? //SMTP主機地址
??? private String smtpHost = null;
??? //是否采用調(diào)試方式
??? private boolean debug = false;
??? private String messageBasePath = null;
??? //Mail主題
??? private String subject;
??? //Mail內(nèi)容
??? private String msgContent;
??? private Vector attachedFileList;
??? private String mailAccount = null;
??? private String mailPass = null;
??? private String messageContentMimeType ="text/html; charset=gb2312";
??? private String mailbccTo = null;
??? private String mailccTo = null;
??? /**
???? * SendMailService 構(gòu)造子注解。
???? */
??? public SendMail() {
??????? super();
??? }
??? private void fillMail(Session session,MimeMessage msg) throws IOException, MessagingException{
??????? String fileName = null;
??????? Multipart mPart = new MimeMultipart();
??????? if (mailFrom != null) {
??????????? msg.setFrom(new InternetAddress(mailFrom));
??????????? System.out.println("發(fā)送人Mail地址:"+mailFrom);
??????? } else {
??????????? System.out.println("沒有指定發(fā)送人郵件地址!");
??????????? return;
??????? }
??????? if (mailTo != null) {
??????????? InternetAddress[] address = InternetAddress.parse(mailTo);
??????????? msg.setRecipients(Message.RecipientType.TO, address);
??????????? System.out.println("收件人Mail地址:"+mailTo);
??????? } else {
??????????? System.out.println("沒有指定收件人郵件地址!");
??????????? return;
??????? }
??????? if (mailccTo != null) {
??????????? InternetAddress[] ccaddress = InternetAddress.parse(mailccTo);
??????????? System.out.println("CCMail地址:"+mailccTo);
??????????? msg.setRecipients(Message.RecipientType.CC, ccaddress);
??????? }
??????? if (mailbccTo != null) {
??????????? InternetAddress[] bccaddress = InternetAddress.parse(mailbccTo);
??????????? System.out.println("BCCMail地址:"+mailbccTo);
??????????? msg.setRecipients(Message.RecipientType.BCC, bccaddress);
??????? }
??????? msg.setSubject(subject);
??????? InternetAddress[] replyAddress = { new InternetAddress(mailFrom)};
??????? msg.setReplyTo(replyAddress);
??????? // create and fill the first message part
??????? MimeBodyPart mBodyContent = new MimeBodyPart();
??????? if (msgContent != null)
??????????? mBodyContent.setContent(msgContent, messageContentMimeType);
??????? else
??????????? mBodyContent.setContent("", messageContentMimeType);
??????? mPart.addBodyPart(mBodyContent);
??????? // attach the file to the message
??????? if (attachedFileList != null) {
??????????? for (Enumeration fileList = attachedFileList.elements(); fileList.hasMoreElements();) {
??? fileName = (String) fileList.nextElement();
??? MimeBodyPart mBodyPart = new MimeBodyPart();
??? // attach the file to the message
??? FileDataSource fds = new FileDataSource(messageBasePath + fileName);
??? System.out.println("Mail發(fā)送的附件為:"+messageBasePath + fileName);
??? mBodyPart.setDataHandler(new DataHandler(fds));
??? mBodyPart.setFileName(fileName);
??? mPart.addBodyPart(mBodyPart);
??????????? }
??????? }
??????? msg.setContent(mPart);
??????? msg.setSentDate(new Date());
??? }
??? /**
???? * 此處插入方法說明。
???? */
??? public void init()
??? {
??? }
??? /**
???? * 發(fā)送e_mail,返回類型為int
???? * 當(dāng)返回值為0時,說明郵件發(fā)送成功
???? * 當(dāng)返回值為3時,說明郵件發(fā)送失敗
???? */
??? public int sendMail() throws IOException, MessagingException {
??????? int loopCount;
??????? Properties props = System.getProperties();
??????? props.put("mail.smtp.host", smtpHost);
??????? props.put("mail.smtp.auth", "true");
??????? MailAuthenticator auth = new MailAuthenticator();
??????? Session session = Session.getInstance(props, auth);
??????? session.setDebug(debug);
??????? MimeMessage msg = new MimeMessage(session);
??????? Transport trans = null;
??????? try {
??????????? fillMail(session,msg);
??????????? // send the message
??????????? trans = session.getTransport("smtp");
??????????? try {
??? trans.connect(smtpHost, MailAuthenticator.HUAWEI_MAIL_USER, MailAuthenticator.HUAWEI_MAIL_PASSWORD);//, HUAWEI_MAIL_PASSWORD);
??????????? } catch (AuthenticationFailedException e) {
??? e.printStackTrace();
??? System.out.println("連接郵件服務(wù)器錯誤:");
??????????????? return 3;
??????????? } catch (MessagingException e) {
??? System.out.println("連接郵件服務(wù)器錯誤:");
??? return 3;
??????????? }
??????????? trans.send(msg);
??????????? trans.close();
??????? } catch (MessagingException mex) {
??????????? System.out.println("發(fā)送郵件失敗:");
??????????? mex.printStackTrace();
??????????? Exception ex = null;
??????????? if ((ex = mex.getNextException()) != null) {
??? System.out.println(ex.toString());
??? ex.printStackTrace();
??????????? }
??????????? return 3;
??????? } finally {
??????????? try {
??? if (trans != null && trans.isConnected())
??? trans.close();
??????????? } catch (Exception e) {
??????????????? System.out.println(e.toString());
??????????? }
??????? }
??????? System.out.println("發(fā)送郵件成功!");
??????? return 0;
??? }
??? public void setAttachedFileList(java.util.Vector filelist)
??? {
??????? attachedFileList = filelist;
??? }
??? public void setDebug(boolean debugFlag)
??? {
??????? debug=debugFlag;
??? }
??? public void setMailAccount(String strAccount) {
??????? mailAccount = strAccount;
??? }
??? public void setMailbccTo(String bccto) {
??????? mailbccTo = bccto;
??? }
??? public void setMailccTo(String ccto) {
??????? mailccTo = ccto;
??? }
??? public void setMailFrom(String from)
??? {
??????? mailFrom=from;
??? }
??? public void setMailPass(String strMailPass) {
??????? mailPass = strMailPass;
??? }
??? public void setMailTo(String to)
??? {
??????? mailTo=to;
??? }
??? public void setMessageBasePath(String basePath)
??? {
??????? messageBasePath=basePath;
??? }
??? public void setMessageContentMimeType(String mimeType)
??? {
??????? messageContentMimeType = mimeType;
??? }
??? public void setMsgContent(String content)
??? {
??????? msgContent=content;
??? }
??? public void setSMTPHost(String host)
??? {
??????? smtpHost=host;
??? }
??? public void setSubject(String sub)
??? {
??????? subject=sub;
??? }
}
可以測試一下java是否能連上sendmail。
public static void main(String[] argv) throws Exception
??? {
??????? //for(int i = 0;i<10;i++) {
??????? SendMail sm = new SendMail();???????
????????? sm.setSMTPHost("114.55.106.84");
??????? sm.setMailFrom("abc@qq.com");????????? //使用自己的郵箱
??????? sm.setMailTo("erf@qq.com");????????????? ?//別人的郵箱
??????? sm.setMsgContent("hello");
??????? sm.setSubject("say hi~~");
??????? sm.sendMail();
??????? //}
??? }
經(jīng)過測試,郵件發(fā)送成功~?? 【如果實踐到這里的童鞋不太會的或者遇到問題的可以留言,涉及的細節(jié)有點多,難免遺漏】
代碼三:
搭建Quartz 任務(wù)調(diào)度。
項目->build path->quartz-1.8.1.jar,slf4j-api-1.7.7.jar,log4j-api-2.2.jar,jackson-mapper-asl-1.9.13.jar
假設(shè)自己的package 是com.quartz.test。
構(gòu)建Job類QuartzJob.java
package com.quartz.test; import java.io.IOException;import java.text.SimpleDateFormat;?
import java.util.Date;? import javax.mail.MessagingException; import org.quartz.Job;?
import org.quartz.JobExecutionContext;?
import org.quartz.JobExecutionException;? import com.mailtest.*; /**
?* @Description: 任務(wù)執(zhí)行類
?*
?* @ClassName: QuartzJob
?* @Copyright: Copyright (c) 2014
?*
??*@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
?*/?
public class QuartzJob implements Job {?
?
??? //@Override?
??? public void execute(JobExecutionContext arg0) throws JobExecutionException {?
??? ?SendMail sm = new SendMail();
??????? sm.setSMTPHost("xxxx");
??????? sm.setMailFrom("abc@qq.com");
??????? sm.setMailTo("erf@qq.com");
??????? sm.setMsgContent("hello");
??????? sm.setSubject("say hi~~");
??????? try {
???sm.sendMail();
??} catch (IOException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??} catch (MessagingException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
??????? System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"郵件發(fā)送成功");???
??? }?
}
構(gòu)建scheduler? QuartzManager.java.?? // 對任務(wù)進行增刪改查.
package com.quartz.test;import org.quartz.CronTrigger;?
import org.quartz.JobDetail;?
import org.quartz.Scheduler;?
import org.quartz.SchedulerFactory;?
import org.quartz.impl.StdSchedulerFactory; public class QuartzManager { private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();?
??? private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";?
??? private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
???
??? /**
???? * @Description: 添加一個定時任務(wù),使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名
???? *?
???? * @param jobName
???? *??????????? 任務(wù)名
???? * @param cls
???? *??????????? 任務(wù)
???? * @param time
???? *??????????? 時間設(shè)置,參考quartz說明文檔
???? *?
???? * @Title: QuartzManager.java
???? * @Copyright: Copyright (c) 2014
???? *?
?????*@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */
???
?? // @SuppressWarnings("unchecked")?
??? public static void addJob(String jobName, Class cls, String time) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任務(wù)名,任務(wù)組,任務(wù)執(zhí)行類?
??????????? // 觸發(fā)器?
??????????? CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 觸發(fā)器名,觸發(fā)器組?
??????????? trigger.setCronExpression(time);// 觸發(fā)器時間設(shè)定?
??????????? sched.scheduleJob(jobDetail, trigger);?
??????????? // 啟動?
??????????? if (!sched.isShutdown()) {?
??????????????? sched.start();?
??????????? }?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }
???
??? /**
???? * @Description: 添加一個定時任務(wù)
???? *?
???? * @param jobName
???? *??????????? 任務(wù)名
???? * @param jobGroupName
???? *??????????? 任務(wù)組名
???? * @param triggerName
???? *??????????? 觸發(fā)器名
???? * @param triggerGroupName
???? *??????????? 觸發(fā)器組名
???? * @param jobClass
???? *??????????? 任務(wù)
???? * @param time
???? *??????????? 時間設(shè)置,參考quartz說明文檔
???? *?
???? * @Title: QuartzManager.java
???? * @Copyright: Copyright (c) 2014
???? *?
?????*@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */
???
??? //@SuppressWarnings("unchecked")?
??? public static void addJob(String jobName, String jobGroupName,?
??????????? String triggerName, String triggerGroupName, Class jobClass,?
??????????? String time) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任務(wù)名,任務(wù)組,任務(wù)執(zhí)行類?
??????????? // 觸發(fā)器?
??????????? CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 觸發(fā)器名,觸發(fā)器組?
??????????? trigger.setCronExpression(time);// 觸發(fā)器時間設(shè)定?
??????????? sched.scheduleJob(jobDetail, trigger);?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description: 修改一個任務(wù)的觸發(fā)時間(使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名)
???? *?
???? * @param jobName
???? * @param time
???? *?
???? * @Title: QuartzManager.java
???? ?*@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */?
??? //@SuppressWarnings("unchecked")?
??? public static void modifyJobTime(String jobName, String time) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);?
??????????? if (trigger == null) {?
??????????????? return;?
??????????? }?
??????????? String oldTime = trigger.getCronExpression();?
??????????? if (!oldTime.equalsIgnoreCase(time)) {?
??????????????? JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);?
??????????????? Class objJobClass = jobDetail.getJobClass();?
??????????????? removeJob(jobName);?
??????????????? addJob(jobName, objJobClass, time);?
??????????? }?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description: 修改一個任務(wù)的觸發(fā)時間
???? *?
???? * @param triggerName
???? * @param triggerGroupName
???? * @param time
???? *?
???? * @Title: QuartzManager.java
???? ?*@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */?
??? public static void modifyJobTime(String triggerName,?
??????????? String triggerGroupName, String time) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);?
??????????? if (trigger == null) {?
??????????????? return;?
??????????? }?
??????????? String oldTime = trigger.getCronExpression();?
??????????? if (!oldTime.equalsIgnoreCase(time)) {?
??????????????? CronTrigger ct = (CronTrigger) trigger;?
??????????????? // 修改時間?
??????????????? ct.setCronExpression(time);?
??????????????? // 重啟觸發(fā)器?
??????????????? sched.resumeTrigger(triggerName, triggerGroupName);?
??????????? }?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description: 移除一個任務(wù)(使用默認的任務(wù)組名,觸發(fā)器名,觸發(fā)器組名)
???? *?
???? * @param jobName
???? *?
???? * @Title: QuartzManager.java * *@Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */?
??? public static void removeJob(String jobName) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止觸發(fā)器?
??????????? sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除觸發(fā)器?
??????????? sched.deleteJob(jobName, JOB_GROUP_NAME);// 刪除任務(wù)?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description: 移除一個任務(wù)
???? *?
???? * @param jobName
???? * @param jobGroupName
???? * @param triggerName
???? * @param triggerGroupName
???? *?
???? * @Title: QuartzManager.java
???? * @Copyright: Copyright (c) 2017?
???? *?
???? * @author?qq1960105914
???? * @date 2017?
???? * @version V2.0
???? */?
??? public static void removeJob(String jobName, String jobGroupName,?
??????????? String triggerName, String triggerGroupName) {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? sched.pauseTrigger(triggerName, triggerGroupName);// 停止觸發(fā)器?
??????????? sched.unscheduleJob(triggerName, triggerGroupName);// 移除觸發(fā)器?
??????????? sched.deleteJob(jobName, jobGroupName);// 刪除任務(wù)?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description:啟動所有定時任務(wù)
???? *?
???? *?
???? * @Title: QuartzManager.java
???? * @Copyright: Copyright (c) 2017
???? *?
???? * @author?qq1960105914?
???? * @date 2017
???? * @version V2.0
???? */?
??? public static void startJobs() {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? sched.start();?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }?
?
??? /**
???? * @Description:關(guān)閉所有定時任務(wù)
???? *?
???? *?
???? * @Title: QuartzManager.java
???? * @Copyright: Copyright (c) 2014
???? *?
???? * @author Comsys-LZP
???? * @date 2014-6-26 下午03:50:26
???? * @version V2.0
???? */?
??? public static void shutdownJobs() {?
??????? try {?
??????????? Scheduler sched = gSchedulerFactory.getScheduler();?
??????????? if (!sched.isShutdown()) {?
??????????????? sched.shutdown();?
??????????? }?
??????? } catch (Exception e) {?
??????????? throw new RuntimeException(e);?
??????? }?
??? }
???
?
}
構(gòu)建main 類。
package com.quartz.test;import com.quartz.test.QuartzJob;?
import com.quartz.test.QuartzManager;?
?
/**
?* @Description: 測試類
?*
?* @ClassName: QuartzTest
?* @Copyright: Copyright (c) 2017
?*
?* @author?QQ1960105914
?* @date 20170215
?* @version??
?*/?
public class QuartzTest {?
??? public static void main(String[] args) {?
??????? try {?
??????????? String job_name = "動態(tài)任務(wù)調(diào)度";?
??????????? System.out.println("【系統(tǒng)啟動】開始(每1秒輸出一次)...");???
??????????? QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");???
?????????????
??????????? Thread.sleep(5000);???
??????????? System.out.println("【修改時間】開始(每2秒輸出一次)...");???
??????????? QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");???
??????????? Thread.sleep(6000);???
??????????? System.out.println("【移除定時】開始...");???
??????????? QuartzManager.removeJob(job_name);???
??????????? System.out.println("【移除定時】成功");???
?????????????
??????????? System.out.println("【再次添加定時任務(wù)】開始(每10秒輸出一次)...");???
??????????? QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");???
??????????? Thread.sleep(60000);???
??????????? System.out.println("【移除定時】開始...");???
??????????? QuartzManager.removeJob(job_name);???
??????????? System.out.println("【移除定時】成功");?
??????? } catch (Exception e) {?
??????????? e.printStackTrace();?
??????? }?
??? }?
}?
以上測試過后收到郵件說明成功。
本實踐本人親測可以使用,同時網(wǎng)絡(luò)也有借鑒。 參考文章部分內(nèi)容:http://blog.csdn.net/pengpegv5yaya/article/details/37595889/
總結(jié)
以上是生活随笔為你收集整理的【实战】使用Java结合Sendmail邮件服务器+Quartz开源框架定时发邮件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于solarwinds的一些介绍
- 下一篇: 版本管理:Subversion Edge