Java Email实现邮件的发送

        通过对计算机网络的学习我可以知道,在发送电子邮件的时候使用的协议为smtp协议,接受电子邮件使用的协议为pop3协议,而这两个协议都是位于五层模型的应用层。

       SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。

        POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。 

下面我们使用Java发送邮件

一、准备工作 

1、需要导入javax.mail-1.6.2.jar包

2、准备smtp登录信息:准备一个公共的类用来连接smtp服务并且创建Session 例如

public final class JavaMainUtils {

	private JavaMainUtils() {

	}

	public static Session createSession() {

		// 邮箱账号信息
		String userName = "用户名";// 用户名
		String password = "EEZSLUTYCFKKGEDY";// 账号授权密码

		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.163.com"); // 主机名
		props.put("mail.smtp.port", "25");// 主机端口号
		props.put("mail.smtp.auth", "true");// 是否需要用户认证
		props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密

		// 创建Sessoion
		// 参数1:smtp服务器连接参数
		// 参数2:账号和密码授权认证对象
		Session session = Session.getInstance(props, new Authenticator() {

			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(userName, password);
			}
		});

		session.setDebug(true);

		return session;
	}
}

注意:

1、使用私有的构造方法是为了防止该类被外部实例化;

2、账号的授权秘密需要在邮箱中设置,并且通过手机扫码的方式获取;

3、通过Authenticator创建的对象是账号和密码授权认证对象;

4、session.setDebug(true)的作用是获取发送电子邮件的调试信息;

获取授权密码方法(以网易邮箱为例)

二、发送普通邮件 

public static void main(String[] args) {
		try {
			// 1、创建session会话
			Session session = JavaMainUtils.createSession();

			// 2、创建邮件对象
			MimeMessage message = new MimeMessage(session);
			message.setSubject("我是你"); // 设置邮件标题
			message.setText("我是你");// 设置邮件正文
			message.setFrom(new InternetAddress("设置发件人@163.com"));// 设置发件人
			message.setRecipient(RecipientType.TO, new InternetAddress("设置收件人@qq.com"));// 设置收件人

			// 发送
			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

        发送邮件的时候我们需要构造一个MimeMessage对象,然后调用Transport.send(message)即可完成发送,绝大多数的邮件服务器要求发送方地址和登录用户名完全一致,否则会发送失败。

1、setSubject是用来设置邮件标题;

2、setText是用来设置邮件正文;

3、setFrom需要传入一个InternetAddress对象,表示发件人的邮箱地址;

4、setRecipient用来设置收件人的邮箱地址。

三、发送HTML邮件

发送HTML邮件的时候我们只需把在上述代码中加入一个参数即可:

message.setText("我是你");// 设置邮件正文

改为:

message.setText("我是你", "utf-8", "html");// 设置邮件正文

四、发送附件

public static void main(String[] args) {

		try {
			Session session = JavaMainUtils.createSession();

			MimeMessage message = new MimeMessage(session);

			message.setFrom(new InternetAddress("@163.com"));
			message.setRecipient(RecipientType.TO, new InternetAddress("@qq.com"));
			message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("@qq.com"),
					new InternetAddress("@qq.com") }); // 设置抄送
			message.setSubject("hi");
			// 邮件正文设置包含html标签
//			message.setText("我是你<b>爷</b>", "utf-8", "html");

			// 正文
			BodyPart textPart = new MimeBodyPart();
			textPart.setContent("我是<b>你<b>", "text/html;charset=utf-8");

			// 附件
			BodyPart filePart = new MimeBodyPart();
			filePart.setFileName("我是你");// 附件文件名称
			// 上传附件
			filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
					Files.readAllBytes(Paths.get("D:\\java\\ddc.jpg")), "application/octet-stream")));

			// 将正文和附件组装为Multipart对象
			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(textPart);
			multipart.addBodyPart(filePart);

			// 将Multipart对象加入message
			message.setContent(multipart);
			Transport.send(message);

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

	}

        一个 Multipart 对象可以添加若干个 BodyPart ,其中第一个BodyPart 是文本,即邮件正文,后面的BodyPart是附件。BodyPart依靠setContent() 决定添加的内容,如果添加文本,用 setContent("...", "t ext/plain;charset=utf-8") 添加纯文本,或者用setContent("...", "text/html;charset=utf-8") 添加 HTML 文本。如果添加附件,需要设置文 件名(不一定和真实文件名一致),并且添加一个 DataHandler() ,传入文件的MIME 类型。二进制文件可以用 application/octet-stream ,Word文档则是 application/msword 。最后,通过setContent() 把 Multipart 添加到 Message 中,即可发送。

RecipientType.CC的含义是可以进行抄送,将一封邮件同时发送给多个邮箱

五、发送内嵌图片的HTML邮件

public static void main(String[] args) {

		try {
			Session session = JavaMainUtils.createSession();

			MimeMessage message = new MimeMessage(session);

			message.setFrom(new InternetAddress("@163.com"));
			message.setRecipient(RecipientType.TO, new InternetAddress("@qq.com"));
			message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("@qq.com"),
					new InternetAddress("@qq.com") }); // 设置抄送
			message.setSubject("hi");

			BodyPart textPart = new MimeBodyPart();
			StringBuilder content = new StringBuilder();
			content.append("<h1>我是你</h1>");
			content.append("<h2>yes</h2>");
			content.append("<img src=\"cid:ddc\"/>");
			textPart.setContent(content.toString(), "text/html;charset=utf-8");

			BodyPart imagePart = new MimeBodyPart();
			imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
					Files.readAllBytes(Paths.get("D:\\java\\fpf.jpg")), "application/octet-stream")));

			imagePart.setHeader("Content-ID", "ddc");

			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(textPart);
			multipart.addBodyPart(imagePart);

			message.setContent(multipart);

			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

设置当前image为内嵌图片

这个ID和HTML中引用的ID对应起来,邮件客户端就可以正常显示内嵌图片

imagePart.setHeader("Content-ID", "ddc");
content.append("<img src=\"cid:ddc\"/>");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农叮叮车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值