专栏首页老付的网络博客Java发送邮件(含附件)

Java发送邮件(含附件)

前几天写了一个Java发送邮件的帮助类i,可以发送QQ和163的邮箱,也可以发送附件,写个一个主要的方法,其他的可以自己封装。代码如下:

引入pom:

    <dependency>
            <groupId>Javax.mail</groupId>
            <artifactId>Javax.mail-api</artifactId>
            <version>1.6.2</version>
       </dependency>
package com.pay.utils;

import com.pay.utils.enums.MailType;
import org.springframework.util.StringUtils;

import Javax.activation.*;
import Javax.mail.*;
import Javax.mail.internet.*;
import Javax.mail.util.ByteArrayDataSource;
import Java.io.*;
import Java.util.HashMap;
import Java.util.Map;
import Java.util.Properties;

public class MailSender {
	private MailType mailType;
	private String userName;
	private String passWord;
	private Properties properties;
	
	
	public MailSender(MailType mailType, String userName, String passWord) {
		this.mailType = mailType;
		this.userName = userName;
		this.passWord = passWord;
		this.properties = getProperties();
	}
	
	
	public boolean sender(String recivers, String cc, String mailTitle, String mailContent, boolean isHtml, Map<String, byte[]> mapFile) throws MessagingException, IOException {
		Session session = Session.getInstance(properties);
		//2.通过session获取Transport对象(发送邮件的核心API)
		Transport ts = session.getTransport();
		//3.通过邮件用户名密码链接
		ts.connect(properties.getProperty("mail.host"), userName, this.passWord);
		//4.创建邮件
		MimeMessage mm = new MimeMessage(session);
		//设置发件人
		mm.setFrom(new InternetAddress(userName));
		Address[] address = new InternetAddress().parse(recivers);
		mm.setRecipients(Message.RecipientType.TO, address);
		
		//设置抄送人
		if (!StringUtils.isEmpty(cc)) {
			mm.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));
		}
		mm.setSubject(mailTitle);
		if (!isHtml) {
			mailContent = String.format("<pre>%s</pre>", mailContent);
		}
		//		mm.setContent(mailContent, "text/html;charset=utf-8");
		// 创建多重消息
		Multipart multipart = new MimeMultipart();
		
		BodyPart bodyPart = new MimeBodyPart();
		bodyPart.setContent(mailContent, "text/html;charset=utf-8");
		multipart.addBodyPart(bodyPart);
		if (mapFile != null) {
			MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
			mc.addMailcap("text/html;; x-Java-content-handler=com.sun.mail.handlers.text_html");
			mc.addMailcap("text/xml;; x-Java-content-handler=com.sun.mail.handlers.text_xml");
			mc.addMailcap("text/plain;; x-Java-content-handler=com.sun.mail.handlers.text_plain");
			mc.addMailcap("multipart/*;; x-Java-content-handler=com.sun.mail.handlers.multipart_mixed");
			mc.addMailcap("message/rfc822;; x-Java-content-handler=com.sun.mail.handlers.message_rfc822");
			CommandMap.setDefaultCommandMap(mc);
			
			for (Map.Entry<String, byte[]> map : mapFile.entrySet()) {
				BodyPart messageBodyPart = new MimeBodyPart();
				InputStream inputStream = new ByteArrayInputStream(map.getValue());
				DataSource source = new ByteArrayDataSource(inputStream, "application/txt");
				messageBodyPart.setDataHandler(new DataHandler(source));
				messageBodyPart.setFileName(MimeUtility.encodeText(map.getKey()));
				multipart.addBodyPart(messageBodyPart);
			}
			
			mm.setContent(multipart);
		}
		//5.发送电子邮件
		ts.sendMessage(mm, mm.getAllRecipients());
		return true;
	}
	
	private Properties getProperties() {
		if (this.mailType.equals(MailType.m163)) {
			Properties prop = new Properties();
			prop.put("mail.host", "smtp.163.com");
			prop.put("mail.transport.protocol", "smtp");
			prop.put("mail.smtp.auth", true);
			return prop;
		}
		if (this.mailType.equals(MailType.qq)) {
			Properties prop = new Properties();
			prop.setProperty("mail.host", "smtp.qq.com");
			prop.setProperty("mail.transport.protocol", "smtp");
			prop.setProperty("mail.smtp.auth", "true");
			prop.setProperty("mail.smtp.socketFactory.class", "Javax.net.ssl.SSLSocketFactory");
			prop.setProperty("mail.smtp.port", "465");
			prop.setProperty("mail.smtp.socketFactory.port", "465");
			return prop;
		}
		return null;
	}
	
}
public enum MailType {
	m163, qq
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中实现顺序IO

    对于磁盘的读写分为两种模式,顺序IO和随机IO。 随机IO存在一个寻址的过程,所以效率比较低。而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率...

    付威
  • 爬取菜鸟裹裹的数据

    菜鸟裹裹是阿里旗下的一个物流数据的整合平台,数据准确、及时.前几天在关注菜鸟和顺丰的争端,因为在前一天我刚刚爬到菜鸟上面的快递数据,第二天看到二者出现了摩擦,在...

    付威
  • Java反射超越泛型

    在一次使用BeanUtils.copyProperties的方法是,莫名其妙的报错,产生的代码分解如下:

    付威
  • 腾讯企业邮发送邮件 java版

    背景: 由于spark streaming程序需要保证 1*24 小时,不间断运行的,为了第一时间知道程序是否出错,所以采用了出错发送邮件这一策略,而公司恰...

    shengjk1
  • 【Spark篇】---SparkStreaming算子操作transform和updateStateByKey

    今天分享一篇SparkStreaming常用的算子transform和updateStateByKey。

    LhWorld哥陪你聊算法
  • yii2自动更新时间,根据条件设定指定值,接受多选框的值

    gii自动生成的_form.php文件中,我们可以根据代码$model->isNewRecord 返回的值,来判断当前是增加还是更新,在form.php文件中,...

    双面人
  • React 之props属性

    React 里有一个非常常用的模式就是对组件做一层抽象。组件对外公开一个简单的属性(Props)来实现功能,但内部细节可能有非常复杂的实现。 可以使用 JSX ...

    xiangzhihong
  • swagger-ui简要使用说明

    在和springboot 进行集成的时候,因为springboot默认不会添加jar中的资源文件,导致api页面不能显示,所以需要手动的设置资源文件。

    何白白
  • 历史上第一位从事游戏开发与设计的女程序员

    编者按:一直以来,女性软件开发人员数量稀少,尤其是在早期人们的刻板印象中,她们的工作能力、学历高低很容易其备受质疑的方面。实际上,家庭环境、学校教育、婚姻生活很...

    企鹅号小编
  • java 中的CAS与ABA问题

    属于悲观锁,有共享资源,需要加锁时,会以独占锁的方式导致其它需要获取锁才能执行的线程挂起,等待持有锁的钱程释放锁。传统的关系型数据库里边就用到了很多这种锁机制,...

    开发架构二三事

扫码关注云+社区

领取腾讯云代金券