E-Mail协议简介

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

邮件发送的工作图

基于ApacheJames邮件服务器的收发邮件代码及服务 java邮件服务器_邮件服务器

Java程序发邮件

JavaMail-API简介

  • 邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。
  • Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。

技术入口:Javax.mail.Session

  • Session -用于设置服务器,协议类型和密码等

表示会话,是JavaMailApi的最高层入口类。Session对像从Properties中获取信息,如IP、协议、用户名密码等。

  • Javax.mail.Message类,它的一个重要子类为MimeMessage.

Message类表示电子邮件的正文部分。

一封电子邮件包含以下内容:

地址信息、标题、日期、正文。

  • Java.mail.Address:收件人地址

表示邮件的地址。常用的子类为:javax.mail.internet.InternetAddress.

  • Javax.mail.Transport:负责发送邮件

指定邮件发送的协议。通常为SMTP.

它的静态方法send(Message)负责发送邮件。

准备

mail.jar,activation.jar.两个jar包,找不到可以下载本例完整代码,项目中lib目录中有。

代码演示

发送纯文本邮件

@Test
	public void demo1() throws Exception {
		Properties p = new Properties();
		p.setProperty("mail.transport.protocol", "SMTP"); //设置邮件发送协议
		p.setProperty("mail.smtp.host", "smtp.163.com"); //设置邮件服务器
		p.setProperty("mail.smtp.port", "25"); //设置发送邮件的端口号,默认 25
		p.setProperty("mail.smtp.auth", "true"); // 登录认证为true
		p.setProperty("mail.smtp.timeout","1000"); //设置超时时间
		//技术入口:
		Session mailSession = Session.getDefaultInstance(p, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				String username = "xxx@163.com"; //邮箱账号 xxx@163.com
				String password = "xxx"; //密码
				return new PasswordAuthentication( username, password );
			}
		});
		mailSession.setDebug(true); //开启debug模式
		
		//下面开始进行邮件信息的封装//
		//1 创建邮件对象,并且设置 由 mailSession 用户进行发送邮件
		Message message = new MimeMessage(mailSession);
		//2 设置邮件发送者
		message.setFrom( new InternetAddress("xxx@163.com") );
		//3 设置邮件接收者
		message.setRecipient( RecipientType.TO, new InternetAddress("xxx@qq.com"));
		//4 设置邮件主题
		message.setSubject("测试一下");
		//5 设置邮件内容
		message.setContent("Hello world! 你好!","text/html;charset=utf-8");
		
		//发送!!!
		Transport.send(message);
	}

发送带附件的邮件

@Test
	public void demo2() throws Exception {
		Properties p = new Properties();
		p.setProperty("mail.transport.protocol", "SMTP"); //设置邮件发送协议
		p.setProperty("mail.smtp.host", "smtp.163.com"); //设置邮件服务器
		p.setProperty("mail.smtp.port", "25"); //设置发送邮件的端口号,默认 25
		p.setProperty("mail.smtp.auth", "true"); // 登录认证为true
		p.setProperty("mail.smtp.timeout","1000"); //设置超时时间
		//技术入口:
		Session mailSession = Session.getDefaultInstance(p, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				String username = "xxx@163.com"; //邮箱账号 xxx@163.com
				String password = "xxx"; //密码
				return new PasswordAuthentication( username, password );
			}
		});
		mailSession.setDebug(true); //开启debug模式
		
		//下面开始进行邮件信息的封装//
		//1 创建邮件对象,并且设置 由 mailSession 用户进行发送邮件
		Message message = new MimeMessage(mailSession); 
		//2 设置邮件发送者
		message.setFrom( new InternetAddress("xxx@163.com") );
		//3 设置邮件接收者
		message.setRecipient( RecipientType.TO, new InternetAddress("xxx@qq.com"));
		//4 设置邮件主题
		message.setSubject("福利");
		///下面是开始变化的部分///
//		//5 设置邮件内容
//		message.setContent("Hello world! 你好!","text/html;charset=utf-8");
		
		//第一部分
		MimeBodyPart bodyPart1 = new MimeBodyPart();
		bodyPart1.setContent("<h1>福利</h1>","text/html;charset=utf-8");
		
		//第二部分
		MimeBodyPart bodyPart2 = new MimeBodyPart();
		bodyPart2.setDataHandler( new DataHandler( new FileDataSource("./imgs/1.jpg" ) ) );
		bodyPart2.setFileName(MimeUtility.encodeText("美女1.gif"));
		
		//第三部分
		MimeBodyPart bodyPart3 = new MimeBodyPart();
		bodyPart3.setDataHandler( new DataHandler( new FileDataSource("./imgs/2.jpg" ) ) );
		bodyPart3.setFileName(MimeUtility.encodeText("美女2.gif"));
		
		//按顺序加入到  Multipart 中  
		Multipart mp = new MimeMultipart();
		mp.addBodyPart(bodyPart1);
		mp.addBodyPart(bodyPart2);
		mp.addBodyPart(bodyPart3);
		
		//把mp设置为 message 的内容
		message.setContent(mp); //技术入口
		
		/
		//发送!!!
		Transport.send(message);
	}

完整代码链接