您的位置:首页 > 编程语言 > Java开发

JavaMail发送邮件

2017-01-19 21:34 232 查看
问题描述

现在需要一个邮件发送服务,当某一特殊情况出现时,则向部分邮箱发送邮件,从而完成监控!

解决思路

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 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: