【Java】邮件Demo(SSL加密传输)

2023-03-21 21:06:06 浏览数 (2)

代码语言:javascript复制
package javamail.zifangsky.com;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
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.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class SendMailBySSL {
	private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
	private String smtpServer; // SMTP服务器地址
	private String port; // 端口
	private String username; // 登录SMTP服务器的用户名
	private String password; // 登录SMTP服务器的密码
	private List<String> recipients = new ArrayList<String>(); // 收件人地址集合
	private String subject; // 邮件主题
	private String content; // 邮件正文
	private List<String> attachmentNames = new ArrayList<String>(); // 附件路径信息集合

	public SendMailBySSL() {

	}

	public SendMailBySSL(String smtpServer, String port, String username,
			String password, List<String> recipients, String subject,
			String content, List<String> attachmentNames) {
		this.smtpServer = smtpServer;
		this.port = port;
		this.username = username;
		this.password = password;
		this.recipients = recipients;
		this.subject = subject;
		this.content = content;
		this.attachmentNames = attachmentNames;
	}

	public void setSmtpServer(String smtpServer) {
		this.smtpServer = smtpServer;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setRecipients(List<String> recipients) {
		this.recipients = recipients;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public void setAttachmentNames(List<String> attachmentNames) {
		this.attachmentNames = attachmentNames;
	}

	/**
	 * 进行base64加密,防止中文乱码
	 * */
	public String changeEncode(String str) {
		try {
			str = MimeUtility.encodeText(new String(str.getBytes(), "UTF-8"),
					"UTF-8", "B"); // "B"代表Base64
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return str;
	}

	/**
	 * 正式发邮件
	 * */
	public boolean sendMail() {
		Properties properties = new Properties();
		properties.put("mail.smtp.host", smtpServer);
		properties.put("mail.smtp.auth", "true");
		properties.put("mail.smtp.socketFactory.class", SSL_FACTORY);  //使用JSSE的SSL socketfactory来取代默认的socketfactory
		properties.put("mail.smtp.socketFactory.fallback", "false");  // 只处理SSL的连接,对于非SSL的连接不做处理
																
		properties.put("mail.smtp.port", port);
		properties.put("mail.smtp.socketFactory.port", port);

		Session session = Session.getInstance(properties);
		session.setDebug(true);
		MimeMessage message = new MimeMessage(session);

		try {
			// 发件人
			Address address = new InternetAddress(username);
			message.setFrom(address);

			// 收件人
			for (String recipient : recipients) {
				System.out.println("收件人:"   recipient);
				Address toAddress = new InternetAddress(recipient);
				message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO
				/**
				 * TO:代表有健的主要接收者。 CC:代表有健的抄送接收者。 BCC:代表邮件的暗送接收者。
				 * */
			}

			// 主题
			message.setSubject(changeEncode(subject));

			// 时间
			message.setSentDate(new Date());

			Multipart multipart = new MimeMultipart();
			// 添加文本
			BodyPart text = new MimeBodyPart();
			text.setText(content);
			multipart.addBodyPart(text);
			// 添加附件
			for (String fileName : attachmentNames) {
				BodyPart adjunct = new MimeBodyPart();
				FileDataSource fileDataSource = new FileDataSource(fileName);
				adjunct.setDataHandler(new DataHandler(fileDataSource));
				adjunct.setFileName(changeEncode(fileDataSource.getName()));
				multipart.addBodyPart(adjunct);
			}
			// 清空收件人集合,附件集合
			recipients.clear();
			attachmentNames.clear();

			message.setContent(multipart);
			message.saveChanges();

		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		try {
			Transport transport = session.getTransport("smtp");
			transport.connect(smtpServer, username, password);
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return true;
	}

	public static void main(String[] args) {
		List<String> recipients = new ArrayList<String>();
//		recipients.add("123456789@qq.com");
		recipients.add("admin@zifangsky.cn");
		String subject = "这封邮件是为了测试SMTP的SSL加密传输";
		String content = "这是这封邮件的正文";
		List<String> attachmentNames = new ArrayList<String>();
		attachmentNames.add("C://Users//Administrator//Desktop//kali.txt");
		SendMailBySSL sendMailBySSL = new SendMailBySSL("smtp.163.com", "465",
				"youname@163.com", "youpassword", recipients, subject, content,
				attachmentNames);
		sendMailBySSL.sendMail();
	}

}

温馨提示:本文最后更新于2021-11-18,若文件或内容有错误或已失效,请在下方留言。

0 人点赞