腾讯企业邮箱-收邮件
package com.hzsmk.ocr.service;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties;import javax.mail.Address;import javax.mail.BodyPart;import javax.mail.Flags;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Part;import javax.mail.Session;import javax.mail.Store;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility;import mons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.ponent;import mon.util.FileResult;import mon.util.OssFileUtil;import com.hzsmk.ocr.bean.co.MailInfoCo;/*** @author:Deng* @date: -04-14 17:30* @remark: 腾讯邮件读取*/@Componentpublic class ReadSmkQQMailUtil {@Autowiredprivate OssFileUtil ossFileUtil;@Autowiredprivate MailReadFileService mailReadFileService;//收件箱 账户密码public void readEmail(String mailUser,String mailPassword) {Properties props = new Properties();props.put("mail.imap.host", "imap.");//QQ邮箱为:props.put("mail.imap.auth", "true");props.setProperty("mail.store.protocol", "imap");props.put("mail.imap.starttls.enable", "true");Session session = Session.getInstance(props);try {Store store = session.getStore();//企业邮箱如果开启了安全登录,密码需要使用专用密码,没有开启使用账号密码即可store.connect("imap.", mailUser, mailPassword);//store.connect("", "xxx@", "授权码");//QQ邮箱需要设置授权码Folder folder = store.getFolder("Inbox");System.out.println(folder.getMessageCount());//邮箱打开方式folder.open(Folder.READ_WRITE);//收取未读邮件Message[] messages = folder.getMessages(folder.getMessageCount() - folder.getUnreadMessageCount() + 1, folder.getMessageCount());System.out.println("邮件总数: " + folder.getMessageCount());//解析的邮件的方法,就粘贴了网上的了,有需要的直接点击参考文档的链接for (Message msg: messages) {if(parseFileMessage(folder,msg)) {//标记为已读folder.setFlags(new Message[] {msg}, new Flags(Flags.Flag.SEEN), true);}}}catch (Exception e){System.out.println("异常: " + e);}}//private boolean parseFileMessage(Folder folder,Message message) {try {// 解析读取到的邮件MimeMessage msg = (MimeMessage) message;System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");System.out.println("主题: " + MimeUtility.decodeText(msg.getSubject()));System.out.println("发件人: " + getFrom(msg));System.out.println("收件人:" + getReceiveAddress(msg, null));System.out.println("发送时间:" + getSentDate(msg, null));System.out.println("是否已读:" + isSeen(msg));System.out.println("邮件优先级:" + getPriority(msg));System.out.println("是否需要回执:" + isReplySign(msg));System.out.println("邮件ID:"+msg.getContentID());System.out.println("邮件ID:"+msg.getContentMD5());System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");StringBuffer content = new StringBuffer(30);getMailTextContent(msg, content);System.out.println("邮件正文:" + (content.length() > 100 ? content.substring(0,100) + "..." : content));System.out.println();MailInfoCo mailInfoco = new MailInfoCo(msg.getContentMD5(), getFrom(msg), MimeUtility.decodeText(msg.getSubject()), getSentDate(msg, null));boolean isContainerAttachment = isContainAttachment(msg);System.out.println("是否包含附件:" + isContainerAttachment);if (isContainerAttachment) {saveAttachmentFileStoage(mailInfoco,msg, msg.getFileName()); //保存附件}System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 获得邮件发件人* @param msg 邮件内容* @return 姓名 <Email地址>* @throws MessagingException* @throws UnsupportedEncodingException*/private String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {String from = "";Address[] froms = msg.getFrom();if (froms.length < 1)throw new MessagingException("没有发件人!");InternetAddress address = (InternetAddress) froms[0];String person = address.getPersonal();if (person != null) {person = MimeUtility.decodeText(person) + " ";} else {person = "";}from = person + "<" + address.getAddress() + ">";return from;}/*** 获得邮件发送时间* @param msg 邮件内容* @return yyyy年mm月dd日 星期X HH:mm* @throws MessagingException*/private String getSentDate(MimeMessage msg, String pattern) throws MessagingException {Date receivedDate = msg.getSentDate();if (receivedDate == null)return "";if (pattern == null || "".equals(pattern))pattern = "yyyy年MM月dd日 E HH:mm ";return new SimpleDateFormat(pattern).format(receivedDate);}/*** 判断邮件是否已读* @param msg 邮件内容* @return 如果邮件已读返回true,否则返回false* @throws MessagingException*/private boolean isSeen(MimeMessage msg) throws MessagingException {return msg.getFlags().contains(Flags.Flag.SEEN);}/*** 判断邮件是否需要阅读回执* @param msg 邮件内容* @return 需要回执返回true,否则返回false* @throws MessagingException*/private boolean isReplySign(MimeMessage msg) throws MessagingException {boolean replySign = false;String[] headers = msg.getHeader("Disposition-Notification-To");if (headers != null)replySign = true;return replySign;}/*** 获得邮件的优先级* @param msg 邮件内容* @return 1(High):紧急 3:普通(Normal) 5:低(Low)* @throws MessagingException*/private String getPriority(MimeMessage msg) throws MessagingException {String priority = "普通";String[] headers = msg.getHeader("X-Priority");if (headers != null) {String headerPriority = headers[0];if (headerPriority.contains("1") || headerPriority.contains("High"))priority = "紧急";else if (headerPriority.contains("5") || headerPriority.contains("Low"))priority = "低";elsepriority = "普通";}return priority;}/*** 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人* <p>Message.RecipientType.TO 收件人</p>* <p> 抄送</p>* <p>Message.RecipientType.BCC 密送</p>* @param msg 邮件内容* @param type 收件人类型* @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...* @throws MessagingException*/private String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {StringBuilder receiveAddress = new StringBuilder();Address[] addresss;if (type == null) {addresss = msg.getAllRecipients();} else {addresss = msg.getRecipients(type);}if (addresss == null || addresss.length < 1)throw new MessagingException("没有收件人!");for (Address address : addresss) {InternetAddress internetAddress = (InternetAddress)address;receiveAddress.append(internetAddress.toUnicodeString()).append(",");}receiveAddress.deleteCharAt(receiveAddress.length()-1); //删除最后一个逗号return receiveAddress.toString();}/*** 判断邮件中是否包含附件** @return 存在附件返回true,不存在返回false*/private boolean isContainAttachment(Part part) throws Exception {boolean flag = false;if (part.isMimeType("multipart/*")) {MimeMultipart multipart = (MimeMultipart) part.getContent();int partCount = multipart.getCount();for (int i = 0; i < partCount; i++) {BodyPart bodyPart = multipart.getBodyPart(i);String disp = bodyPart.getDisposition();if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {flag = true;} else if (bodyPart.isMimeType("multipart/*")) {flag = isContainAttachment(bodyPart);} else {String contentType = bodyPart.getContentType();if (contentType.contains("application")) {flag = true;}if (contentType.contains("name")) {flag = true;}}if (flag) break;}} else if (part.isMimeType("message/rfc822")) {flag = isContainAttachment((Part) part.getContent());}return flag;}/*** 保存文件** @param destDir 文件目录* @param fileName 文件名* @throws Exception 异常*/private void saveAttachmentFileStoage(MailInfoCo mailInfoco,Part part,String fileName) throws Exception {if (part.isMimeType("multipart/*")) {//复杂体邮件Multipart multipart = (Multipart) part.getContent();//复杂体邮件包含多个邮件体int partCount = multipart.getCount();for (int i = 0; i < partCount; i++) {//获得复杂体邮件中其中一个邮件体BodyPart bodyPart = multipart.getBodyPart(i);//迭代处理邮件体,直到附件为止String disp = bodyPart.getDisposition();String decodeName = decodeText(bodyPart.getFileName());decodeName = StringUtils.isEmpty(decodeName) ? fileName : decodeName;if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {// saveFile(bodyPart.getInputStream().available(), destDir, decodeName);saveMailFile(mailInfoco,bodyPart, decodeName);} else if (bodyPart.isMimeType("multipart/*")) {saveAttachmentFileStoage(mailInfoco,bodyPart,fileName);} else {String contentType = bodyPart.getContentType();if (contentType.contains("name") || contentType.contains("application")) {saveMailFile(mailInfoco,bodyPart, decodeName);//saveFile(bodyPart.getInputStream(), destDir, decodeName);}}}} else if (part.isMimeType("message/rfc822")) {saveAttachmentFileStoage(mailInfoco,(Part) part.getContent(), fileName);}}private void saveMailFile(MailInfoCo mailInfoco,BodyPart bodyPart,String fileName) throws IOException, MessagingException {//上传到文件服务器FileResult filere = ossFileUtil.uploadFile(getFileBuffer(bodyPart.getInputStream()), fileName);//保存到数据库里面mailReadFileService.saveMailFile(mailInfoco, filere,fileName);}/*** 获取文件字节** @param file* @return*/private byte[] getFileBuffer(InputStream in) {byte[] fileByte = null;try {fileByte = new byte[in.available()];in.read(fileByte);} catch (IOException e) {}return fileByte;}/*** 获得邮件文本内容* @param part 邮件体* @param content 存储邮件文本内容的字符串* @throws MessagingException* @throws IOException*/private void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {//如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;if (part.isMimeType("text/*") && !isContainTextAttach) {content.append(part.getContent().toString());} else if (part.isMimeType("message/rfc822")) {getMailTextContent((Part)part.getContent(),content);} else if (part.isMimeType("multipart/*")) {Multipart multipart = (Multipart) part.getContent();int partCount = multipart.getCount();for (int i = 0; i < partCount; i++) {BodyPart bodyPart = multipart.getBodyPart(i);getMailTextContent(bodyPart,content);}}}/*** 文本解码*/private String decodeText(String encodeText) throws Exception {if (encodeText == null || "".equals(encodeText)) {return "";} else {return MimeUtility.decodeText(encodeText);}}}
腾讯企业邮箱-发送邮件
package com.hzsmk.ocr.service;import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;import javax.mail.internet.*;import java.io.UnsupportedEncodingException;import java.security.GeneralSecurityException;import java.util.Date;import java.util.Properties;public class MailUtils {//邮件账户private static final String FROM_MAIL ="yu111111";//邮箱密码private static final String MAIL_PASSWPRD ="Sm111111";public static void sendEmail(String toMail, String subject, String messages){Properties prop = new Properties();//协议prop.setProperty("mail.transport.protocol", "smtp");//服务器prop.setProperty("mail.smtp.host", "smtp.");prop.setProperty("mail.smtp.socketFactory.class", ".ssl.SSLSocketFactory");// 就可了// prop.setProperty("mail.smtp.socketFactory.class", ".ssl.SSLSocketFactory");//prop.setProperty("mail.smtp.socketFactory.port", "465");//端口prop.setProperty("mail.smtp.port", "465");//使用smtp身份验证prop.setProperty("mail.smtp.auth", "true");//使用SSL,企业邮箱必需!//开启安全协议MailSSLSocketFactory sf = null;try {sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);} catch (GeneralSecurityException e1) {e1.printStackTrace();}prop.put("mail.smtp.ssl.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);////获取Session对象Session s = Session.getDefaultInstance(prop,new Authenticator() {//此访求返回用户和密码的对象@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//邮箱账号,密码PasswordAuthentication pa = new PasswordAuthentication(FROM_MAIL, MAIL_PASSWPRD);return pa;}});//设置session的调试模式,发布时取消s.setDebug(true);MimeMessage mimeMessage = new MimeMessage(s);try {//发件人邮箱,显示的发件人(可以是任何内容)mimeMessage.setFrom(new InternetAddress(FROM_MAIL,"罗阳-发件人别名"));//收件人mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toMail));//设置主题mimeMessage.setSubject(subject);mimeMessage.setSentDate(new Date());//设置内容mimeMessage.setText(messages);mimeMessage.saveChanges();//发送Transport.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e){e.getCause();}}public static void main(String[] args) {sendEmail("", "邮件标题啊---", "邮件内容 啊啊啊 ");}}