...

package com.e6soft;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
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.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.search.BodyTerm;
import javax.mail.search.SearchTerm;
import javax.mail.Address;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import org.quartz.impl.jdbcjobstore.DBSemaphore; import com.e6soft.base.service.JService;
import com.sun.mail.imap.IMAPMessage;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore; public class MainTest extends JService{ static String HOST = "smtp.163.com"; // smtp服务器
static String FROM = "****@163.com"; // 发件人地址 //static String TO = "******@qq.com"; // 收件人地址
//static String AFFIX = "E:\\安装手册-6.3.5.doc"; // 附件地址
//static String AFFIXNAME = "安装手册-6.3.5.doc"; // 附件名称 static String USER = "******"; // 用户名
static String PWD = "**********"; // 163的授权码 //static String SUBJECT = "您愿望单中的 2 件物品正在促销!"; // 邮件标题
//static String[] TOS = TO.split(","); public static void main(String[] args) {
MainTest mainTest=new MainTest();
//mainTest.send("123456@qq.com","Your registration is complete!","注册验证您好 123456@qq.com!欢迎注册码云,请将验证码填写到注册页面。验证码:******","");
     //(以上是) 发送的邮箱,标题,内容,
//mainTest.send("请尽快配合申请工作");
mainTest.getEmailList();
} /* 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
本质上就是:
编写MUA把邮件发到MTA;
编写MUA从MDA上收邮件。
发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。
收邮件时,MUA和MDA使用的协议有两种:POP:Post Office Protocol 在MyEclipse中,会自动给web项目导入javax.mail包中的类,但是不全(其实是只有接口,而没有接口的实现类),所以只靠MyEclipse中的类是不能运行java mail项目的,但是如果这时你再去自行导入mail.jar时,就会出现冲突。 java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。
Session:表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。在邮件服务中的Session对象,就相当于连接数据库时的Connection对象。
MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。
Transport:用来发送邮件。它是发送器!
*/
/* 以下是参考 // 接收
public static void s() throws IOException{
System.out.print("请输入用户名:");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String userName = in.readLine();
System.out.print("请输入密码:");
String password = in.readLine();
BASE64Encoder encoder = new BASE64Encoder();
System.out.println("编码后的用户名为:" + encoder.encode(userName.getBytes()));
System.out.println("编码后的密码为:" + encoder.encode(password.getBytes())); BASE64Decoder decoder = new BASE64Decoder();
//邮件主题的Base64编码
String emailSubject = "=?GBK?B?08q8/rLiytQ=?=";
//邮件文本内容的Base64编码
String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E=";
//带html标签和邮件内容的Base64编码
String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+";
//将使用Base64编码过后的文本内容再使用Base64来解码
emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK");
emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK");
emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK");
System.out.println("邮件标题:"+emailSubject);
System.out.println("邮件内容:"+emailPlainContent);
System.out.println("带html标签的邮件内容:"+emailHtmlContent);
}
// 接收
public static void ss() throws Exception{
//收件人地址
String recipientAddress = "xxx@163.com";
//收件人账户名
String recipientAccount = "xxx";
//收件人账户密码
String recipientPassword = "xxx"; //1、连接邮件服务器的参数配置
Properties props = new Properties();
//设置传输协议
props.setProperty("mail.store.protocol", "pop3");
//设置收件人的POP3服务器
props.setProperty("mail.pop3.host", "pop3.163.com");
//2、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getInstance(props);
//设置调试信息在控制台打印出来
//session.setDebug(true); Store store = session.getStore("pop3");
//连接收件人POP3服务器
store.connect("pop3.163.com", recipientAccount, recipientPassword);
//获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
Folder folder = store.getFolder("inbox");
//设置对邮件账户的访问权限
folder.open(Folder.READ_WRITE); //得到邮件账户的所有邮件信息
Message [] messages = folder.getMessages();
for(int i = 0 ; i < messages.length ; i++){
//获得邮件主题
String subject = messages[i].getSubject();
//获得邮件发件人
Address[] from = messages[i].getFrom();
//获取邮件内容(包含邮件内容的html代码)
String content = (String) messages[i].getContent();
} //关闭邮件夹对象 folder.close(false); //关闭连接对象
store.close();
}
*/ /**
* 发送邮件
* sjrdz 收件人地址
* bt 标题
* context 内容
* @param host
* @param user
* @param pwd
*/
public static void send(String sjrdz,String bt,String context,String fjId) {
MainTest MainTest=new MainTest();
String []TOS=sjrdz.split(",");
Properties props = new Properties(); // Session 对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息 和整个应用程序都要使用到的 共享信息
props.put("mail.smtp.host", HOST);//设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
props.put("mail.smtp.auth", "true"); //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
Session session = Session.getDefaultInstance(props);//用props对象构建一个session
session.setDebug(true);
MimeMessage message = new MimeMessage(session);//用session为参数定义消息对象
try {
message.setFrom(new InternetAddress(FROM));// 加载发件人地址
InternetAddress[] sendTo = new InternetAddress[TOS.length]; // 加载收件人地址
for (int i = 0; i < TOS.length; i++) {
sendTo[i] = new InternetAddress(TOS[i]);
}
message.addRecipients(Message.RecipientType.TO,sendTo);
message.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(FROM));//设置在发送给收信人之前给自己(发送方)抄送一份,不然会被当成垃圾邮件,报554错
message.setSubject(bt);//加载标题
Multipart multipart = new MimeMultipart();//向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
BodyPart contentPart = new MimeBodyPart();//设置邮件的文本内容
contentPart.setText(context);
multipart.addBodyPart(contentPart); if(!fjId.isEmpty()){//添加附件
String sqlString="select t.file_extend,t.file_info_id,t.file_filename,t.file_url from T_P_FILE_INFO t where t.file_index='"+fjId+"' ";
List<Map<String, Object>> list=MainTest.dBSelect(sqlString);
for(int i=0;i<list.size();i++){
BodyPart messageBodyPart = new MimeBodyPart();
String AFFIX=System.getProperty("catalina.home")+"/webapps/webdav/"+list.get(i).get("file_info_id")+"."+list.get(i).get("file_extend");
String AFFIXNAME=list.get(i).get("file_filename").toString();
DataSource source = new FileDataSource(AFFIX);
messageBodyPart.setDataHandler(new DataHandler(source));//添加附件的内容
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();//添加附件的标题
messageBodyPart.setFileName("=?GBK?B?"+ enc.encode(AFFIXNAME.getBytes()) + "?=");
multipart.addBodyPart(messageBodyPart);
} }
message.setContent(multipart);//将multipart对象放到message中
message.saveChanges(); //保存邮件
Transport transport = session.getTransport("smtp");//发送邮件
transport.connect(HOST, USER, PWD);//连接服务器的邮箱
transport.sendMessage(message, message.getAllRecipients());//把邮件发送出去
transport.close();//关闭连接
} catch (Exception e) {
e.printStackTrace();
}
} //获取邮件列表
public void getEmailList(){
Properties props = new Properties(); //1、连接邮件服务器的参数配置 props.put("mail.store.protocol", "imap"); //设置传输协议
props.put("mail.imap.host", "imap.163.com"); //设置收件人的POP3服务器
//props.put("mail.imap.port", "143");
props.put("mail.imap.auth.plain.disable","true");
Session session = Session.getDefaultInstance(props); //2、创建定义整个应用程序所需的环境信息的 Session 对象
Store store;
try {
store = session.getStore("imap"); //连接收件人POP3服务器
store.connect("imap.163.com",USER, PWD);
Folder folder = store.getFolder("INBOX"); //获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
folder.open(Folder.READ_WRITE); //设置对邮件账户的访问权限
//SearchTerm search= new BodyTerm("test");
//Message[] messages = folder.search(search); //得到邮件账户的所有邮件信息
Message[] messages = folder.getMessages();
for (int i = 0 ; i < messages.length; i++){
Message msg = messages[i]; InternetAddress address = (InternetAddress) msg.getFrom()[0];
System.out.println(" [ #" + i + " ] ");
System.out.println( "Subject : " + msg.getSubject()); // 回复的标题
//Subject : 回复:Your registration is complete!
System.out.println("From : " + address.getPersonal() + "<" + address.getAddress() + ">"); // 回复人的名称和邮箱
//From : " Follow your heart "<935220462@qq.com>
System.out.println("ContentType : " + msg.getContentType()); //内容类型
//ContentType : multipart/alternative;
// boundary="----=_NextPart_5CA330D9_0A968A68_5C0E2915"
//Message表示一个邮件,msg.getContent()返回一个Multipart对象。一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。
System.out.println("Content Detail : " + msg.getContent().toString()); // 内容细节
//Content Detail : javax.mail.internet.MimeMultipart@12bc6874
System.out.println("时间 : " + msg.getSentDate()); // 日期和时间 if(msg.isMimeType("multipart/*")){
Multipart mp = (Multipart)msg.getContent();
int bodynum = mp.getCount();
for(int j=0; j<bodynum; j++){
if(mp.getBodyPart(j).isMimeType("text/html")){
String content = (String)mp.getBodyPart(j).getContent();
System.out.print("邮件内容:"+content);
}
}
}else{
System.out.println("不支持的邮件类型!");
}
}
folder.close(false);
store.close();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 解析综合数据
* @param part
* @throws Exception
*/
private static void getAllMultipart(Part part) throws Exception{
String contentType = part.getContentType();
int index = contentType.indexOf("name");
boolean conName = false;
if(index!=-1){
conName=true;
}
//判断part类型
if(part.isMimeType("text/plain") && ! conName) {
System.out.println((String) part.getContent());
}else if (part.isMimeType("text/html") && ! conName) {
System.out.println((String) part.getContent());
}else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
//递归获取数据
getAllMultipart(multipart.getBodyPart(i));
//附件可能是截图或上传的(图片或其他数据)
if (multipart.getBodyPart(i).getDisposition() != null) {
//附件为截图
if (multipart.getBodyPart(i).isMimeType("image/*")) {
InputStream is = multipart.getBodyPart(i)
.getInputStream();
String name = multipart.getBodyPart(i).getFileName();
String fileName;
//截图图片
if(name.startsWith("=?")){
fileName = name.substring(name.lastIndexOf(".") - 1,name.lastIndexOf("?="));
}else{
//上传图片
fileName = name;
} FileOutputStream fos = new FileOutputStream("D:\\"
+ fileName);
int len = 0;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
fos.write(bys,0,len);
}
fos.close();
} else {
//其他附件
InputStream is = multipart.getBodyPart(i)
.getInputStream();
String name = multipart.getBodyPart(i).getFileName();
FileOutputStream fos = new FileOutputStream("D:\\"
+ name);
int len = 0;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
fos.write(bys,0,len);
}
fos.close();
}
}
}
}else if (part.isMimeType("message/rfc822")) {
getAllMultipart((Part) part.getContent());
}
} /**
* 解析附件内容
* @param part
* @throws Exception
*/
private static void getAttachmentMultipart(Part part) throws Exception{
if(part.isMimeType("multipart/*")){
Multipart multipart = (Multipart) part.getContent();
int count = multipart.getCount();
for (int i = 0; i < count; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if(bodyPart.getDisposition()!=null){
InputStream is = bodyPart.getInputStream();
FileOutputStream fos=new FileOutputStream("路径+文件名");
int len=0;
byte[] bys=new byte[1024];
while((len=is.read(bys))!=-1){
fos.write(bys, 0, len);
}
fos.close();
}
}
} }
/**
* 解析图片内容
* @param part
* @throws Exception
*/
private static void getPicMultipart(Part part) throws Exception{
if(part.isMimeType("multipart/*")){
Multipart multipart = (Multipart) part.getContent();
int count = multipart.getCount();
for (int i = 0; i < count; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if(bodyPart.isMimeType("image/*")){
InputStream is = bodyPart.getInputStream();
FileOutputStream fos=new FileOutputStream("路径+文件名");
int len=0;
byte[] bys=new byte[1024];
while((len=is.read(bys))!=-1){
fos.write(bys, 0, len);
}
fos.close();
}
}
}
}
/**
* 解析文本内容
* @param part
* @throws Exception
*/
private static void getTextMultipart(Part part) throws Exception{
if(part.isMimeType("text/html")){
String content = (String) part.getContent();
System.out.println(content);
}else if(part.isMimeType("text/plain")){
String content = (String) part.getContent();
System.out.println(content);
} } }

java 邮件 接收与发送的更多相关文章

  1. Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  2. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  3. java邮件发送 qq与163邮箱互发和qq和163邮箱发送其他邮箱实例

    研究了近一天的时间,通过查阅相关资料,终于对java发送邮件的机制,原理有了一点点的理解,希望能够帮到大家! 1.首先要向你的项目里导入1个jar包:mail-1.4.4.jar即可(实现qq和163 ...

  4. java 邮件发送工具类【来源网络自己已经实际应用】

    最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...

  5. JAVA邮件发送的简单实现

    JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件.这一机制被广泛的用在注 ...

  6. java邮件发送(以163邮箱为例)

    1.首先应该开通163邮箱的smtp和pop3,得到授权码 2.其次建立一个web项目,否则需要倒jar包mail.jar 3.创建一个类 4.注意:邮件内容必须为正式话语,否则系统会认为是垃圾邮件而 ...

  7. java-基于JavaMail的Java邮件发送

    1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送

  8. web基础---->java邮件的发送

    这里记录一下关于java邮件发送代码的编写.你在我身边也好,在天边也罢,想到世界的角落有一个你,觉得整个世界也变得温柔安定了. java邮件的发送 一.直接贴出代码,如下: package com.c ...

  9. 【转】基于JavaMail的Java邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

随机推荐

  1. 如何借助 JuiceFS 为 AI 模型训练提速 7 倍

    背景 海量且优质的数据集是一个好的 AI 模型的基石之一,如何存储.管理这些数据集,以及在模型训练时提升 I/O 效率一直都是 AI 平台工程师和算法科学家特别关注的事情.不论是单机训练还是分布式训练 ...

  2. 关于 Spring Boot 中创建对象的疑虑 → @Bean 与 @Component 同时作用同一个类,会怎么样?

    开心一刻 今天放学回家,气愤愤地找到我妈 我:妈,我们班同学都说我五官长得特别平 妈:你小时候爱趴着睡觉 我:你怎么不把我翻过来呢 妈:那你不是凌晨2点时候出生的吗 我:嗯,凌晨2点出生就爱趴着睡觉呗 ...

  3. redis编译安装、哨兵、集群

    编译安装 #下载源代码解压 wget https://download.redis.io/releases/redis-5.0.13.tar.gz -P /home/ tar -xvf /home/r ...

  4. spring boot log4j2 最佳实践

    为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...

  5. iNeuOS工业互联网操作系统,设备振动状态监测、预警和分析应用案例

    目       录 1.      概述... 2 2.      系统部署结构... 2 3.      系统应用介绍... 4 4.      专业分析人员... 8 5.      应用案例分享 ...

  6. WinForm RichTextBox 常用操作

    1.设置不自动选择字词 RichTextBox在选择文字的时候,如果没有关闭自动选择字词功能,我们有时候选择的时候会自动将光标前后的字或者词连接在一起进行选择. RichTextBox有属性AutoW ...

  7. relativeLayout相对布局的嵌套在py中的引用

    from kivy.app import App from kivy.uix.button import Button from kivy.uix.relativelayout import Rela ...

  8. AIApe问答机器人Scrum Meeting 5.1

    Scrum Meeting 5 日期:2021年5月1日 会议主要内容概述:汇报两日工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明昕 后端 Task ...

  9. BUAA-OO-最后单元总结

    BUAA-OO-最后单元总结 经过一学期的魔鬼"折磨"后,OO课程终于要结束了!总体来说我对于作业的总体完成情况还是比较满意的,希望最后可以取得一个理想成绩. 一.第四单元架构设计 ...

  10. Spring IOC(控制反转)和DI(依赖注入)原理

    一.Spring IoC容器和bean简介 Spring Framework实现了控制反转(IoC)原理,IoC也称为依赖注入(DI). 这是一个过程,通过这个过程,对象定义它们的依赖关系,即它们使用 ...