JavaMail邮件发送代码案例

目录

1. 电子邮件是如何发送的

2.  准备阶段

2.1 准备SMTP的登录信息

2.2 准备jar包

2.3 链接SMTP服务器

3. 发送邮件

3.1 发送普通HTNL邮件

3.2 发送带附件的HTML邮件

3.3 发送内嵌图片的HTML邮件


1. 电子邮件是如何发送的

电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。

邮件服务器发送邮件的协议是SMTP协议,它是Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465 或587。SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议。

2.  准备阶段

2.1 准备SMTP的登录信息

在使用JavaMail发送邮件时,首先需要自己的邮件地址和对方的邮件地址,其次要确定邮件服务器地址和端口号,发送方用163邮箱,接收方用qq邮箱。

        QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587

        163邮箱:SMTP服务器是smtp.163.com,端口是465

2.2 准备jar包

在程序中需要用到Javax.mail-1.6.2.jar,所以先要把jar包导入到当前项目,然后通过JavaMail API连接到SMTP服务器上,

2.3 链接SMTP服务器

首先我们需要准备一个Properties对象,里面存SMTP主机名、端口号、是否需要用户认证及是否启用TLS加密。其次获取Sessoin实例,传入props,同时需要传入Authenticator对象,在Authenticator对象中返回邮箱发送账号及账号授权密码,最后设置Debug便于调试。

    String userName = "1*********5@163.com";//邮箱发送账号
	String password = "W**************G";//账号授权密码
	//连接到SMTP服务器
	Properties props = new Properties();
	props.put("mail.smtp.host", "smtp.163.com");//SMTP主机名
	props.put("mail.smtp.port", "25");//主机端口号
	props.put("mail.smtp.auth", "true");//是否需要用户认证
	props.put("mail.smtp.starttls.enable","true");//启用TLS加密
		
	//获取Session实例
	Session session = Session.getInstance(props, new Authenticator() {
			
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(userName, password);
		}
	});
	//设置Debug模式便于调试
	session.setDebug(true);

3. 发送邮件

3.1 发送普通HTNL邮件

发送普通邮件时,第一步需要创建Session会话。

第二部创建MimeMessage邮件对象,在邮件对象中设置邮件发送地址、接收方地址、邮件主题、正文等信息。

        RecipientType.TO为接收方

         RecipientType.CC为抄送方

第三步用Transport的send方法发送message邮件。

通过以上三步发送普通邮件。

 try {
	    //1.创建Session会话
		Session session =JavaMailUtils.createSession();
			
		//2.创建邮箱对象
		MimeMessage message = new MimeMessage(session);
		message.setSubject("Hello");//设置邮件主题
		message.setText("爱你孤身走暗巷,爱你不跪的模样");//设置邮件正文
		message.setFrom(new InternetAddress("1*********5@163.com"));//设置发送方地址
		message.setRecipient(RecipientType.TO,new InternetAddress("2********0@qq.com"));//设置接收方地址
			
		//发送
		Transport.send(message);
	} catch (AddressException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (MessagingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}       

3.2 发送带附件的HTML邮件

发送带附件的邮件,跟发送带附件的邮件第一步跟最后一步操作是相同的。

不同之处在于第二步,其中创建MimeMessage对象、设置邮件标题、发件方、收件方及抄送方这些都不变。但是在设置内容时既包含内容又包含附件,我们不能直接用setText方法直接设置,而设要建一个MultiPart对象(一个MultiPart中可以添加多个BodyPart对象)。所以需要分别创建正文及附件相应的BodyPart对象,将正文及附件内容传入相应的BodyPart对象中,再将BodyPart添加至MultiPart中。最后通过setContect方法把MultiPart添加到Message中。

在BodyPart通过SetContect添加文本时,如果添加纯文本则用textPart.setContent("...","text/plain;charset=utf-8");添加html文本用textPart.setContent("...","text/html;charset=utf-8");

在添加附件时需要设置附件名,及添加DataHandler对象,将需要发送的附件上传。

    try {
		//创建Session会话
		Session session = JavaMailUtils.createSession();
			
		//创建MimeMession邮箱对象
		MimeMessage message = new MimeMessage(session);
		message.setSubject("测试邮件");//邮件标题
		message.setFrom("1*********5@163.com");//发件人
		message.setRecipient(RecipientType.TO, new InternetAddress("2********0@qq.com"));//收件人
		//抄送
		message.setRecipients(RecipientType.CC,new InternetAddress[]{new InternetAddress("2********0@qq.com")},newInternetAddress("1********0@qq.com");
			
		//既包含正文又包含附件
		BodyPart textPart = new MimeBodyPart();
		//正文
		textPart.setContent("用<b>脑子</b>干事算工作,不用<b>脑子</b>算动作","text/html;charset=utf-8");
		//附件
		BodyPart filePart = new MimeBodyPart();
		filePart.setFileName("足球");
		//上传附件文件
		filePart.setDataHandler(
				new DataHandler(
						new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\yjy\\messi.jpg")), "application/octet-stream")));
		//将正文+附件组装成Muitipart对象
		Multipart mulitPart = new MimeMultipart();
		mulitPart.addBodyPart(textPart);
		mulitPart.addBodyPart(filePart);
		
		message.setContent(mulitPart);
		//发送
		Transport.send(message);
	} catch (AddressException e) {
		// TODO Auto-generated catch block
	e.printStackTrace();
	} catch (MessagingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

3.3 发送内嵌图片的HTML邮件

发送内嵌图片与发送附件有些许不同,在传入正文内容时需要及将需要传入的内容都添加在StringBuilder中,再通过setContect方法将StringBuilder添加至textPart。(若StringnBuilder中带有html文本,则用textPart.setContent("contentText.toString()","text/html;charset=utf-8");)。

在传入图片时,需要设置图片内容ID,并将图片内容ID通过html标签方式添加至StringBuilder中。

    try {
        //创建Session会话
	    Session session = JavaMailUtils.createSession();
			
		//创建MimeMession邮箱对象
		MimeMessage message = new MimeMessage(session);
		message.setSubject("测试邮件2");//邮件标题
		message.setFrom("1*********5@163.com");//发件人
		message.setRecipient(RecipientType.TO, new InternetAddress("2********0@qq.com"));//收件人
		//抄送
		message.setRecipients(RecipientType.CC,new InternetAddress[]{new InternetAddress("2********0@qq.com")});
			
		BodyPart textPart = new MimeBodyPart();
		StringBuilder contentText = new StringBuilder();
		contentText.append("<h3>梅西</h3>");
		contentText.append("<p>三个男人的故事</p>");
		contentText.append("<img height=100px src=\"cid:football\"/>");
		textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
		
			
		//附件
		BodyPart imagePart = new MimeBodyPart();
		//上传附件文件
		imagePart.setDataHandler(
				new DataHandler(
						new ByteArrayDataSource(Files.readAllBytes(Paths.get("E:\\yjy\\messi.jpg")), "application/octet-stream")));
        //图片内容ID
		imagePart.setHeader("Content-ID","football");
			
		//将正文+附件组装成Muitipart对象
		Multipart mulitPart = new MimeMultipart();
		mulitPart.addBodyPart(textPart);
		mulitPart.addBodyPart(imagePart);
		//发送
		message.setContent(mulitPart);
			
		Transport.send(message);
	} catch (AddressException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (MessagingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值