腾讯企业邮箱-收邮件
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 org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hzsmk.common.util.FileResult;
import com.hzsmk.common.util.OssFileUtil;
import com.hzsmk.ocr.bean.co.MailInfoCo;
/**
* @author:Deng
* @date: 2021-04-14 17:30
* @remark: 腾讯邮件读取
*/
@Component
public class ReadSmkQQMailUtil {
@Autowired
private OssFileUtil ossFileUtil;
@Autowired
private MailReadFileService mailReadFileService;
//收件箱 账户密码
public void readEmail(String mailUser,String mailPassword) {
Properties props = new Properties();
props.put("mail.imap.host", "imap.exmail.qq.com");//QQ邮箱为:imap.qq.com
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.exmail.qq.com", mailUser, mailPassword);
//store.connect("imap.qq.com", "xxx@xx.com", "授权码");//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 = "低";
else
priority = "普通";
}
return priority;
}
/**
* 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
* <p>Message.RecipientType.TO 收件人</p>
* <p>Message.RecipientType.CC 抄送</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.exmail.qq.com");
prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");// 就可了
// prop.setProperty("mail.smtp.socketFactory.class", "javax.net.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() {
//此访求返回用户和密码的对象
@Override
protected 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("lu1121231231231235.com", "邮件标题啊---", "邮件内容 啊啊啊 ");
}
}