700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java邮件收发 以及获取收件箱和发件箱 自测可用 使用JavaMail

Java邮件收发 以及获取收件箱和发件箱 自测可用 使用JavaMail

时间:2022-04-23 16:21:24

相关推荐

Java邮件收发 以及获取收件箱和发件箱 自测可用 使用JavaMail

Java邮件收发,以及获取收件箱和发件箱 自测可用

Java发送邮件 使用javaMail 1.5.6发送邮件 协议smtp

smtp地址 smtp.域名 端口SSL 465/994 非SSL25

实体类

*** 邮件消息体* @author lyp* @date 3月11日 上午10:53:13 * @see [相关类/方法]*/public class MessageBody {public enum MessageType{MAIL, SMS}/** 邮件主题 */private String subject;/** 邮件发件人 */private String fromUser;// 短信则为手机号码,邮件则为邮箱private List<String> receiveUsers;/** 邮件抄送人 */private List<String> copyToUsers;/** 邮件密送人 */private List<String> bccUsers;// 邮件短信内容private String content;// 定时发送用private DateTime dateTime;// 消息类型, 默认为邮箱private MessageType messageType = MessageType.MAIL;// 公司名称private String companyName;// 附件private Map<String, File> attachments;private Map<String, MultipartFile> multipartFileMap;public List<Integer> getSendIds() {return sendIds;}public void setSendIds(List<Integer> sendIds) {this.sendIds = sendIds;}private List<Integer> sendIds;public Map<String, MultipartFile> getMultipartFileMap() {return multipartFileMap;}public void setMultipartFileMap(Map<String, MultipartFile> multipartFileMap) {this.multipartFileMap = multipartFileMap;}public List<String> getReceiveUsers() {return receiveUsers;}public void setReceiveUsers(List<String> receiveUsers) {this.receiveUsers = receiveUsers;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public DateTime getDateTime() {return dateTime;}public void setDateTime(DateTime dateTime) {this.dateTime = dateTime;}public MessageType getMessageType() {return messageType;}public void setMessageType(MessageType messageType) {this.messageType = messageType;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {panyName = companyName;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getFromUser() {return fromUser;}public void setFromUser(String fromUser) {this.fromUser = fromUser;}public List<String> getCopyToUsers() {return copyToUsers;}public void setCopyToUsers(List<String> copyToUsers) {this.copyToUsers = copyToUsers;}public List<String> getBccUsers() {return bccUsers;}public void setBccUsers(List<String> bccUsers) {this.bccUsers = bccUsers;}public Map<String, File> getAttachments() {return attachments;}public void setAttachments(Map<String, File> attachments) {this.attachments = attachments;}}

JavaMailSenderImpl sender = new JavaMailSenderImpl();sender.setHost(emailPO.getSmtp()); //设置smtp地址sender.setPassword(emailPO.getPassword()); //邮箱授权密码sender.setPort(emailPO.getSmtpPort());//smtp端口 465/994sender.setUsername(emailPO.getEmail()); //邮箱Properties properties = new Properties(); properties.put("mail.smtp.auth", true); //开启授权认证MailSSLSocketFactory sf = null; //开启ssl加密方式链接try {sf = new MailSSLSocketFactory();} catch (GeneralSecurityException e) {LOGGER.error("failed to init MailSSLSocketFactory,err:{}", e);throw new IllegalArgumentException(e);}sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable", "true");properties.put("mail.smtp.ssl.socketFactory", sf);sender.setJavaMailProperties(properties);LOGGER.info("mail message:{}", message);mailSenderService.run(sender,message);

public class MailSender {/** 邮件发送器 */private JavaMailSender mailSender;/** 邮件消息 */private MessageBody mailMessage;/** 日志记录器 */private static final Logger LOGGER = LoggerFactory.getLogger(MailSender.class);public MailSender(JavaMailSenderImpl mailSender, MessageBody mailMessage){this.mailSender = mailSender;this.mailMessage = mailMessage;}@Overridepublic void run(JavaMailSenderImpl mailSender, MessageBody mailMessage) {if (null != mailMessage) {LOGGER.info("mailSender:{}", mailSender);MimeMessage mimeMsg = mailSender.createMimeMessage();try {// 设置true,表示支持附件MimeMessageHelper msgHelper = new MimeMessageHelper(mimeMsg, true, "UTF-8");msgHelper.setValidateAddresses(true);msgHelper.setFrom(mailMessage.getFromUser(), mailMessage.getCompanyName());msgHelper.setSubject(mailMessage.getSubject());String[] receiveUsers = new String[mailMessage.getReceiveUsers().size()];//设置收件人msgHelper.setTo(mailMessage.getReceiveUsers().toArray(receiveUsers));//设置内容 ,第二个参数支持html格式msgHelper.setText(mailMessage.getContent(), true);// 设置邮件抄送人if (CollectionUtils.isNotEmpty(mailMessage.getCopyToUsers())) {String[] copyToUsers = new String[mailMessage.getCopyToUsers().size()];msgHelper.setCc(mailMessage.getCopyToUsers().toArray(copyToUsers));}// 设置邮件密送人if (CollectionUtils.isNotEmpty(mailMessage.getBccUsers())) {String[] bccUsers = new String[mailMessage.getBccUsers().size()];msgHelper.setBcc(mailMessage.getBccUsers().toArray(bccUsers));}// 添加附件if (null != mailMessage.getAttachments() && mailMessage.getAttachments().size() > 0) {Set<Entry<String, File>> it = mailMessage.getAttachments().entrySet();for (Entry<String, File> attachment : it) {msgHelper.addAttachment(attachment.getKey(), attachment.getValue());}}LOGGER.info("sending mail message begin:{}", msgHelper);mailSender.send(mimeMsg);LOGGER.info("send mail message end.");} catch (Exception e) {LOGGER.error("Send mail failed. Error message : {}", e.getMessage());}}}}

Java Mail 获取收件箱 使用pop3协议

Java Mail 获取发件箱 使用imap协议

POP3协议 地址pop.域名 ssl端口号995 非ssl端口号110

IMAP协议 地址imap.域名 ssl端口号993 非ssl端口号143

这里使用的是非ssl端口号

/*** 有一封邮件就需要建立一个ReciveMail对象*/public class ReciveMail {private MimeMessage mimeMessage = null;private final String dateformat = "yyyy-MM-dd HH:mm:ss"; //默认的日前显示格式private String saveAttachPath; //附件下载后的存放目录private String host; private int port;//收件服务器 pop3端口private String file;private String username; //邮箱账户private String password; //授权的密码private String popHost; //pop3的hostprivate StringBuffer bodytext = new StringBuffer();//存放邮件内容private String content;public ReciveMail() {}public ReciveMail(MimeMessage mimeMessage) {this.mimeMessage = mimeMessage;}/*** 获得发件人的地址和姓名*/public String getFrom() throws Exception {InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();String from = address[0].getAddress();if (from == null)from = "";String personal = address[0].getPersonal();if (personal == null)personal = "";String fromaddr = personal + "<" + from + ">";return fromaddr;}/*** 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址*/public String getMailAddress(String type) throws Exception {String mailaddr = "";String addtype = type.toUpperCase();InternetAddress[] address = null;if (addtype.equals("TO") || addtype.equals("CC") || addtype.equals("BCC")) {if (addtype.equals("TO")) {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.TO);} else if (addtype.equals("CC")) {address = (InternetAddress[]) mimeMessage.getRecipients();} else {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.BCC);}if (address != null) {for (int i = 0; i < address.length; i++) {String email = address[i].getAddress();if (email == null)email = "";else {email = MimeUtility.decodeText(email);}String personal = address[i].getPersonal();if (personal == null)personal = "";else {personal = MimeUtility.decodeText(personal);}String compositeto = personal + "<" + email + ">";mailaddr += "," + compositeto;}mailaddr = mailaddr.substring(1);}} else {throw new Exception("Error emailaddr type!");}return mailaddr;}/*** 获得邮件主题*/public String getSubject() throws MessagingException {String subject = "";try {subject = MimeUtility.decodeText(mimeMessage.getSubject());if (subject == null)subject = "";} catch (Exception exce) {}return subject;}/*** 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"*/public boolean getReplySign() throws MessagingException {boolean replysign = false;String needreply[] = mimeMessage.getHeader("Disposition-Notification-To");if (needreply != null) {replysign = true;}return replysign;}/*** 获得此邮件的Message-ID*/public String getMessageId() throws MessagingException {return mimeMessage.getMessageID();}/*** 【判断此邮件是否已读,如果未读返回返回false,反之返回true】*/public boolean isNew() throws MessagingException {boolean isnew = false;Flags flags = ((Message) mimeMessage).getFlags();Flags.Flag[] flag = flags.getSystemFlags();System.out.println("flags's length: " + flag.length);for (int i = 0; i < flag.length; i++) {if (flag[i] == Flags.Flag.SEEN) {isnew = true;System.out.println("seen Message.......");break;}}return isnew;}/*** 获得邮件发送日期*/public String getSentDate() throws Exception {Date sentdate = mimeMessage.getSentDate();SimpleDateFormat format = new SimpleDateFormat(dateformat);return format.format(sentdate);}public MimeMessage getMimeMessage() {return mimeMessage;}public void setMimeMessage(MimeMessage mimeMessage) {this.mimeMessage = mimeMessage;}public StringBuffer getBodytext() {return bodytext;}public void setBodytext(StringBuffer bodytext) {this.bodytext = bodytext;}public String getPopHost() {return popHost;}public void setPopHost(String popHost) {this.popHost = popHost;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public String getFile() {return file;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public void setFile(String file) {this.file = file;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}/*** 【设置附件存放路径】*/public void setAttachPath(String attachpath) {this.saveAttachPath = attachpath;}/*** 获得邮件正文内容*/public String getBodyText() {return bodytext.toString();}/*** 【获得附件存放路径】*/public String getAttachPath() {return saveAttachPath;}}

public class GetMailService {private StringBuffer bodytext = new StringBuffer();//存放邮件内容public GetMailService() {}private static GetMailService reciveMailUtil;/**** @return*/public static GetMailService getInstance() {if (reciveMailUtil == null) {synchronized (GetMailService.class) {if (reciveMailUtil == null) {reciveMailUtil = new GetMailService();}}}return reciveMailUtil;}/*** 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析*/public void getMailContent(Part part, ReciveMail reciveMail) throws Exception {String contenttype = part.getContentType();int nameindex = contenttype.indexOf("name");boolean conname = false;if (nameindex != -1) {conname = true;}System.out.println("CONTENTTYPE: " + contenttype);if (part.isMimeType("text/plain") && !conname) {bodytext.append((String) part.getContent());reciveMail.setBodytext(bodytext);} else if (part.isMimeType("text/html") && !conname) {bodytext.append((String) part.getContent());reciveMail.setBodytext(bodytext);} else if (part.isMimeType("multipart/*")) {Multipart multipart = (Multipart) part.getContent();int counts = multipart.getCount();for (int i = 0; i < counts; i++) {getMailContent(multipart.getBodyPart(i), reciveMail);}} else if (part.isMimeType("message/rfc822")) {getMailContent((Part) part.getContent(), reciveMail);} else {}}/*** 判断此邮件是否包含附件*/public boolean isContainAttach(Part part) throws Exception {boolean attachflag = false;String contentType = part.getContentType();if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();for (int i = 0; i < mp.getCount(); i++) {BodyPart mpart = mp.getBodyPart(i);String disposition = mpart.getDisposition();if ((disposition != null)&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {attachflag = true;}else if (mpart.isMimeType("multipart/*")) {attachflag = isContainAttach((Part) mpart);} else {String contype = mpart.getContentType();if (contype.toLowerCase().indexOf("application") != -1){attachflag = true;}if (contype.toLowerCase().indexOf("name") != -1){attachflag = true;}}}} else if (part.isMimeType("message/rfc822")) {attachflag = isContainAttach((Part) part.getContent());}return attachflag;}/*** 【保存附件】*/public void saveAttachMent(Part part, ReciveMail reciveMail) throws Exception {String fileName = "";if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();for (int i = 0; i < mp.getCount(); i++) {BodyPart mpart = mp.getBodyPart(i);String disposition = mpart.getDisposition();if ((disposition != null)&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {fileName = mpart.getFileName();if (fileName.toLowerCase().indexOf("gb2312") != -1) {fileName = MimeUtility.decodeText(fileName);}saveFile(fileName, mpart.getInputStream(), reciveMail);} else if (mpart.isMimeType("multipart/*")) {saveAttachMent(mpart, reciveMail);} else {fileName = mpart.getFileName();if ((fileName != null)&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {fileName = MimeUtility.decodeText(fileName);saveFile(fileName, mpart.getInputStream(), reciveMail);}}}} else if (part.isMimeType("message/rfc822")) {saveAttachMent((Part) part.getContent(), reciveMail);}}/*** 【真正的保存附件到指定目录里】*/private void saveFile(String fileName, InputStream in, ReciveMail reciveMail) throws Exception {String osName = System.getProperty("os.name");String storedir = reciveMail.getAttachPath();String separator = "";if (osName == null) {osName = "";}if (osName.toLowerCase().indexOf("win") != -1) {separator = "\\";if (storedir == null || storedir.equals("")) {storedir = "c:\\tmp";}} else {separator = "/";storedir = "/tmp";}File storefile = new File(storedir + separator + fileName);System.out.println("storefile's path: " + storefile.toString());for (int i = 0; storefile.exists(); i++) {storefile = new File(storedir + separator + fileName + i);}BufferedOutputStream bos = null;BufferedInputStream bis = null;try {bos = new BufferedOutputStream(new FileOutputStream(storefile));bis = new BufferedInputStream(in);int c;while ((c = bis.read()) != -1) {bos.write(c);bos.flush();}} catch (Exception exception) {exception.printStackTrace();throw new Exception("文件保存失败!");} finally {bos.close();bis.close();}}/*** @description: 测试方法* @param pmm* @param fileSavePath* @author: lyp,* @date: /11/13 10:11* @return:*/public static void reciveMail(ReciveMail pmm,String fileSavePath) throws Exception {HashMap IAM = new HashMap();//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。IAM.put("name","myname");IAM.put("version","1.0.0");IAM.put("vendor","myclient");IAM.put("support-email","testmail@");Properties props = System.getProperties();/*props.put("mail.smtp.host", pmm.getHost());//收件不需要这个*/props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);URLName urln = new URLName("imap", pmm.getPopHost(), pmm.getPort(), pmm.getFile(), pmm.getUsername(), pmm.getPassword());IMAPStore store = (IMAPStore) session.getStore(urln);store.connect();store.id(IAM);Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();System.out.println("Messages's length: " + message.length);for (int i = 0; i < message.length; i++) {System.out.println("==========第" + (i + 1) + "份邮件============");pmm = new ReciveMail((MimeMessage) message[i]);System.out.println(" 主题: " + pmm.getSubject());System.out.println(" 发送日期: " + pmm.getSentDate());System.out.println(" 是否需要回执: " + pmm.getReplySign());System.out.println(" 是否已读: " + pmm.isNew());System.out.println(" 是否包含文件: " + getInstance().isContainAttach((Part) message[i]));System.out.println(" 谁发送的: " + pmm.getFrom());System.out.println(" 发送给谁的: " + pmm.getMailAddress("to"));System.out.println(" 抄送: " + pmm.getMailAddress("cc"));System.out.println(" 密件抄送: " + pmm.getMailAddress("bcc"));System.out.println("ID: " + pmm.getMessageId());// 获得邮件内容===============getInstance().getMailContent((Part) message[i], pmm);String content = pmm.getBodyText().substring(pmm.getBodyText().indexOf("<"), pmm.getBodyText().lastIndexOf(">") + 1);System.out.println(" 内容: \r\n" + content);pmm.setAttachPath(fileSavePath);getInstance().saveAttachMent((Part) message[i], pmm);}}/*** @description: 获取收件箱* @param pmm* @author: lyp,* @date: /11/12 17:35* @return: {@link List< ReciveMail>}*/public static List<ReciveMail> getInboxMail(ReciveMail pmm) throws Exception {Properties props = System.getProperties();props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);URLName urln = new URLName("pop3", pmm.getPopHost(), pmm.getPort(), pmm.getFile(), pmm.getUsername(), pmm.getPassword());Store store = session.getStore(urln);store.connect();Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();System.out.println("Messages's length: " + message.length);List<ReciveMail> list = new ArrayList<>();setMailList(message, list);return list;}/*** @description: 获取指定时间段收件箱* @param pmm* @author: lyp,* @date: /11/12 17:35* @return: {@link List< ReciveMail>}*/public static List<ReciveMail> getInboxMail(ReciveMail pmm, Date startTime,Date endTime) throws Exception {Properties props = System.getProperties();/*props.put("mail.smtp.host", pmm.getHost());//收件不需要这个*/props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);URLName urln = new URLName("pop3", pmm.getPopHost(), pmm.getPort(), pmm.getFile(), pmm.getUsername(), pmm.getPassword());Store store = session.getStore(urln);store.connect();Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);// 指定发送时间SearchTerm geTerm = new SentDateTerm(ComparisonTerm.GE, startTime);SearchTerm leTerm = new SentDateTerm(ComparisonTerm.LE, endTime);SearchTerm andTerm = new AndTerm(geTerm, leTerm);Message message[] = folder.search(andTerm);System.out.println("Messages's length: " + message.length);List<ReciveMail> list = new ArrayList<>();setMailList(message, list);return list;}/*** @description: 获取发件箱* @param pmm* @author: lyp,* @date: /11/12 17:35* @return: {@link List< ReciveMail>}*/public static List<ReciveMail> getSentMail(ReciveMail pmm) throws Exception {HashMap IAM = new HashMap();//带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。IAM.put("name","myname");IAM.put("version","1.0.0");IAM.put("vendor","myclient");IAM.put("support-email","testmail@");Properties props = System.getProperties();/*props.put("mail.smtp.host", pmm.getHost());//收件不需要这个*/props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);URLName urln = new URLName("imap", pmm.getPopHost(), pmm.getPort(), pmm.getFile(), pmm.getUsername(), pmm.getPassword());IMAPStore store = (IMAPStore) session.getStore(urln);store.connect();store.id(IAM);// 网易与阿里云发件箱为已发送Folder folder = store.getFolder("已发送");if (folder == null) {// QQ发件箱为Sent Messagesfolder = store.getFolder("Sent Messages");}folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();System.out.println("Messages's length: " + message.length);List<ReciveMail> list = new ArrayList<>();setMailList(message, list);return list;}public static String transferChinese(String strText) {try {strText = MimeUtility.encodeText(new String(strText.getBytes(),"GB2312"), "GB2312", "B");} catch (Exception e) {e.printStackTrace();}return strText;}private static void setMailList(Message[] message, List<ReciveMail> list) throws Exception {ReciveMail pmm;for (int i = 0; i < message.length; i++) {System.out.println("==========第" + (i + 1) + "份邮件============");pmm = new ReciveMail((MimeMessage) message[i]);getInstance().getMailContent((Part) message[i], pmm);String content = pmm.getBodyText().substring(pmm.getBodyText().indexOf("<"), pmm.getBodyText().lastIndexOf(">") + 1);pmm.setContent(content);list.add(pmm);}list.sort(new Comparator<ReciveMail>() {@Overridepublic int compare(ReciveMail o1, ReciveMail o2) {try {return o2.getMimeMessage().getSentDate().compareTo(o1.getMimeMessage().getSentDate());} catch (MessagingException e) {e.printStackTrace();}return 1;}});}/*** PraseMimeMessage类测试*/public static void main(String args[]) throws Exception {ReciveMail pmm = new ReciveMail();int port = “”;String file = null;String popHost = "";String username = "";String password = "";pmm.setPopHost(popHost);pmm.setPort(port);pmm.setFile(file);pmm.setUsername(username);pmm.setPassword(password);reciveMail(pmm,"");//记得设置文件保存路径}}

使用pop3协议获取到的邮箱文件夹Folder中只有收件箱INBOX,所以获取发件箱以及其他的邮箱需使用IMAP协议获取,获取到的文件夹名称可以看我另一个博客中有写到,其中网易使用IMAP协议会提示不安全的登录,这是网易为了用户帐号信息安全,系统要求您的客户端表明相关“身份”信息才可以允许连接,需要验证身份信息加一个ID信息.

网易链接地址:出现不安全登录帮助原因

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。