最近项目实现了一个使用javaMail来实现邮箱邮件的读取和邮件回复。本人查阅资料并汇总做个记录。

需要提前了解邮件协议

  1. 收取邮箱邮件的协议主要有两个,第一个是pop3,第二个是imap协议。两者协议唯一区别就是pop3不能识别邮箱邮件是否为已读需要自己去判断,而imap就很轻松做到这一点。我在这里选择imap协议
  2. 发送协议选择smtp协议

常见邮箱类型的协议

我们项目不能确定客户到底使用什么类型的邮箱,所以自己单独测试了各类型的邮箱做个汇总,省的再去翻阅资料查询。注意:以下邮箱密码如果是授权码,需要单独查询各类型邮箱获取授权码的方式!如果是密码则直接使用邮箱密码即可!

QQ邮箱

 imap服务器:imap.qq.comsmtp服务器:smtp.qq.comsmtp端口:587用户名:账号名称密码:授权码

企业邮箱

 imap服务器:imap.exmail.qq.comsmtp服务器:smtp.exmail.qq.comsmtp端口:25用户名:账号名称密码:密码

新浪邮箱

imap服务器:imap.sina.com
smtp服务器:smtp.sina.com
smtp端口:25
用户名:账号名称
密码:授权码

outlook邮箱

imap服务器:outlook.office365.com
smtp服务器:smtp-mail.outlook.com
smtp端口:587
用户名:账号名称
密码:密码

163邮箱

imap服务器:imap.163.com
smtp服务器:smtp.163.com
smtp端口:25
用户名:账号名称
密码:授权码

139邮箱

 139邮箱:imap服务器:imap.139.comsmtp服务器:smtp.139.comsmtp端口:25

** 阿里云邮箱 **

阿里云邮箱:
imap服务器:imap.aliyun.com
smtp服务器:smtp.aliyun.com
smtp端口:25
用户名:账号名称
密码:密码

接下来不多BB,直接上代码(代码里的带前后~~ ~~格式的需要自己去填写具体的协议、账号、密码 )

  1. 收取邮件
/**1. 读取邮件
*/
public void readEmail() {Properties props = new Properties();props.put("mail.imap.host", "~~imapHost~~ ");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("~~imapHost~~ ","~~userName~~ ", "~~passWord~~ ");Folder folder = store.getFolder("Inbox");//javamail中使用id命令有校验checkOpened, 所以要去掉id方法中的checkOpened();(这里针对163邮箱无法收发票做的逻辑代码)IMAPFolder imapFolder = (IMAPFolder)folder;imapFolder.doCommand(p -> { p.id("FUTONG");return null;});//邮箱打开方式folder.open(Folder.READ_WRITE);//收取未读邮件Message[] messages = folder.getMessages(folder.getMessageCount() - folder.getUnreadMessageCount() + 1, folder.getMessageCount());//解析邮件if (messages.length != 0) {parseMessage(messages);}//设置邮件为已读folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);folder.close(true);store.close();} catch (MessagingException e) {e.printStackTrace();}}/*** 解析邮件*/public void parseMessage(Message[] messages) {for (Message message : messages) {try {//获取未读邮件if (!message.getFlags().contains(Flags.Flag.SEEN)) {MimeMessage mimeMsg = (MimeMessage) message;//判断邮件是否包含附件boolean containAttachment = this.containAttachment(mimeMsg);// 解析邮件发件人EmailInfo emailInfo = this.processEmailInfo(mimeMsg);log.debug("-----> 发件人信息:{}, 包含附件:{}", emailInfo, containAttachment);if (containAttachment) {// 邮箱附件解析List<BodyPart> mimeFileList = this.getMimeFile(mimeMsg);// 附件操作(遍历可以拿到每个文件的名称和流)saveEmailAttach(mimeFileList);}}} catch (MessagingException e) {e.printStackTrace();}}}/*** 邮件是否包含附件*/public static boolean containAttachment(MimeMessage mimeMsg) {try {if (mimeMsg.isMimeType(MULTIPART_MIME_TYPE)) {Multipart mp = (Multipart) mimeMsg.getContent();for (int i = 0; i < mp.getCount(); i++) {BodyPart bp = mp.getBodyPart(i);// 如果该BodyPart对象包含附件if (bp.getDisposition() != null) {return true;}}}} catch (MessagingException | IOException e) {log.error("-----> {}", LogUtil.stackTraceInfo(e));}return false;}/*** 解析邮件发件信息*/public static EmailInfo processEmailInfo(MimeMessage mimeMsg) {EmailInfo emailInfo = new EmailInfo();try {String from = ((InternetAddress) (mimeMsg.getFrom()[0])).getAddress();String subject = mimeMsg.getSubject();Date sentDate = mimeMsg.getSentDate();emailInfo.setFrom(from).setSubject(subject).setSendDate(sentDate).setSendDateStr(DateUtil.format(sentDate, DatePattern.NORM_DATETIME_PATTERN));} catch (MessagingException e) {log.error("-----> {}", LogUtil.stackTraceInfo(e));}return emailInfo;}/*** 解析邮件附件** @param part 邮件中多个组合体中的其中一个组合体*/public static List<BodyPart> getMimeFile(Part part) {List<BodyPart> files = new ArrayList<>();try {if (part.isMimeType(MULTIPART_MIME_TYPE)) {//复杂体邮件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();if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {files.add(bodyPart);} else if (bodyPart.isMimeType(MULTIPART_MIME_TYPE)) {getFile(bodyPart);} else {String contentType = bodyPart.getContentType();if (contentType.contains("name") || contentType.contains("application")) {files.add(bodyPart);}}}} else if (part.isMimeType(RFC822_MIME_TYPE)) {getMimeFile((BodyPart) part.getContent());}} catch (IOException | MessagingException e) {log.error("-----> {}", LogUtil.stackTraceInfo(e));}return files;}/*** 保存附件*/public void saveEmailAttach(List<BodyPart> bodyPartList) {ArrayList<Attach> attachList = new ArrayList<>();try {for (BodyPart file : bodyPartList) {String fileNameSuffix = file.getFileName();fileNameSuffix = MimeUtility.decodeText(fileNameSuffix);String suffix = fileNameSuffix.substring(fileNameSuffix.lastIndexOf(".") + 1);suffix = MimeUtility.decodeText(suffix);//判断附件类型是否为PDF(看具体情况具体处理)if (!suffix.equalsIgnoreCase("PDF")) {continue;}//获取输入流InputStream inputStream = file.getInputStream();//TODO}} catch (MessagingException | IOException e) {throw new CommonException(e);}}/*** 发件人信息*/public class EmailInfo {/** 发件人 */private String from;/** 主题 */private String subject;/** 发件时间 */private Date sendDate;/** 发件时间字符串 */private String sendDateStr;}2. 回复邮件
/*** @param smtpHost  邮箱服务器地址* @param smtpPort  邮箱服务器端口* @param userName  邮箱用户名* @param password  邮箱密码* @param sendAddr  发送地址(多个收件人以逗号分割)* @param subject   邮件主题* @param message   邮件内容* @param attr_path 附件(文件地址)*/
private void sendMsg(String smtpHost, String smtpPort, String userName, String password, String sendAddr, String subject, String message, String attr_path) {try {Properties props = new Properties();// 开启debug调试props.setProperty(EmailConstant.MAIL_DEBUG, EmailConstant.FALSE);// 发送服务器需要身份验证props.setProperty(EmailConstant.MAIL_SMTP_AUTH, EmailConstant.TRUE);// 设置邮件服务器主机名log.info("----->回复邮件邮箱的服务器配置" + smtpHost);props.setProperty(EmailConstant.MAIL_HOST, smtpHost);// 发送邮件协议名称props.setProperty(EmailConstant.MAIL_TRANSPORT_PROTOCOL, EmailConstant.SMTP);log.info("----->回复邮件的服务器端口配置" + smtpPort);props.setProperty(EmailConstant.MAIL_SMTP_PORT, smtpPort);props.put(EmailConstant.MAIL_SMTP_STARTTLS_ENABLE, EmailConstant.TRUE);props.put(EmailConstant.MAIL_SMTP_SSL_TRUST, smtpHost);props.put(EmailConstant.MAIL_SMTP_CONNECT_TIMEOUT, EmailConstant.MAIL_IMAP_TIMEOUT_VALUE);props.put(EmailConstant.MAIL_SMTP_TIMEOUT, EmailConstant.MAIL_IMAP_TIMEOUT_VALUE);props.put(EmailConstant.MAIL_SMTP_WRITE_TIMEOUT, EmailConstant.MAIL_IMAP_TIMEOUT_VALUE);// 设置环境信息Session session = Session.getInstance(props);// 创建邮件对象MimeMessage msg = new MimeMessage(session);// 设置发件人msg.setFrom(new InternetAddress(userName));// 设置收件人String[] result = sendAddr.split(",");InternetAddress[] sendTo = new InternetAddress[result.length];for (int i = 0; i < result.length; i++) {log.info("----->需发送到邮箱{}:" + result[i]);sendTo[i] = new InternetAddress(result[i]);}msg.addRecipients(Message.RecipientType.TO, sendTo);// 设置邮件主题msg.setSubject(subject);//新建一个存放信件内容的BodyPart对象BodyPart mdp = new MimeBodyPart();//给BodyPart对象设置内容和格式/编码方式mdp.setContent(message, EmailConstant.MESSAGE);//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)Multipart mm = new MimeMultipart();//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)mm.addBodyPart(mdp);if (StrUtil.isNotEmpty(attr_path)) {DataSource attr_ds = new FileDataSource(new File(attr_path));DataHandler attr_handler = new DataHandler(attr_ds);BodyPart attachmentBodyPart = new MimeBodyPart();attachmentBodyPart.setDataHandler(attr_handler);attachmentBodyPart.setFileName(MimeUtility.encodeWord(attr_path.substring(attr_path.lastIndexOf("/") + 1)));mm.addBodyPart(attachmentBodyPart);}//把mm作为消息对象的内容msg.setContent(mm);Transport transport = session.getTransport();// 连接邮件服务器log.info("----->连接收票邮箱" + userName);transport.connect(userName, password);// 发送邮件log.info("----->发送回复邮件");transport.sendMessage(msg, sendTo);// 关闭连接transport.close();} catch (Exception e) {log.error("----->回复邮件异常{}", LogUtil.stackTraceInfo(e));}}
public class EmailConstant {public static String MAIL_IMAP_HOST = "mail.imap.host";public static String MAIL_IMAP_AUTH = "mail.imap.auth";public static String MAIL_STORE_PROTOCOL = "mail.store.protocol";public static String MAIL_IMAP_STARTTLS_ENABLE = "mail.imap.starttls.enable";public static String MAIL_IMAP_CONNECT_TIMEOUT = "mail.imap.connectiontimeout";public static String MAIL_IMAP_TIMEOUT = "mail.imap.timeout";public static String MAIL_IMAP_WRITE_TIMEOUT = "mail.imap.writetimeout";public static String MAIL_SMTP_CONNECT_TIMEOUT = "mail.smtp.connectiontimeout";public static String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout";public static String MAIL_SMTP_WRITE_TIMEOUT = "mail.smtp.writetimeout";public static String MAIL_DEBUG = "mail.debug";public static String MAIL_SMTP_AUTH = "mail.smtp.auth";public static String MAIL_HOST = "mail.host";public static String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol";public static String MAIL_SMTP_PORT = "mail.smtp.port";public static String MAIL_SMTP_STARTTLS_ENABLE = "mail.smtp.starttls.enable";public static String MAIL_SMTP_SSL_TRUST = "mail.smtp.ssl.trust";public static String MESSAGE = "text/html;charset=UTF-8";public static int MAIL_IMAP_TIMEOUT_VALUE = 5000;public static String MAIL_SPECIAL = "@163.com";public static String MAIL_IMAP_SSL_TRUST = "mail.imap.ssl.trust";public static String MAIL_IMAP_SSL_SOCKETFACTORY = "mail.imap.ssl.socketFactory";public static String IMAP = "imap";public static String SMTP = "smtp";public static String TRUE = "true";public static String FALSE = "false";public static String EMAIL_PROCESS = "emailProcess";public static String INVOICE_CODE = "invoiceCode";public static String INVOICE_NUMBER = "invoiceNumber";}

补充(导包贴图)

**全部代码都在这里,我在里面删除了自己好多项目具体自己处理的逻辑,有不对的地方可以指出,我再进行修改。**

使用JavaMail实现收取和回复邮件相关推荐

  1. java foxmail 附件_foxmail 本程序使用JavaMail进行收取和发送带附件的邮件 - 下载 - 搜珍网...

    邮件客户端/foxmail/.classpath 邮件客户端/foxmail/.project 邮件客户端/foxmail/bin/org/crazyit/foxmail/box/AbstractBo ...

  2. wasp_WaSP返回

    wasp The Web Standards Project returns with a new look and a load of new content. Yay! Web标准项目以新的外观和 ...

  3. 商务笔记本进入小时代

    商务笔记本进入小时代<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&g ...

  4. 05. JavaMail 回复邮件

    JavaMail 回复邮件 JavaMail 回复邮件的基本步骤: 获取Session对象与POP和SMTP 服务器的细节属性.我们需要 POP 细节来检索信息和SMPT详细信息发送邮件: 创建POP ...

  5. java发送hotmail邮件_利用javamail收取Hotmail的退信

    利用javamail收取Hotmail的退信 (2007-04-05 23:44:19) Hotmail 是我最常用的Email Client.虽然时下hotmail的容量是小了些,速度也常常慢得让人 ...

  6. javamail使用IMAP协议收取gmail邮件

    年底了,绩效是逃不开的话题,为总结这一年来的工作情况,查看邮件是非常必要的.但是,邮件太多,如何筛选和保留成为一个问题,因此想到实现个自动统计邮件内容的工具,今天分享使用IMAP协议收取gmail邮件 ...

  7. javamail发送/回复邮件报错: Local address contains control or whitespace in string

    这篇博客主要是记录一下,发送邮件时,发件人和收件人在数据库中怎样存储,才是最好的. 先说一下我认为的最佳存储方式:昵称(可省)+空格(可省)+"<"+邮箱号+"&g ...

  8. javamail pop3模式收取邮件

    pop3协议收取邮件inbox.getMessages()是一次性读取所有邮件,如果邮箱邮件过多的话,会非常耗时. 还有一个方法是Folder.getMessages(int start, int e ...

  9. javaMail 收取邮件,邮件获取,并保存附件

    给大家介绍一个代码在线自动生成的网站:https://www.5ceo.cn 技术之家 代码自动生成 package com.frame.mall.core.mail;/***/import java ...

最新文章

  1. 漫画:什么是LRU算法?
  2. 需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组...
  3. 好看的论文千篇一律,有趣的Github项目万里挑一!
  4. wxWidgets:弹出 wxWidgets 示例
  5. 巡逻机器人用应用的pc端车牌识别
  6. 报名参加第103期设计论坛公益免费设计活动
  7. 什么是常驻内存式的开发模式?_“直播+”模式下的直播系统开发需要注意什么问题?...
  8. C# StreamReader类和StreamWriter类
  9. java 添加用户 数据库,跟屌丝学DB2 第二课 建立数据库以及添加用户
  10. 《大数据》2015年第3期“网络大数据专题”——基于特征学习的文本大数据内容理解及其发展趋势...
  11. 谢惠民恽自求易法槐钱定边数学分析习题课讲义思考题练习题参考题解答
  12. 计算机专业本科毕业答辩问题及回答
  13. 5ecsgo启动失败2错误代码2_单机多实例--启动2个Elasticsearch Cluster
  14. tensorflow的类、变量和函数讲解
  15. Retrofit2的再封装实战—多线程下载与断点续传(三)
  16. 联想微型计算机 y720,联想拯救者Y720评测:有颜值的实力派
  17. Waiting for Jenkins to finish collecting data
  18. 渝粤题库 陕西师范大学 《服务礼仪》作业
  19. 三星Cortex-A53八核6818核心板
  20. 变频器制动电阻的选择(如G120变频器报警F7901失速报警)

热门文章

  1. 高质量发展,老板电器的聚焦性扩张
  2. 有盟分享开发存在的一些问题
  3. 北斗一号卫星导航系统与GPS的对比
  4. 数据分析之scipy处理图片
  5. html+css+javascript 开发英语生词本
  6. 声呐学习笔记之波束成形
  7. python_for_hrm:读取花名册员工身份证信息,通过企业微信机器人提醒人事做生日准备
  8. unity3d游戏场景制作
  9. 基于JSP技术和SSM框架的Web聊天系统的设计和开发
  10. 刁蛮公主花千骨(代码实现)