java发送邮件

本文介绍了如何使用Java通过SMTP和SMTPS协议发送邮件,包括开启163邮箱的SMTP服务,设置安全密码,以及解决25端口禁用时切换到465端口的方法,确保邮件发送的安全性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电子邮件:

    电子邮件可以让我们在网络上通过电子手段进行信息交互,那么这就要涉及到电子邮箱服务器,服务器有发送邮件(简称SMTP)的服务器和接收邮件(简称POP3)的服务器.

使用场景:

    任务提醒

    绩效统计

依赖java包:

    <dependency>
	    <groupId>javax.mail</groupId>
	    <artifactId>mail</artifactId>
	    <version>1.4</version>
    </dependency>

开启SMTP服务:

    例子中使用的发送方是网易163邮箱,首先需要登录163邮箱,找到账号管理,如下图:

    点击POP3/SMTP,开启SMTP服务,如下图:

编写代码:

    在点击开启的时候会出现一串密码,用于发送邮件方的密码,不能用登录密码

package com.spd.comm.utils;

import java.io.File;
import java.util.Properties;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

public class EmailUtils {
	
	private static final String MSG_STATUS_SUCCESS = "success";

	private static final String MSG_STATUS_FAILURE = "failure";

	private static JavaMailSender mailSender;
	
	public static String host;
	public static String username;
	public static String password;
	
	public EmailUtils(JavaMailSender mailSender) {
		EmailUtils.mailSender = mailSender;
	}


	/**
	 * @param subject 标题
	 * @param receiver 接收人的邮箱
	 * @param msg 内容
	 * @return the string
	 */
	public static String sendSimpleMail(String subject, String[] receiver, String msg) {
		try {
			SimpleMailMessage message = new SimpleMailMessage();
			message.setFrom(username);
			message.setTo(receiver);
			message.setSubject(subject);
			message.setText(msg);
			mailSender.send(message);
		} catch (Exception e) {
			e.printStackTrace();
			return MSG_STATUS_FAILURE;
		}
		return MSG_STATUS_SUCCESS;
	}

	/**
	 * @param subject 标题
	 * @param receiver 接收人的邮箱
	 * @param msg 内容
	 * @return the string
	 */
	public static String sendHTMLMail(String subject, String[] receiver, String msg) {
		MimeMessage message = null;
		try {
			message = mailSender.createMimeMessage();
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
			helper.setFrom(username);
			helper.setTo(receiver);
			helper.setSubject(subject);

			StringBuffer sb = new StringBuffer();
			sb.append(msg);
			helper.setText(sb.toString(), true);
			mailSender.send(message);
		} catch (Exception e) {
			e.printStackTrace();
			return MSG_STATUS_FAILURE;
		}
		return MSG_STATUS_SUCCESS;
	}

	/**
	 * @param subject 标题
	 * @param receiver 接收人的邮箱
	 * @param msg 内容
	 * @param file 文件
	 * @return the string
	 */
	public static String sendAttachmentsMail(String subject, String[] receiver, String msg, File file) {
		MimeMessage message = null;
		try {
			message = mailSender.createMimeMessage();
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
			helper.setFrom(username);
			helper.setTo(receiver);
			helper.setSubject(subject);
			helper.setText(msg);
			// 注意项目路径问题,自动补用项目路径
			FileSystemResource fileResource = new FileSystemResource(file);
			// 加入邮件
			helper.addAttachment("附件.pdf", fileResource);
			mailSender.send(message);
		} catch (Exception e) {
			e.printStackTrace();
			return MSG_STATUS_FAILURE;
		}
		
		return MSG_STATUS_SUCCESS;
	}

	/**
	 * @param subject 标题
	 * @param receiver 接收人的邮箱
	 * @param msg 内容
	 * @param file 文件
	 * @return the string
	 */
	public static String sendInlineMail(String subject, String[] receiver, String msg, File file) {
		MimeMessage message = null;
		try {
			message = mailSender.createMimeMessage();
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
			helper.setFrom(username);
			helper.setTo(receiver);
			helper.setSubject(subject);
			// 第二个参数指定发送的是HTML格式,同时cid:是固定的写法
			helper.setText(msg, true);
			FileSystemResource fileResource = new FileSystemResource(file);
			helper.addInline("picture.jpg", fileResource);
			mailSender.send(message);
		} catch (Exception e) {
			e.printStackTrace();
			return MSG_STATUS_FAILURE;
		}
		
		return MSG_STATUS_SUCCESS;
	}
	
	static {
		JavaMailSenderImpl impl = new JavaMailSenderImpl();
		// 用户名密码配置,默认是25端口
		host= "smtp.163.com";
		// QQ邮箱
//		host= "smtp.qq.com";
		// 126邮箱
//		host= "smtp.126.com";
		username= 邮箱账号;
		password= 刚才申请的邮箱密码(非登录密码);
		impl.setHost(host);
		impl.setUsername(username);
		impl.setPassword(password);
		
		//加认证机制
		Properties javaMailProperties = new Properties();
		javaMailProperties.put("mail.smtp.auth", "true"); 
		javaMailProperties.put("mail.smtp.ssl.enable", "true"); 
		javaMailProperties.put("mail.smtp.starttls.enable", "true"); 
		javaMailProperties.put("mail.smtp.timeout", 5000); 
		impl.setJavaMailProperties(javaMailProperties);
		mailSender = impl;
	}
}

完成!

如果出现25端口禁用的情况,可以换成465端口

区别:

    25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。

    465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

    更换上边static中的代码为:

static {
		JavaMailSenderImpl impl = new JavaMailSenderImpl();
		// 用户名密码配置,默认是25端口
		host= "smtp.163.com";
		username= 邮箱账号;
		password= 刚才申请的邮箱密码(非登录密码);
		impl.setHost(host);
		impl.setUsername(username);
		impl.setPassword(password);
		
		//加认证机制
		Properties javaMailProperties = new Properties();
		javaMailProperties.put("mail.smtp.auth", "true"); 
		javaMailProperties.put("mail.smtp.port", "465");
		javaMailProperties.setProperty("mail.debug", "true");//启用调试
		javaMailProperties.setProperty("mail.smtp.socketFactory.fallback", "false");
		javaMailProperties.setProperty("mail.smtp.socketFactory.port", "465");//设置ssl端口
		javaMailProperties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		javaMailProperties.put("mail.smtp.timeout", 5000); 
		impl.setJavaMailProperties(javaMailProperties);
		mailSender = impl;
	}

完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值