package sendmail;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



/**
 * 閭欢鍙戯拷?锟藉伐鍏风被
 * 
 * @author shenjinzhu
 */
public class SendMailUtil {

	private final static Log log=LogFactory.getLog(SendMailUtil.class);

	// 发送邮件的邮箱号（若有授权码则密码输入授权码）
	public static String myEmailAccount = "ccxe4zhishu@126.com";
	public static String myEmailPassword = "1q2w3e4r5t";
//	public static String myEmailAccount = "ccxerisk@sina.com";
//	public static String myEmailPassword = "1q2w3e4r";
	// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
	// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
	public static String myEmailSMTPHost = "smtp.126.com";

	/**
	 * 
	 * @param mail
	 *            接收者的邮箱号
	 * @param url
	 *            本地的附件地址
	 */
	public static void sendMessage(String mail, String url,String str) {
		log.info(mail+","+url+","+str);
		// 创建参数配置, 用于连接邮件服务器的参数配置
		Properties props = new Properties();
		// 使用的协议（JavaMail规范要求）
		props.setProperty("mail.transport.protocol", "smtp");
		// 发件人的邮箱的 SMTP 服务器地址
		props.setProperty("mail.smtp.host", myEmailSMTPHost);
		// 需要请求认证
		props.setProperty("mail.smtp.auth", "true");
		final String smtpPort = "465";
		 props.setProperty("mail.smtp.port", smtpPort);
		 props.setProperty("mail.smtp.socketFactory.class",
		  "javax.net.ssl.SSLSocketFactory");
		  props.setProperty("mail.smtp.socketFactory.fallback", "false");
		  props.setProperty("mail.smtp.socketFactory.port", smtpPort);
//		PopupAuthenticator popAuthenticator=new PopupAuthenticator();
//		PasswordAuthentication   pop  =  popAuthenticator.performCheck("wanghongshuai@ccxe.com.cn","tt67z890zh"); 
//		Session   mysession  =  Session.getInstance(props, popAuthenticator);
//		
		// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
		// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
		/*
		 * // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, //
		 * 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助, // QQ邮箱的SMTP(SLL)端口为465或587,
		 * 其他邮箱自行去查看) final String smtpPort = "465";
		 * props.setProperty("mail.smtp.port", smtpPort);
		 * props.setProperty("mail.smtp.socketFactory.class",
		 * "javax.net.ssl.SSLSocketFactory");
		 * props.setProperty("mail.smtp.socketFactory.fallback", "false");
		 * props.setProperty("mail.smtp.socketFactory.port", smtpPort);
		 */
		// 根据配置创建会话对象, 用于和邮件服务器交互
		Session session = Session.getDefaultInstance(props);
		session.setDebug(false); // 设置为debug模式, 可以查看详细的发送 log
		// 创建邮件
		MimeMessage message;
		try {
			message = createMimeMessage(session, myEmailAccount, mail, url,str);
			// 根据 Session 获取邮件传输对象
			Transport transport = session.getTransport();
			/*
			 * 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 PS_02:
			 * 连接失败的原因通常为以下几点, 仔细检查代码: (1) 邮箱没有开启 SMTP 服务; (2) 邮箱密码错误,
			 * 例如某些邮箱开启了独立密码; (3) 邮箱服务器要求必须要使用 SSL 安全连接; (4) 请求过于频繁或其他原因,
			 * 被邮件服务器拒绝服务; (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
			 */
			transport.connect(myEmailAccount, myEmailPassword);
			// 发送邮件
			transport.sendMessage(message, message.getAllRecipients());
			// 关闭连接
			transport.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建一封只包含文本的简单邮件
	 * 
	 * @param session
	 *            和服务器交互的会话
	 * @param sendMail
	 *            发件人邮箱
	 * @param receiveMail
	 *            收件人邮箱
	 * @param url
	 *            本地文件地址
	 * @return
	 * @throws Exception
	 */
	public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String url,String strtitle)
			throws Exception {
		// 创建邮件
		MimeMessage message = new MimeMessage(session);
		SimpleDateFormat sfm = new SimpleDateFormat("yyyyMMdd");
		String str = sfm.format(new Date());
		// From: 发件人
		message.setFrom(new InternetAddress(sendMail, "有新短消息", "UTF-8"));
		// To: 收件人（可以增加多个收件人、抄送、密送）
		message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "UTF-8"));
		// Subject: 邮件主题
		message.setSubject(str + "数据结果", "UTF-8");
		/*
		 * Content: 邮件正文（可以使用html标签） message.setContent(
		 * "XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
		 */
		// 创建消息部分
		BodyPart messageBodyPart = new MimeBodyPart();
		String content = "你好";
//		content=new MailContent().getHtml();
		// 正文消息消息
		messageBodyPart.setContent(content,"text/html; charset=utf-8");
		// 创建多重消息
		Multipart multipart = new MimeMultipart();
		// 设置文本消息部分
		multipart.addBodyPart(messageBodyPart);
		// 附件部分
		messageBodyPart = new MimeBodyPart();
		// 文件本地地址
		String filename = url;
		DataSource source = new FileDataSource(filename);
		messageBodyPart.setDataHandler(new DataHandler(source));
		String hourstr = "";
		if (new Date().getHours() <= 10) {
			hourstr = "09";
		} else if(new Date().getHours()<=13){
			hourstr = "12";
		} else{
			hourstr = "16";
		}
		// 年月日时
		messageBodyPart.setFileName(sfm.format(new Date()) + hourstr + ".xls");
		multipart.addBodyPart(messageBodyPart);
		// 发送完整消息
		message.setContent(multipart);
		
		

		
		// 设置发件时间
		message.setSentDate(new Date());
		// 保存设置
		message.saveChanges();
		return message;
	}
public static void main(String[] args) {
	SendMailUtil.sendMessage("shenjinzhu999@163.com", "C:/Users/Administrator/Desktop/zhishu.xls","ccxe");
}
}
