Java Mail

Posted 夏小弥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Mail相关的知识,希望对你有一定的参考价值。

E-Mail协议简介:

邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器。
发送邮件的服务器使用发送协议,现在常用的是SMTP协议。所以,通常发邮件的服务器也称为SMTP服务器。
接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器。
目前经常见到的服务器为SMTP和POP3服务器。如大家在注册了126的邮箱之后,它的发邮件服务器为smtp.126.com:25,而收邮件服务器则为pop3.126.com:110.(冒号后面的为端口号)。
当然,发邮件服务器和收邮件服务器也可能是同一台主机,但端口号一定不相同。默认发邮件服务器的端口为25,收邮件的端口为110.

 

邮件收/发协议:

SMTP协议-发邮件协议
全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。端口一般为25.
POP3协议-收邮件协议
全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。端口一般为110.
IMAP协议-对POP3的扩展
全称为Internet Message Access Protocal(Internet消息访问协议),它是对POP3协议的一种扩展,定义了邮件客户端软件与IMAP服务器的通讯规则。

 

SMTP发邮件协议的命令

 

POP3协议的命令

 

通过命令行发邮件的示例:

 

通过命令行发送邮件的步骤如下:

第一步:与服务器建立连接。
telnet smtp.126.com 25    //这里说的126指的是126邮箱,如果是其他邮箱就填其他的
第二步:先和服务器打个招乎。Ehlo someTxt
第三步:请求登录:auth login.
输入用户名:经过base64编码以后的。
输入密码,也是经过base64编码以后的。
第四步:输入发件人mail from:<wangjian_me@126.com>
第五步:输入收件人rcpt to:<wangjianme@sohu.com> 
第六步:输入data命令然后回车,开始输入数据。
可选的输入from:<…>
可选的输入to:<..>
subject:主题
第七步:输入.(点)单行,表示数据结束。
第八步:输入quit退出。

 

这里提到的用base64编码,代码如下:

 

package cn.hncu;

import sun.misc.BASE64Encoder;

public class EncodeDemo 

	public static void main(String[] args) 
		String name="hncujava";
		String pwd="1234567";
		BASE64Encoder en=new BASE64Encoder();
		name=en.encode(name.getBytes());
		pwd=en.encode(pwd.getBytes());
		System.out.println(name);
		System.out.println(pwd);
	

这里要注意要将项目的jdk更改为workspace默认的jdk才能够导得进这个包
 

 

接收邮件:pop3:

telnet pop3.126.com 110
user wj_leaf12345
pass 1qaz2wsx

stat  - 显示总体信息。
list - 列出所有信件。
retr 1 - 显示第一封信件。
quit  -退出

 

设置邮箱的smtp和pop3协议

这个只要到邮箱去点击设置里面就有,将相关的按钮点开即可

如新浪:

 

QQ邮箱的话需要手机验证的

步骤如下:

这里只需要点开第一个就好了,点击开启后会要你用手机发送短信到指定的号码,你发过去之后点击“已经发送”按键,即可收到一个验证编码,这个是要记录下来的,后面使用java写程序访问时要用这个来当做密码而不是用你真实密码当做那个密码的。

 

开启telnet服务

由于本人电脑是win10的,我就按照win10来讲了,然后我会补充一下win7和win8的:

1、控制面板→程序→启用或关闭Windows功能→选中Telnet客户端(win7或8还有一个Telnet服务器也要选中)

2、(这第二步只针对win7或8的,win10无需此步骤)控制面板→系统与安全→管理工具→服务→找到telnet将其启动即可(双击先设置为手动或自动,点ok后再进来点启动)

经过上述操作就可以发邮件了

 

下面演示java发邮件

这里需要使用到两个jar包:java-mail-1.4.4.jar   activation.jar

一、非QQ收发邮件

 

<span style="white-space:pre">	</span>@Test//发送没有附件的邮件
	public void send1() throws Exception 
		//跟smtp服务器建立一个连接
		Properties p=new Properties();
		p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25
		p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
//		p.setProperty("mail.transport.protocol", "smtp");
		
		Session session=Session.getDefaultInstance(p, new Authenticator() 
			@Override
			protected PasswordAuthentication getPasswordAuthentication() 
				PasswordAuthentication pass=new PasswordAuthentication("邮箱号前缀", "密码");
				return pass;
			
		);
		session.setDebug(true);//设置打开调试状态
		
		//声明一个Message对象(代表一封邮件),从session中创建
		MimeMessage msg=new MimeMessage(session);
		//邮件信息封装
		//1发件人
		msg.setFrom(new InternetAddress("邮箱号"));
		//2收件人
		msg.setRecipient(RecipientType.TO, new InternetAddress("邮箱号"));
		//上面这个收件人后面的InternetAddress可以给一个InternetAddress类型的数组,里面存放很多人的邮箱地址,可以实现群发
		//3邮件内容:主题、内容
		msg.setSubject("This is my message---1");
		//msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本
		msg.setContent("Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?</a>", "text/plain;charset=utf-8");

		//发送动作
		Transport.send(msg);
	

 

	@Test//发送含附件的邮件
	public void send2() throws Exception 
		//跟smtp服务器建立一个连接
		Properties p=new Properties();
		p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25
		p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
		Session session=Session.getDefaultInstance(p, new Authenticator() 
			@Override
			protected PasswordAuthentication getPasswordAuthentication() 
				PasswordAuthentication pass=new PasswordAuthentication("邮箱号前缀", "密码");
				return pass;
			
		);
		session.setDebug(true);//设置打开调试状态

		//声明一个Message对象(代表一封邮件),从session中创建
		MimeMessage msg=new MimeMessage(session);
		//邮件信息封装
		//1发件人
		msg.setFrom(new InternetAddress("邮箱号"));
		//2收件人
		msg.setRecipient(RecipientType.TO, new InternetAddress("邮箱号"));
		//3邮件内容:主题、内容
		msg.setSubject("This is my message---2hgx");
		
		///跟上一版本相比,以下部分内容是新添加的///
		//邮件内容部分1---文本内容
		MimeBodyPart body1=new MimeBodyPart();//邮件中的文字部分
		body1.setContent("这是两张<font color='red'>图片</font>....","text/html;charset=utf-8");
		
		//邮件内容部分2---附件1
		MimeBodyPart body2=new MimeBodyPart();
		body2.setDataHandler(new DataHandler(new FileDataSource("./img/1.jpg")));
		//body2.setFileName("1.jpg");
		//body2.setFileName("图片1.jpg");//中文附件名,乱码
		body2.setFileName(MimeUtility.encodeText("图片1.jpg"));//中文附件名,解决乱码
		
		//邮件内容部分3---附件2
		MimeBodyPart body3=new MimeBodyPart();
		body3.setDataHandler(new DataHandler(new FileDataSource("./img/2.jpg")));
		body3.setFileName("2.jpg");
		
		//把上面的3部分组装在一起,设置到msg中
		MimeMultipart mm=new MimeMultipart();
		mm.addBodyPart(body1);
		mm.addBodyPart(body2);
		mm.addBodyPart(body3);
		msg.setContent(mm);
		
		//
		
		//发送动作
		Transport.send(msg);
	


二、QQ收发邮件

 

与上面代码不同的是要加入SSL加密,若只是收邮件还是可以不设置的

1、收邮件

 

	@Test//发送没有附件的邮件
	public void send3() throws Exception //QQ收邮件
		//跟smtp服务器建立一个连接
		Properties p=new Properties();
		p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25
		p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
//		p.setProperty("mail.transport.protocol", "smtp");
		
		Session session=Session.getDefaultInstance(p, new Authenticator() 
			@Override
			protected PasswordAuthentication getPasswordAuthentication() 
				PasswordAuthentication pass=new PasswordAuthentication("发件邮箱号前缀", "密码");
				return pass;
			
		);
		session.setDebug(true);//设置打开调试状态
		
		//声明一个Message对象(代表一封邮件),从session中创建
		MimeMessage msg=new MimeMessage(session);
		//邮件信息封装
		//1发件人
		msg.setFrom(new InternetAddress("发件邮箱号"));
		//2收件人
		msg.setRecipient(RecipientType.TO, new InternetAddress("收件qq邮箱号"));
		//上面这个收件人后面的InternetAddress可以给一个InternetAddress类型的数组,里面存放很多人的邮箱地址,可以实现群发
		//3邮件内容:主题、内容
		msg.setSubject("This is my message---1");
		//msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本
		msg.setContent("Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?</a>", "text/plain;charset=utf-8");

		//发送动作
		Transport.send(msg);
	

2、发邮件

 

 

	@Test//发送没有附件的邮件
	public void send4() throws Exception //QQ发邮件
		//跟smtp服务器建立一个连接
		Properties p=new Properties();
		p.setProperty("mail.host", "smtp.qq.com");//指定邮件服务器,默认端口 25
		p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证
		p.setProperty("mail.transport.protocol", "smtp");
		
		//开启ssl加密,否则会失败
		MailSSLSocketFactory msf=new MailSSLSocketFactory();
		msf.setTrustAllHosts(true);
		p.put("mail.smtp.ssl.enable", "true");
		p.put("mail.smtp.ssl.socketFactory", msf);
		
		Session session=Session.getDefaultInstance(p, new Authenticator() 
			@Override
			protected PasswordAuthentication getPasswordAuthentication() 
				PasswordAuthentication pass=new PasswordAuthentication("发件qq号<span style="font-family: Arial, Helvetica, sans-serif;">", "qq邮箱设置smtp时收到的验证码");</span>
				return pass;
			
		);
		session.setDebug(true);//设置打开调试状态
		
		//声明一个Message对象(代表一封邮件),从session中创建
		MimeMessage msg=new MimeMessage(session);
		//邮件信息封装
		//1发件人
		msg.setFrom(new InternetAddress("发件qq邮箱号"));
		//2收件人
		msg.setRecipient(RecipientType.TO, new InternetAddress("收件邮箱号"));
		//上面这个收件人后面的InternetAddress可以给一个InternetAddress类型的数组,里面存放很多人的邮箱地址,可以实现群发
		//3邮件内容:主题、内容
		msg.setSubject("This is my message---1");
		//msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本
		msg.setContent("Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?</a>", "text/plain;charset=utf-8");

		//发送动作
		Transport.send(msg);
	

QQ发邮件2-2  (另一种QQ发邮件的方式)

package cn.hncu;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.sun.mail.util.MailSSLSocketFactory;

/**
 * JavaMail发送邮件:前提是QQ邮箱里帐号设置要开启POP3/SMTP协议
 */
public class SendQQMail 

	public static void main(String[] args) throws Exception 

		Properties prop = new Properties();
		// 开启debug调试,以便在控制台查看
		prop.setProperty("mail.debug", "true");
		// 设置邮件服务器主机名
		prop.setProperty("mail.host", "smtp.qq.com");
		// 发送服务器需要身份验证
		prop.setProperty("mail.smtp.auth", "true");
		// 发送邮件协议名称
		prop.setProperty("mail.transport.protocol", "smtp");

		// 开启SSL加密,否则会失败
		MailSSLSocketFactory sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		prop.put("mail.smtp.ssl.enable", "true");
		prop.put("mail.smtp.ssl.socketFactory", sf);

		// 创建session
		Session session = Session.getInstance(prop);
		// 通过session得到transport对象
		Transport ts = session.getTransport();
		// 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
		ts.connect("smtp.qq.com", "qq号", "邮箱设置smtp时收到的验证码");
		// 后面的字符是授权码,用qq密码失败了
		
		// 创建邮件
		Message message = createSimpleMail(session);
		// 发送邮件
		ts.sendMessage(message, message.getAllRecipients());
		ts.close();
	

	/**
	 * @Method: createSimpleMail
	 * @Description: 创建一封只包含文本的邮件
	 */
	public static MimeMessage createSimpleMail(Session session)
			throws Exception 
		// 创建邮件对象
		MimeMessage message = new MimeMessage(session);
		// 指明邮件的发件人
		message.setFrom(new InternetAddress("发件qq邮箱号"));
		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
		message.setRecipient(Message.RecipientType.TO, new InternetAddress(
				"收件邮箱号"));
		// 邮件的标题
		message.setSubject("JavaMailQQ邮件测试");
		// 邮件的文本内容
		message.setContent("JavaMail发送邮件成功!", "text/html;charset=UTF-8");
		// 返回创建好的邮件对象
		return message;
	

 

 

 

 

 

 

 

 

以上是关于Java Mail的主要内容,如果未能解决你的问题,请参考以下文章

信件分析实战——爬取信件内容

java mail text/calendar格式会议邀请邮件,网页版邮箱接收到的邮件内容无法换行

Java发送邮件

搭建Mail服务器--Sendmail

Python 爬取 北京市政府首都之窗信件列表-[信息展示]

在 javax.mail api 中为 mime 多部分/相关消息的内容类型设置“开始”属性