javamail发送邮件的代码例子-复杂类型的邮件

package com.cs.mail;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
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;

import com.cs.utils.DateUtil;
/**
 * 邮件的结构大概是这个样子的
 * 整个邮件{
 *   头部{....},
 *   体部(MimeMultipart){
 *     正文(MimeBodyPart){ 
 *        分正文1(MimeMultipart){ 
 *            文本(MimeBodyPart){..},
 *            图片(MimeBodyPart){..},
 *            超链接(MimeBodyPart){..}  },   
 *        分正文2{ 
 *            文本(MimeBodyPart){..},
 *            图片(MimeBodyPart){..},
 *            超链接(MimeBodyPart){..}  }
 *     },
 *     附件1(MimeBodyPart){},
 *     附件2(MimeBodyPart){},
 *     .....
 *   }
 * }
 * 
 * @author Administrator
 *
 */
public class MIMEMessageTest {
	public static void main(String[] args) throws Exception {
		//Session session = Session.getInstance(new Properties());//因为不发送出去,所以properties可以直接new,不用填数据
		//为了能真正发送邮件出去,需要设置properties的相关内容
		Properties props = new Properties();
		props.put("mail.smtp.auth","true");//mail.smtp.auth属性设置为true,表示要做验证
		props.put("mail.transport.protocal","smtp");
		props.put("mail.smtp.host","smtp.126.com");
		
		Session session = Session.getInstance(props,
				/*创建一个匿名内部类,并且覆盖了父类的方法,这个模式叫做策略模式*/
				new Authenticator(){
					protected PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication("邮箱的用户名","密码");
					}
				}
		);
		
		//创建一个邮件
		MimeMessage msg = new MimeMessage(session);//这个是整个邮件
		
		msg.setSubject("复杂邮件标题信息-使用程序来生成邮件");//设置邮件的标题
		msg.setFrom(new InternetAddress("a44@126.com"));//发件人
		//下面设置收件人和抄送人。user1 <5944424@qq.com> 这样的格式,是为了给收件人取个名字,而不是直接显示为邮件地址
		msg.setRecipients(RecipientType.TO,
				InternetAddress.parse("user1 <334444@qq.com>,55566692@qq.com,te6n@ss6l.com")
				);
		msg.setRecipients(RecipientType.CC,
				InternetAddress.parse("la434@126.com")
				);
		msg.setReplyTo(InternetAddress.parse("l44704@126.com"));//点击回复时,就会回复这里指定的人,而不是发件人了
		
		
		/*下面是构造邮件的具体内容*/
		//体部,是个复杂体,mix表示体部里的各部分的关系是混合型的.MimeMultipart还可以是复杂体中的复杂体
		MimeMultipart multipart = new MimeMultipart("mix");//原先是写multipart/mix,其实不是这样写的,因为这个类本身就已经是multipart了,就写子类型就好了
		msg.setContent(multipart);//把体部加入到邮件整体里面
		
		//构建各个分部的对象
		MimeBodyPart attachment1 = new MimeBodyPart();//附件1
		MimeBodyPart attachment2 = new MimeBodyPart();//附件2
		MimeBodyPart content = new MimeBodyPart();//正文,是个复杂体,可以包括文本,图片,超链接等资源,它里面还可以继续有MimeMultipart,MimeBodyPart等
		
		//把各个分部对象,添加到体部里面
		multipart.addBodyPart(attachment1);//把附件1添加到体部
		multipart.addBodyPart(attachment2);//把附件2添加到体部
		multipart.addBodyPart(content);//把正文添加到体部
		
		//附件1的构建的准备
		DataSource ds1 = new FileDataSource("d:\\Hello.txt");//把要的附件的地址传进来
		DataHandler dh1 = new DataHandler(ds1);
		//构造附件1的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
		attachment1.setDataHandler(dh1);
		attachment1.setFileName(MimeUtility.encodeText("Hello.txt"));//必须要设置附件的名字,否则就不是附件了
		
		//附件2的构建的准备
		DataSource ds2 = new FileDataSource("d:\\world.txt");//把要的附件的地址传进来
		DataHandler dh2 = new DataHandler(ds2);
		//构造附件2的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
		attachment2.setDataHandler(dh2);
		attachment2.setFileName("world.txt");//必须要设置附件的名字,否则就不是附件了
		
		
		//下面开始构造正文部分的内容,需要构造MimeMultipart,MimeBodyPart等对象,也就是正文里的正文,称为分正文
		MimeMultipart bodyMultipart = new MimeMultipart("related");//分正文的构建,里面的各个资源关系是关联关系,所以写related
		content.setContent(bodyMultipart);//把分正文添加到正文里面
		
		//构造分正文里的各个部分的内容,里面有文本,图片,超链接等
		MimeBodyPart htmlPart = new MimeBodyPart();//html格式的文本内容
		MimeBodyPart gifPart = new MimeBodyPart();//图片
		bodyMultipart.addBodyPart(htmlPart);//文本添加到分正文里
		bodyMultipart.addBodyPart(gifPart);//图片添加到分正文里
		
		//图片的构建的准备
		DataSource gifds = new FileDataSource("d:\\gif003.jpg");//把要的图片的地址传进来
		DataHandler gifdh = new DataHandler(gifds);
		//构造图片的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
		gifPart.setDataHandler(gifdh);
		gifPart.setFileName(MimeUtility.encodeText("图片"));//文件名中如果是中文,可以用MimeUtility.encodeText()转换一下
		gifPart.addHeader("Content-Location","d:\\");//
		
		//文本内容的构造比较简单,就是setContent方法即可
		String context = "Dear XXXX,<br>你好,这封邮件是系统后台发送的邮件,请不要回复.<br>现在时间是:"+DateUtil.getNowDateString();
		htmlPart.setContent(context,"text/html;charset=gbk");//注意charset不要写成chartset,否则中文会是乱码
		
		//调用保存修改的方法,完成这份邮件的编写
		msg.saveChanges();
		
		
		//现在不发送出去,可以把邮件内容保存到某个地方去
		File dir = new File("d:\\mail\\");
		dir.mkdirs();
		File file = new File(dir,"hello.eml");
		file.createNewFile();
		OutputStream os = new FileOutputStream(file);
		msg.writeTo(os);
		os.flush();
		os.close();
		
		session.setDebug(true);//设置debug为true时,表示要在控制台打印出发送邮件时的相关信息
		Transport.send(msg);//这个静态方法内部做了连接,发送,关闭动作,如果使用实例变量的sendMessage(....)方法,则要自己去连接,发送,关闭.
		
		
		
		
		
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值