网络编程之Java_Email

email指的是电子邮件,是一种用电子手段提供信息交换的通信方式,也是互联网应用最广的服务。电子邮件主要有图像、声音、文字、压缩文件以及各种文档等的形式,只要是电子邮箱支持的都可以作为电子邮件发送给对方。而今天我们要讲的是基于Java实现Email的发送。首先我们需要了解什么是邮件协议

邮件协议

MTA 和 MDA 这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行的。更多的需求场景,是需要发送邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议有:POP3SMTPIMAP

POP3

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。(与IMAP有什么不同?

SMTP

SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留 在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。

IMAP和POP3有什么区别?

POP3 协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

IMAP 提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

 

假设我们准备使用自己的邮件地址me@example.com给xxx发送邮件,已知xxx的邮件地址是xxxxx@yyyy.com,发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465还是587。

然后,我们通过JavaMail API连接到SMTP服务器上:以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。

准备好SMTP登录信息后,我们需要导入JavaMail相关的依赖Jar包 javax.mail-1.6.2.jar

// 服务器地址:
String smtp = "smtp.126.com";

// 登录用户名:
String username = "xxx@126.com";

// 登录口令:
String password = "P*******EWXVUI";

// 连接到SMTP服务器25端口:
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密

// 获取Session实例:
Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
});
// 设置debug模式便于调试:
session.setDebug(true);

 案例实现一:发送邮件

package com.zou;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

/**
 * 发送邮件
 * 
 * @author 
 *
 */
public class Demo {
	public static void main(String[] args) {
		try {
			// 1.创建Session会话
			Session session = JavaMailUtils.createSession();

			// 2.创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg = new MimeMessage(session);// 传入session
			msg.setFrom(new InternetAddress("xxxxxx@126.com"));// 发件人
			msg.setRecipient(RecipientType.TO, new InternetAddress("xxxxxxx@qq.com"));//
			msg.setSubject("测试邮件!", "utf-8");// 标题
			
			// 邮件正文中包含有"html"标签(控制文本的格式)
			msg.setText("你<b>好!</b>", "utf-8", "html");// 正文

			// 3.发送邮件
			Transport.send(msg);
		} catch (MessagingException e) {
			e.printStackTrace();
		}

	}
}

案例实现二:发送内嵌图片的HTML邮件

package com.zou;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class Demo {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 创建Session
			Session session = JavaMailUtils.createSession();

			MimeMessage msg1 = new MimeMessage(session);
			msg1.setFrom(new InternetAddress("xxxxxxx@126.com"));
			msg1.setRecipient(RecipientType.TO, new InternetAddress("xxxxxxxx@qq.com"));

			msg1.setSubject("测试邮件!!!");

			BodyPart textBodyPart = new MimeBodyPart();
			StringBuilder body = new StringBuilder();
			body.append("<h1>xxx</h1>");
			body.append("<img src=\"cid:zou\"/>");//通过内容ID引用附件图片
			textBodyPart.setContent(body.toString(), "text/html;charset=utf-8");

			// 邮件附件部分
			BodyPart imageBodyPart = new MimeBodyPart();
			imageBodyPart.setFileName("dragon.jpg");
			imageBodyPart.setDataHandler(new DataHandler(
					new ByteArrayDataSource(
					Files.readAllBytes(Paths.get("C:\\Users\\Pictures\\奇迹.jpg")),
					"application/octet-stream")));
			imageBodyPart.setHeader("Content-ID", "<zou>");//设置内容ID

			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(textBodyPart);
			multipart.addBodyPart(imageBodyPart);

			// 设置邮件内容
			msg1.setContent(multipart);

			// 3.发送邮件
			Transport.send(msg1);

		} catch (MessagingException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值