java实现发送邮件可多个附件内嵌图片-commons-email使用

前言

java实现发邮件功能,其实SUN在javaEE的开发包里给我们提供了相关的工具,利用 mail.jar 和 activation.jar可以实现这个功能,n年前包括我第一次实习的时候项目上也是用SUN提供的包实现的,实现起来比较繁琐麻烦,今天我们就用Apache的工具包commons-email包来实现发送带邮件和内嵌图片的功能,它是把前者做了下封装,使用起来更加的简易方便明了,所以我们使用commons-email来实现发送邮件的功能,必须也引入mail.jar,activation.jar2个依赖包,MyEclipse中是自带的,所以你如果不知道commons-email.jar还需要依赖这个2个包的话,一旦把项目换到其他开发环境中,可能就出现ClassNotFund异常,不知道的你可能可能还在郁闷之中呢,这里给大家提供一下这三个jar包免费下载地址:java邮件功能jar包免费下载,好了废话,不多说,直接切入代码,代码中我注释的很详尽,就不做多余的解释了,大家一看就明白了。

说明

由于时间紧,一直忙于项目的封闭开发,所以先直接贴出实现代码和测试代码,暂时不做排版和各个功能代码的说明和注意事项,不过代码注释已非常详尽,大家一看就会明白的,等有时间了会对博文做进一步的修色和排版、代码的说明以方面大家更好的理解和掌握,如有什么疑问或建议,欢迎留言!

实现代码:

package sendemail;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;

import javax.mail.MessagingException;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.ImageHtmlEmail;
import org.apache.commons.mail.resolver.DataSourceUrlResolver;

public class Email {
	//邮箱服务器的登录用户名
	private static String username="[email protected]";
	//邮箱服务器的密码
	private static String password="zhangchen713115";
	//邮箱服务器smtp host,此处采用自己的QQ邮箱作为邮件服务器
	private static String smtpHost="smtp.qq.com";
	//发送方的邮箱(必须为邮箱服务器的登录用户名)
	private static String fromEmail="[email protected]";
	//发送方姓名
	private static String fromUsername="某某公司";
	//邮件内容编码,防止乱码
	private static String charset="UTF-8";

	/**
	 *java发送邮件-commons-email
	 * @param nameAndAddrMap 用户名及对应的邮箱组成的Map
	 * @param subject 邮件主题或标题
	 * @param htmlContent 邮件内容html格式
	 * @throws EmailException
	 * @throws MessagingException
	 * @author chenleixing
	 */
	public static void sendEmail(Map<String,String> nameAndAddrMap,String subject,String htmlContent)
		throws EmailException, MessagingException{
        //SimpleEmail email = new SimpleEmail();//创建简单邮件,不可附件、HTML文本等
		//MultiPartEmail  email = new MultiPartEmail();//创建能加附件的邮件,可多个、网络附件亦可
		/*ImageHtmlEmail:HTML文本的邮件、通过2代码转转内联图片,  1.3新增的,但我怎么也测试不成功
		  ImageHtmlEmail网上都是官网上例子而官网上例子比较模糊
		  ImageHtmlEmail email=new ImageHtmlEmail();*/
		HtmlEmail email = new HtmlEmail();//创建能加附件内容为HTML文本的邮件、HTML直接内联图片但必须用setHtmlMsg()传邮件内容

        //email.setDebug(true);//是否开启调试默认不开启
        email.setSSLOnConnect(true);//开启SSL加密
        email.setStartTLSEnabled(true);//开启TLS加密

        //设置smtp host,此处采用自己的QQ邮箱作为邮件服务器
        email.setHostName(Email.smtpHost);
        //登录邮件服务器的用户名和密码(保证邮件服务器POP3/SMTP服务开启)
        email.setAuthentication(Email.username, Email.password);

		email.setFrom(Email.fromEmail,Email.fromUsername);//发送方
		for(Map.Entry<String, String> map:nameAndAddrMap.entrySet()){//遍历用户名及对应的邮箱地址组成的map
			email.addTo(map.getValue(),map.getKey());//接收方邮箱和用户名
		}
		//email.addCc("[email protected]");//抄送方
		//email.addBcc("[email protected]");//秘密抄送方

		email.setCharset(Email.charset);//设置邮件的字符集为UTF-8防止乱码
		email.setSubject(subject);//主题
		email.setHtmlMsg(htmlContent);//邮件内容:<font color='red'>测试简单邮件发送功能!</font>

		/*HtmlEmail、ImageHtmlEmail有setHtmlMsg()方法,且可以直接内联图片,可网上都搞那么复杂说不行如
		 *<img src='http://www.apache.org/images/asf_logo_wide.gif' />本人测试新浪、搜狐、QQ邮箱等都能显示
		 */
	    /*//如果使用setMsg()传邮件内容,则HtmlEmail内嵌图片的方法
        URL url = new URL("http://www.jianlimuban.com/图片");
        String cid = email.embed(url, "名字");
        email.setHtmlMsg("<img src='cid:"+cid+"' />");*/

		//这是ImageHtmlEmail的内嵌图片方法,我多次测试都不行,官网提供比较模糊,而大家都是用官网举的例子
		//内嵌图片,此处会抛出MessagingException, MalformedURLException异常
		//URL url=new URL("http://www.apache.org");//定义你基本URL来解决相对资源的位置
		//email.setDataSourceResolver(new DataSourceUrlResolver(url));//这样HTML内容里如果有此路径下的图片会直接内联

        //创建邮件附件可多个
        EmailAttachment attachment = new EmailAttachment();//创建附件
        attachment.setPath("D:\\MongoDB.txt");//本地附件,绝对路径
        //attachment.setURL(new URL("http://www.baidu.com/moumou附件"));//可添加网络上的附件
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        attachment.setDescription("MongoDB入门精通");//附件描述
        attachment.setName("NoSQL数据库");//附件名称
        email.attach(attachment);//添加附件到邮件,可添加多个
        email.attach(attachment);//添加附件到邮件,可添加多个

        /*email.buildMimeMessage();//构建内容类型 ,
        //设置内容的字符集为UTF-8,先buildMimeMessage才能设置内容文本 ,但不能发送HTML格式的文本
        email.getMimeMessage().setText("<font color='red'>测试简单邮件发送功能!</font>","UTF-8");*/

		email.send();//发送邮件
    }
}

测试代码:

package sendemail;

import java.util.Map;

import org.junit.Test;

import com.google.common.collect.Maps;

public class EmailTest {

	@Test
	public void testSendSimpleEmail(){

		//用户名和对应的邮箱
		Map<String,String> nameAndAddrMap=Maps.newHashMap();//新建一个map
		nameAndAddrMap.put("张三","chen*****@sina.com");
		nameAndAddrMap.put("李四","leixing*****@163.com");
		nameAndAddrMap.put("王麻子","chenxing*****@qq.com");
		String htmlContent="<font color='red'>测试简单邮件发送功能!</font>";//邮件内容
		String subject="新年好!";//主题或者标题
		try {
			Email.sendEmail(nameAndAddrMap,subject,htmlContent);//测试发送邮件功能
		} catch( Exception e) {
			System.out.println("邮件发送失败!");
			//logger.setMessage(e.getMessage());
		}
	}
}

转载请注明—作者:Java我人生(陈磊兴)   原文出处:http://blog.csdn.net/chenleixing/article/details/44708533

最后,认真看过的网友们,大神们,如有感觉我这个程序猿有哪个地方说的不对或者不妥或者你有很好的提议或者建议或点子方法,还望您大恩大德施舍n秒的时间留下你的宝贵文字(留言),以便你,我,还有广大的程序猿们更快地成长与进步.......

时间: 2024-09-28 19:33:17

java实现发送邮件可多个附件内嵌图片-commons-email使用的相关文章

java程序发送内嵌图片、带附件邮件

package mail; import java.io.UnsupportedEncodingException;import java.util.Properties; import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingExc

java发送内嵌图片邮件

前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/hujunzheng/p/4792831.html 整体效果: 发送端:网易邮箱:接收端:qq邮箱. 1.web前端 2.在网易邮箱“已发送”中可以看见通过java代码发送的邮件 3.同样在qq邮箱中也可以看到这样的效果 实现过程: 1.web前端(bootstrap布局) <form action=&quo

Spring 发送内嵌图片的邮件 遇到的问题

问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gif"> 这种方法是最简单的发送带图片的邮件的方法,但是存在一个问题:有的邮箱会把邮件中有带服务器地址的图片放到垃圾箱,导致邮件收不到,于是继续整. 解决方法2:使用Spring带的 MimeMessageHelper,说不清楚直接看代码: 1 public class MyClass { 2

原生js实现tab选项卡里内嵌图片滚动特效代码

<!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8"><title>原生js实现tab选项卡里内嵌图片滚动特效代码</title><meta name="keywords" content="原生js实现tab选项卡里内嵌图片滚动特效代码" /><meta name=&

生成带内嵌图片的二维码

在博问上看到有同学在问如何实现一个带内嵌图片的二维码,所以准备记录下来,供同学们参考. 1.首先准备一个用于内嵌的图片. 2.既然生成二维码码,那肯定需要将什么样的内容生成二维码,这里我用http://www.baidu.com作为生成二维码的字符串 private string QcodeSource { get { return "http://www.baidu.com"; } } 3.我们来看看根据QcodeSource生成二维码的方法,这里返回Byte[].PS:这里用了 G

lumisoft.net 邮件管理系列文章 - 如何判断附件为内嵌式还是附加式

如果要区分邮件里面的附件是内嵌图片附件还是真正的附件,那么可以通过下面代码进行判断,如果是MIME_DispositionTypes.Attachment的就是普通附件,MIME_DispositionTypes.Inline的就是内嵌正文的附件. entity.ContentDisposition.DispositionType == MIME_DispositionTypes.Attachment

MongoDB 如何查询和修改内嵌文档

MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子对象,而doc中的field可以是原子对象,也可以是内嵌doc(embedded doc),数组等数据类型.内嵌doc中所有field的Key不允许重复. 例如以下doc,contact 字段是内嵌doc. oneDoc= { name:"t1", age:21, contact: { p

Java mail发送邮件附件出现.eml文件夹

在使用JAVA MAIL发送邮件时,163邮箱和QQ邮箱收到PDF附件,格式错误如下图: 163邮箱: QQ邮箱: 经历了很长时间的研究和测试,错误原因为在邮件正文和邮件附件用的MimeBodyPart对象是同一个,进而导致上述现象,解决办法为正文是一个MimeBodyPart对象,一个附件是一个MimeBodyPart对象.正确代码如下: 原文地址:https://www.cnblogs.com/XH09/p/10981329.html

Java Mail 发送邮件(个人备份)

package net.guoguoda.admin.common.utils; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; i