admin管理员组

文章数量:1559389

腾讯企业邮箱-收邮件

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.apachemons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.hzsmkmon.util.FileResult;
import com.hzsmkmon.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");//QQ邮箱为: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.exmail.qq", mailUser, mailPassword);
           //store.connect("imap.qq", "xxx@xx", "授权码");//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");
        prop.setProperty("mail.smtp.socketFactory.class", "javax.ssl.SSLSocketFactory");// 就可了
        // prop.setProperty("mail.smtp.socketFactory.class", "javax.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", "邮件标题啊---", "邮件内容 啊啊啊 ");
	}
}


本文标签: 腾讯企业邮箱收发邮件Java