JavaMail发送邮件
2017-01-19 21:34
232 查看
问题描述
现在需要一个邮件发送服务,当某一特殊情况出现时,则向部分邮箱发送邮件,从而完成监控!
解决思路
Step one:利用JavaMail构造一个邮件发送jar包(MailSupervising.jar)
Step two:监测特殊情况是否出现(Supervising.sh)
Step three:当特殊情况出现时,发送邮件到指定邮箱(SupervisingMailShell.sh)
实现过程
– 构造邮件发送jar包
– 将上述.Java文件导出为可执行Jar包–>MailSupervising.jar
– 监测特殊情况是否出现
结果展示
注意问题
最好不要使用163的SMTP服务,因为163的发送邮件很容易被判为垃圾邮件而发不出去,也即下面这个错误:
现在需要一个邮件发送服务,当某一特殊情况出现时,则向部分邮箱发送邮件,从而完成监控!
解决思路
Step one:利用JavaMail构造一个邮件发送jar包(MailSupervising.jar)
Step two:监测特殊情况是否出现(Supervising.sh)
Step three:当特殊情况出现时,发送邮件到指定邮箱(SupervisingMailShell.sh)
实现过程
– 构造邮件发送jar包
import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message.RecipientType; 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; import javax.mail.internet.MimeUtility; /** * 创建并发送一封包含文本、附件的复杂邮件 * * @author L. D. Xiao */ public class MailSupervised { // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码,下列邮箱为测试邮箱,大家可正常使用) public static String myEmailAccount = "l_d_xiao@sina.com"; public static String myEmailPassword = "ab123456"; // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com // 新浪邮箱的 SMTP 服务器地址为: smtp.sina.com public static String myEmailSMTPHost = "smtp.sina.com"; // 收件人邮箱(替换为指定的邮件接收人列表) public static String[] receiveMailAccount = {"l_d_xiao@163.com","l_d_xiao@sina.com"}; public static void main(String[] args) throws Exception { //要发送的附件 String localPath="C:\\Users\\L.D.Xiao\\Desktop\\Supervising.txt"; //邮件主题 String mailSubject="源表数据上报存在问题"; //发送邮件的内容 String bodyText="数据源上报可能存在错误,需要及时处理,具体请查看附件监控日志信息!"; //传入参数处理 System.out.println(args.length); if (args.length < 1){ System.out.println("Error usage!"); System.out.println("Usage: /$JAVA_HOME/bin/java -jar MailSupervised.jar args[0] args[1] args[2] args[3]"); System.out.println("args[0]: mail reciever address lists, seperated by '\\;', like, --------l_d_xiao@sina.com;l_d_xiao@163.com;mingyemeng@163.com--------"); //收件人列表 System.out.println("args[1]: attachment LocalPath"); System.out.println("args[2]: mail Subject"); System.out.println("args[3]: mail body text"); System.out.println("Example: /opt/jdk1.7.0_67/bin/java -jar MailSupervised.jar l_d_xiao@sina.com\\;l_d_xiao@163.com\\;mingyemeng@163.com /usr/testImage.png \"mail subject\" \"mail body text\""); return; } else if (args.length==1){ dd2e receiveMailAccount = args[0].split(";"); //args[0]: mail reciever address list System.out.println(receiveMailAccount); System.out.println(args[0]); } else if (args.length==2){ receiveMailAccount = args[0].split(";"); localPath = args[1]; //args[1]: attachment local path System.out.println(receiveMailAccount); System.out.println(args[0]); System.out.println(args[1]); } else if (args.length==3){ receiveMailAccount =args[0].split(";"); localPath = args[1]; mailSubject = args[2]; //args[2]: mail subject } else if (args.length==4){ receiveMailAccount = args[0].split(";"); localPath = args[1]; mailSubject = args[2]; bodyText = args[3]; //args[3]: mail body text } // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties(); // 参数配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) props.setProperty("mail.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 props.setProperty("mail.smtp.auth", "true"); // 请求认证,参数名称与具体实现有关 // 2. 根据配置创建会话对象, 用于和邮件服务器交互 Session session = Session.getDefaultInstance(props); session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log // 3. 创建一封邮件 MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount, localPath, mailSubject, bodyText); // 4. 根据 Session 获取邮件传输对象 Transport transport = session.getTransport(); // 5. 使用 邮箱账号 和 密码 连接邮件服务器 // 这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错 transport.connect(myEmailAccount, myEmailPassword); // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 transport.close(); } /** * 创建一封复杂邮件(文本+附件) */ public static MimeMessage createMimeMessage(Session session, String sendMail, String[] receiveMail, String localPath, String mailSubject, String bodyText) throws Exception { // 1. 创建邮件对象 MimeMessage message = new MimeMessage(session); // 2. From: 发件人 message.setFrom(new InternetAddress(sendMail, "L. D. Xiao", "UTF-8")); // 3. To: 收件人(可以增加多个收件人、抄送、密送) int receiverNum = receiveMail.length; for (int i=0; i<receiverNum; i++){ message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail[i], receiveMail[i], "UTF-8")); } // 4. Subject: 邮件主题 message.setSubject(mailSubject, "UTF-8"); // 5. bodyText: 邮件正文内容 MimeBodyPart text = new MimeBodyPart(); text.setContent(bodyText, "text/html;charset=UTF-8"); // 6. 创建附件“节点” MimeBodyPart attachment = new MimeBodyPart(); DataHandler dh2 = new DataHandler(new FileDataSource(localPath)); // 读取本地文件 attachment.setDataHandler(dh2); // 将附件数据添加到“节点” attachment.setFileName(MimeUtility.encodeText(dh2.getName())); // 设置附件的文件名(需要编码) // 7. 设置文本和 附件 的关系(合成一个大的混合“节点” / Multipart ) MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加 mm.setSubType("mixed"); // 混合关系 // 8. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象) message.setContent(mm); // 9. 设置发件时间 message.setSentDate(new Date()); // 10. 保存上面的所有设置 message.saveChanges(); return message; } }
– 将上述.Java文件导出为可执行Jar包–>MailSupervising.jar
– 监测特殊情况是否出现
#!/bin/bash #监测脚本:Supervising.sh source ~/.bash_profile format_date() { Y=`expr substr $1 1 4` M=`expr substr $1 6 2` D=`expr substr $1 9 2` echo $Y"-"$M"-"$D } if [ $# -eq 1 ] then n_date=$1 else n_date=`date -d yesterday +"%Y-%m-%d"` fi v_date=$(format_date $n_date) #昨天 z_date=`date -d "$v_date +0 day " +%Y-%m-%d` #昨天, eg, 2017-01-18,用以指定log_date j_date=`date -d "$v_date +1 day " +%Y-%m-%d` #今天, eg, 2017-01-19 ErrorFlag=0 H2='sssssssssssssssssssssssssssssssssssssssssss开始监控ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss' echo $H2 echo $j_date echo $H2 title1='监控源表数据是否正常上报......' echo $title1 #推荐数据 hadoop fs -test -d /datawarehouse/test.db/actions_app/log_date=$z_date #检查目录是否存在,若存在则返回0, 否则返回1 Tmp=$? if [ $Tmp -eq 0 ] then echo `date +"%Y-%m-%d %H:%M:%S":test.actions_app数据上报正常!` hadoop fs -ls /datawarehouse/test.db/actions_app/log_date=$z_date else echo `date +"%Y-%m-%d %H:%M:%S":test.actions_app数据未正常上报!` ErrorFlag=1 fi #点播观影行为 hadoop fs -test -d /datawarehouse/test.db/user_behavior/log_date=$z_date #检查目录是否存在,若存在则返回0, 否则返回1 Tmp1=$? if [ $Tmp1 -eq 0 ] then echo `date +"%Y-%m-%d %H:%M:%S":test.user_behavior数据上报正常!` hadoop fs -ls /datawarehouse/test.db/user_behavior/log_date=$z_date else echo `date +"%Y-%m-%d %H:%M:%S":test.user_behavior数据未正常上报!` ErrorFlag=1 fi #直播观影行为 hadoop fs -test -d /datawarehouse/test.db/dtvinfo/log_date=$z_date #检查目录是否存在,若存在则返回0, 否则返回1 Tmp2=$? if [ $Tmp2 -eq 0 ] then echo `date +"%Y-%m-%d %H:%M:%S":test.dtvinfo数据上报正常!` hadoop fs -ls /datawarehouse/test.db/dtvinfo/log_date=$z_date else echo `date +"%Y-%m-%d %H:%M:%S":test.dtvinfo数据未正常上报!` ErrorFlag=1 fi #单天的画像 var='test_recommend_v1_' var1=${var}$h_date hadoop fs -test -d /hbase/$var1 #检查目录是否存在,若存在则返回0, 否则返回1 Tmp3=$? if [ $Tmp3 -eq 0 ] then echo `date +"%Y-%m-%d %H:%M:%S":$var1画像数据上报正常!` hadoop fs -ls /hbase/$var1 else echo `date +"%Y-%m-%d %H:%M:%S":$var1画像数据未正常上报!` ErrorFlag=1 fi #点播媒体库 echo `date +"%Y-%m-%d %H:%M:%S":/datawarehouse/test.db/test_video_converge表......` hadoop fs -ls /datawarehouse/test.db/test_video_converge #直播媒体库 echo `date +"%Y-%m-%d %H:%M:%S":/datawarehouse/test.db/re_channel_program_wiki表......` hadoop fs -ls /datawarehouse/test.db/re_channel_program_wiki #用户曝光iids数据 hadoop fs -test -d /datawarehouse/cds.db/raw_kafka_event_dfeedback_dt0/l_date=$z_date #检查目录是否存在,若存在则返回0, 否则返回1 Tmp21=$? if [ $Tmp21 -eq 0 ] then echo `date +"%Y-%m-%d %H:%M:%S":cds.raw_kafka_event_dfeedback_dt0数据上报正常!` hadoop fs -ls /datawarehouse/cds.db/raw_kafka_event_dfeedback_dt0/l_date=$z_date else echo `date +"%Y-%m-%d %H:%M:%S":cds.raw_kafka_event_dfeedback_dt0数据未正常上报!` ErrorFlag=1 fi title2='完成监控源表数据是否正常上报!' echo $title2 H4='eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee监控结束eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' echo $H4
#!/bin/bash #MailSupervisingShell.sh source ~/.bash_profile source /L.D.Xiao/Supervising.sh >> /L.D.Xiao/Supervising.log #定义ErrorFlag变量,ErrorFlag=1:上报出错,ErrorFlag=0:数据正常! #如果出现特殊,发送日志邮件至指定邮箱 if [ $ErrorFlag -eq 1 ] then rm /L.D.Xiao/SupervisingPartEnd.txt echo `date +"%Y-%m-%d %H:%M:%S":数据上报有问题,发送邮件......` tail -100 /L.D.Xiao/Supervising.log >> /L.D.Xiao/SupervisingPartEnd.txt ###使用之前构造的MailSupervising.jar包发送邮件### /opt/jdk1.7.0_67/bin/java -jar MailSupervising.jar l_d_xiao@163.com\;l_d_xiao@sina.com /L.D.Xiao/SupervisingPartEnd.txt echo `date +"%Y-%m-%d %H:%M:%S":数据上报有问题,邮件已发送!` else ErrorFlag=0 echo `date +"%Y-%m-%d %H:%M:%S":数据上报正常!` fi
结果展示
注意问题
最好不要使用163的SMTP服务,因为163的发送邮件很容易被判为垃圾邮件而发不出去,也即下面这个错误:
554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
相关文章推荐
- javamail发送简单的邮件
- 使用JavaMail创建邮件和发送邮件
- Java 基于JavaMail实现向QQ邮箱发送邮件(未测试)
- Web应用中使用JavaMail发送邮件
- JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件
- JavaMail发送邮件
- javamail发送邮件
- 使用javamail发送邮件
- javamail邮件发送
- 基于JavaMail的Java邮件发送:简单邮件发送
- Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
- JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
- javamail 发送网页形式的邮件 使用后的一点感想
- 使用javaMail来发送和接收带附件的邮件
- JavaMail发送邮件
- JavaMail发送邮件
- javamail邮件发送例子
- javamail发送邮件的简单实例
- JavaMail发送邮件带有附件
- 使用javamail发送邮件