使用Java mail实现邮件重定向(复杂邮件也通用)

最近使用Javamail实现邮件重定向的过程中,发现有一部分邮件会出现正文缺失的问题,下面分享一个思路解决这个问题,欢迎讨论、提问。

具体步骤如下:

  1. 获取SMTP会话:使用MailConn对象获取一个SMTP会话(Session),用于后续的邮件发送。

  2. 创建新的邮件消息:通过这个会话创建一个新的MimeMessage对象,作为要发送的邮件。

  3. 设置发件人:尝试使用原始邮件的发件人地址设置新邮件的发件人。如果原始邮件没有发件人信息,则使用传入的from参数作为发件人。

  4. 添加收件人、抄送人和密送人:根据传入的列表,解析并添加收件人(TO)、抄送人(CC)和密送人(BCC)到新邮件中。

  5. 设置邮件主题和发送时间:将原始邮件的主题复制到新邮件,并设置新邮件的发送时间为当前时间。

  6. 复制邮件内容:根据原始邮件的内容类型(是否为多部分multipart/*),复制内容到新邮件。如果是多部分内容,则遍历所有部分并添加到新邮件;如果不是,直接设置数据处理器。

  7. 保存更改并发送邮件:在新邮件对象上调用saveChanges方法保存所有更改,然后使用Transport对象发送这封邮件。

  8. 异常处理:捕获并处理可能发生的异常,如发送邮件时遇到的问题,并记录错误信息。如果发送成功,返回true;如果发生异常,则返回false

public boolean redirectMail(MailConn conn, String from, List<String> toMail, List<String> ccEmail, List<String> bccEmail, MimeMessage originalMessage) {
		boolean isFlag = false;
		try {
			Session transportSession = conn.getSmptSession();
			MimeMessage message = new MimeMessage(transportSession);

			// 使用原始邮件的发件人作为新邮件的发件人
			Address[] originalFrom = originalMessage.getFrom();
			if (originalFrom != null && originalFrom.length > 0) {
				message.setFrom(originalFrom[0]);
			} else {
				message.setFrom(new InternetAddress(from)); // Fallback to provided 'from' if original does not have a sender
			}
			message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(String.join(",", toMail)));
			if (ccEmail != null && !ccEmail.isEmpty()) {
				message.addRecipients(Message.RecipientType.CC, InternetAddress.parse(String.join(",", ccEmail)));
			}
			if (bccEmail != null && !bccEmail.isEmpty()) {
				message.addRecipients(Message.RecipientType.BCC, InternetAddress.parse(String.join(",", bccEmail)));
			}
			message.setSubject(originalMessage.getSubject());
			message.setSentDate(new Date());
			// 复制内容
			if (originalMessage.isMimeType("multipart/*")) {
				Multipart originalMultipart = (Multipart) originalMessage.getContent();
				Multipart newMultipart = new MimeMultipart();
				for (int i = 0; i < originalMultipart.getCount(); i++) {
					newMultipart.addBodyPart(originalMultipart.getBodyPart(i));
				}
				message.setContent(newMultipart);
			} else {
				message.setDataHandler(originalMessage.getDataHandler());
			}
			message.saveChanges(); // 保存更改
			// 发送邮件
			Transport transport = transportSession.getTransport();
			transport.connect();
			transport.sendMessage(message, message.getAllRecipients());
			isFlag = true;
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("MessagingException while trying to send email Error: {}", e.getMessage());
			isFlag = false;
		}
		return isFlag;//GPT4生成,可以代问
	}

这段代码通过复制原始邮件的内容和属性到一个新的MimeMessage对象中,并发送这个新对象到指定的收件人、抄送人和密送人,实现了邮件重定向的功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Skyn3ss

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

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

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

打赏作者

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

抵扣说明:

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

余额充值