用JavaMail显示复合邮件的内容

合集下载

SpringBoot整合JavaMail通过阿里云企业邮箱发送邮件的实现

SpringBoot整合JavaMail通过阿里云企业邮箱发送邮件的实现

SpringBoot整合JavaMail通过阿⾥云企业邮箱发送邮件的实现JavaMail是Java开发中邮件处理的开源类库,⽀持常⽤协议如:SMTP、POP3、IMAP⼀、SpringBoot整合1、需要在pom⽂件中添加依赖spring-boot-starter-mail<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>构建项⽬,加载相关jar包2、在application.yml中配置邮件发送的相关信息spring:mail:host: #阿⾥云发送服务器地址port: 25 #端⼝号username: XXX@ #发送⼈地址password: ENC(Grg2n2TYzgJv9zpwufsf37ndTe+M1cYk) #密码3、编写邮件发送⼯具类MailUtilMailUtil.java/*** @author chenzan* @version V1.0* @description 邮件发送*/@Componentpublic class MailUtil {@AutowiredJavaMailSendermailSender;@AutowiredMailPropertiesmailProperties;/*** 发送邮件测试⽅法*/public void sendMail(MailBean mailBean) {SimpleMailMessage mimeMessage =new SimpleMailMessage();mimeMessage.setFrom(mailProperties.getUsername());mimeMessage.setTo(mailBean.getToAccount());mimeMessage.setSubject(mailBean.getSubject());mimeMessage.setText(mailBean.getContent());mailSender.send(mimeMessage);}/*** 发送邮件-附件邮件* @param boMailBean*/public boolean sendMailAttachment(MailBean mailBean) {try {MimeMessage mimeMessage =mailSender.createMimeMessage();MimeMessageHelper helper =new MimeMessageHelper(mimeMessage, true);helper.setFrom(mailProperties.getUsername());helper.setTo(boMailBean.getToAccount());helper.setSubject(mailBean.getSubject());helper.setText(mailBean.getContent(), true);// 增加附件名称和附件helper.addAttachment(MimeUtility.encodeWord(boMailBean.getAttachmentFileName(), "utf-8", "B"), mailBean.getAttachmentFile());mailSender.send(mimeMessage);return true;}catch (MessagingException e) {e.printStackTrace();return false;}}MailBean.java/*** @author chenzan* @version V1.0*/@Datapublic class MailBean {private Stringsubject;private String content;private String toAccount;private File attachmentFile;private String attachmentFileName;}4.发送String email = "XXX@";String content="测试内容";String subject = "测试主题";MailBean mailBean =new MailBean ();mailBean .setToAccount(email);boMailBean.setSubject(subject );boMailBean.setContent(content);boolean resultSend =mailUtil.sendMailAttachment(boMailBean);⼆、查看阿⾥云邮箱设置⽀持SMTP/POP3/IMAP功能,轻松通过客户端软件(outlook、foxmail等)收发邮件。

javamail收发邮件(带附件,正文带图)

javamail收发邮件(带附件,正文带图)

1.邮件1.1 邮件组成部分如果是新邮件就获取,并解析它;邮件是由邮件头和邮件体组成,在邮件头中主要包含了收件人、发件人、主题等等基础信息。

而邮件体中就包括了邮件的正文和附件等内容信息。

下图就是pop3协议下,邮件的大致内容。

1.2 发送邮件(带附件、正文带图片)QQ邮箱为例:需要QQ账号和QQ登录第三方客户端时,密码框的“授权码”(相当于密码)授权码如下获取:代码如下:public class JavaMailboxAttachment {private MimeMessage message;private Session session;private String mailHost = "";private String mailAuth = "";private String mailPort = "";private String sender_username = "";private String sender_password = "";//定义一个Properties 用于存放信息private Properties properties = new Properties();//-------------------------------发信箱---------------------------------------------public JavaMailboxAttachment(String email_type) {try {properties.put("mail.smtp.host",""); //发送邮件服务器//端口号,QQ邮箱给出了两个端口,但是另一个我一直使用不了,所以就给出这一个587properties.put("mail.smtp.port", "587"); //发送邮件端口号properties.put("mail.smtp.auth", "true");// 此处填写你的账号properties.put("er", "xxxxxxxxx@");// 此处的密码就是前面说的16位STMP授权码properties.put("mail.password", "xxxxxxxxxxxxxxxx");this.mailHost = properties.getProperty("mail.smtp.host");this.mailAuth = properties.getProperty("mail.smtp.auth");this.mailPort = properties.getProperty("mail.smtp.port");this.sender_username = properties.getProperty("er");this.sender_password = properties.getProperty("mail.password");} catch (Exception e) {e.printStackTrace();}// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName = properties.getProperty("er");String password = properties.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};session = Session.getInstance(properties,authenticator); //用户验证message = new MimeMessage(session); //将验证成功的session信息,创建一个message 对象。

javaMail使用说明

javaMail使用说明

本软件包包括源文件和可执行的jar文件1.运行方式A 可以直接运行jar文件(电脑上必须安装jdk1.6而且关联jar文件)B 可以用eclipse导入源文件然后运行2 功能简介a.登录界面选择相应的邮箱smtp服务器(也可以自己输入),然后输入账号和密码单击登录就可登录进系统。

图1.0 登录界面b.登录成功以后界面如下图1.1 登录成功页面本页面包括基本的菜单、联系人列表和浏览区图1.2 发送邮件界面通过发送邮件界面可以对要发送的邮件进行简单的编辑。

当然双击左侧栏的联系人可以直接将联系人添加到“收件人”或“抄送人”列表中。

页面如图1.3图1.3 添加联系人列表通过简单的编辑界面可以对邮件进行简单的编辑界面如图1.4当单击添加附件按钮时弹出对话框来选择附件。

界面如图1.5选中文件单击确定后讲附件添加到附件列表中,界面如图1.6图1.6 附件列表界面当点击发送按钮式邮件将进行发送。

发送过程中会有进度条提示发送邮件的进度。

发送成功会提示邮件发送成功。

在邮件编辑区邮件会列出简单的编辑工具弹出菜单,界面如图1.7图1.7 邮件菜单编辑当单击收件夹时弹出收件夹界面,单击收件夹的同时会自动加载收件夹中的邮件信息。

收件夹界面如图1.8图1.8 收件夹界面双击收件夹中邮件列表中的信息时。

会显示该邮件的具体内容界面如图1.9图1.9 邮件内容显示选中邮件列表信息是鼠标右键会弹出相应的菜单项(删除、彻底删除邮件、刷新邮件列表信息等)界面如图2.0图2.0 收件箱邮件菜单项单选择删除时会将邮件添加到已删除邮件列表中,单击彻删除邮件时会将邮件从服务器上删除。

单击刷新邮件箱时会更新收件箱邮件列表信息。

已删除邮件列表如图2.1】图2.1 已删除邮件列表当发送成功一封新邮件时,会将已发送的邮件添加到已发送邮件列表中已发送邮件列表如图2.2当单击添加联系人按钮时会弹出添加联系人界面:界面如图2.3图2.3 添加联系人界面当在联系人界面添加联系人之后会在列表中列出添加的联系人,界面如图2.4单击删除联系人可以删除选中的联系人信息,界面如图2.5图2.5 删除联系人信息另外当有新的邮件到达时会播放新邮件到达声音,系统图盘图标也会闪动界面如图2.6图2.6 系统图标。

基于Javamail的邮件收发系统-使用说明

基于Javamail的邮件收发系统-使用说明

基于Javamail的邮件收发系统使用说明书基于Javamail的邮件收发系统是一款简单、方便、快捷的邮件系统。

它能实现邮件的接收与发送,并能完成附件的传输,具有较好的人机交互性,易于使用。

开发环境:JDK1.6 + Windows平台开发技术:Javamail开发工具:Eclipse3.4运行环境:PC上需安装JDK1.6,且正确配置环境变量。

系统基本功能如下:(1) 收取并显示POP3邮件服务器上指定邮箱的邮件;(2) 使用SMTP邮件服务器发送邮件;(3) 邮件附件的发送与接受;(4) 删除邮件;具体操作步骤如下:1、打开javamailsystem文件夹,找到javamail.jar可执行文件,双击该执行文件,即可打开Javamail邮件收发系统客户端软件。

进入该系统后,首先选择“POP3/SMTP设置”按钮,对收发邮件所需的邮件服务器主机、收发邮件账号及密码信息进行设置。

图1-1邮件客户端主界面设置举例如下:POP3属性POP3服务器:(或或)Email地址:shinning191@(ceshi2009ok@、qiufeng006@)账户名:shinning191(ceshi2009ok、qiufeng006)密码:6857191(123456、28912786)SMTP属性SMTP服务器:(或或)Email地址:shinning191@(ceshi2009ok@\qiufeng006@)账户名:shinning191(ceshi2009ok、qiufeng006)密码:6857191(123456、28912786)在对SMTP/POP3进行设置的时候,由于系统的缺陷,需要先对POP3进行属性设置,然后确定关闭该对话框;重新打开属性设置对话框,对SMTP进行属性设置,确定。

这样便可以正确设置完邮件服务器的属性。

此系统对上述设置的信息具有存储功能,在这里,我们采用属性文件的形式存储SMT P 和POP3邮件服务器属性设置。

javaMail邮件接收解析内容及附件及删除邮件

javaMail邮件接收解析内容及附件及删除邮件

javaMail邮件接收解析内容及附件及删除邮件使⽤javaMail获取邮件内容。

⼯具类可直接使⽤。

package com.szy.project.utils;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties;import javax.mail.Address;import javax.mail.BodyPart;import javax.mail.Flags;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Part;import javax.mail.Session;import javax.mail.Store;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import javax.mail.internet.MimeUtility;/*** 邮件接受测试**//*** 使⽤POP3协议接收邮件*/public class POP3ReceiveMailTest {public static void main(String[] args) throws Exception {resceive();}/*** 接收邮件*/public static void resceive() throws Exception { /** * 因为现在使⽤的是163邮箱⽽163的 pop地址是  端⼝是 110 * ⽐如使⽤好未来企业邮箱就需要换成好未来邮箱的 pop服务器地址 和端⼝110 */ String duankou = "110"; // 端⼝号 String servicePath = ""; // 服务器地址// 准备连接服务器的会话信息Properties props = new Properties();props.setProperty("mail.store.protocol", "pop3"); // 使⽤pop3协议props.setProperty("mail.pop3.port", duankou); // 端⼝props.setProperty("mail.pop3.host", servicePath); // pop3服务器// 创建Session实例对象Session session = Session.getInstance(props);Store store = session.getStore("pop3");store.connect("157********@", "***********"); //163邮箱程序登录属于第三⽅登录所以这⾥的密码是163给的授权密码⽽并⾮普通的登录密码// 获得收件箱Folder folder = store.getFolder("INBOX");/* Folder.READ_ONLY:只读权限* Folder.READ_WRITE:可读可写(可以修改邮件的状态)*/folder.open(Folder.READ_WRITE); //打开收件箱// 由于POP3协议⽆法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数System.out.println("未读邮件数: " + folder.getUnreadMessageCount());// 由于POP3协议⽆法获知邮件的状态,所以下⾯得到的结果始终都是为0System.out.println("删除邮件数: " + folder.getDeletedMessageCount());System.out.println("新邮件: " + folder.getNewMessageCount());// 获得收件箱中的邮件总数System.out.println("邮件总数: " + folder.getMessageCount());// 得到收件箱中的所有邮件,并解析Message[] messages = folder.getMessages();parseMessage(messages);//得到收件箱中的所有邮件并且删除邮件deleteMessage(messages);//释放资源folder.close(true);store.close();}/*** 解析邮件* @param messages 要解析的邮件列表*/public static void parseMessage(Message ...messages) throws MessagingException, IOException {if (messages == null || messages.length < 1)throw new MessagingException("未找到要解析的邮件!");// 解析所有邮件for (int i = 0, count = messages.length; i < count; i++) {MimeMessage msg = (MimeMessage) messages[i];System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");System.out.println("主题: " + getSubject(msg));System.out.println("发件⼈: " + getFrom(msg));System.out.println("收件⼈:" + getReceiveAddress(msg, null));System.out.println("发送时间:" + getSentDate(msg, null));System.out.println("是否已读:" + isSeen(msg));System.out.println("邮件优先级:" + getPriority(msg));System.out.println("是否需要回执:" + isReplySign(msg));System.out.println("邮件⼤⼩:" + msg.getSize() * 1024 + "kb");boolean isContainerAttachment = isContainAttachment(msg);System.out.println("是否包含附件:" + isContainerAttachment);if (isContainerAttachment) {saveAttachment(msg, "f:\\mailTest\\"+msg.getSubject() + "_"+i+"_"); //保存附件}StringBuffer content = new StringBuffer(30);getMailTextContent(msg, content);System.out.println("邮件正⽂:" + (content.length() > 100 ? content.substring(0,100) + "..." : content)); System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- "); System.out.println();}}/*** 解析邮件* @param messages 要解析的邮件列表*/public static void deleteMessage(Message ...messages) throws MessagingException, IOException {if (messages == null || messages.length < 1)throw new MessagingException("未找到要解析的邮件!");// 解析所有邮件for (int i = 0, count = messages.length; i < count; i++) {/*** 邮件删除*/Message message = messages[i];String subject = message.getSubject();// set the DELETE flag to truemessage.setFlag(Flags.Flag.DELETED, true);System.out.println("Marked DELETE for message: " + subject);}}/*** 获得邮件主题* @param msg 邮件内容* @return 解码后的邮件主题*/public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException { return MimeUtility.decodeText(msg.getSubject());}/*** 获得邮件发件⼈* @param msg 邮件内容* @return 姓名 <Email地址>* @throws MessagingException* @throws UnsupportedEncodingException*/public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {String from = "";Address[] froms = msg.getFrom();if (froms.length < 1)throw new MessagingException("没有发件⼈!");InternetAddress address = (InternetAddress) froms[0];String person = address.getPersonal();if (person != null) {person = MimeUtility.decodeText(person) + "";} else {person = "";}from = person + "<" + address.getAddress() + ">";return from;}/*** 根据收件⼈类型,获取邮件收件⼈、抄送和密送地址。

java mail详解

java mail详解

java mail详解JavaMail是Java平台上用于发送、接收和管理电子邮件的API。

它提供了一种方便的方式来处理电子邮件,包括发送和接收电子邮件,以及访问和操作邮件服务器。

首先,让我们来看看JavaMail API的一些主要功能和用法。

JavaMail API包括javax.mail包,它提供了发送和接收电子邮件的类和接口。

要发送电子邮件,你需要使用javax.mail.Session类来创建一个会话对象,然后使用javax.mail.internet.MimeMessage类来创建邮件消息。

你可以设置邮件的主题、内容、附件等信息,并使用javax.mail.Transport类的send方法来发送邮件。

另外,JavaMail API也支持接收邮件。

你可以使用javax.mail.Store类来连接到邮件服务器,并使用javax.mail.Folder类来访问邮件文件夹。

通过这些类,你可以检索邮件、读取邮件内容以及执行其他邮件管理操作。

JavaMail API还支持与邮件服务器的安全通信,包括SSL和TLS协议。

你可以使用javax.mail.Session类的属性来配置安全连接参数,以确保与邮件服务器的通信是安全的。

除了基本的发送和接收邮件功能,JavaMail API还提供了一些高级功能,比如处理邮件附件、设置邮件优先级、回复和转发邮件等。

你可以使用javax.mail.internet.MimeBodyPart类来处理邮件附件,使用javax.mail.Flags类来设置邮件标记,以及使用javax.mail.internet.InternetAddress类来表示邮件地址等。

总之,JavaMail API提供了丰富的功能和灵活的接口,使得在Java应用程序中处理电子邮件变得非常方便。

无论是发送简单的文本邮件,还是处理复杂的邮件操作,JavaMail API都能满足你的需求。

希望这些信息能帮助你更好地理解和使用JavaMail API。

SpringBoot中利用JavaMailSender发送邮件的方法示例(附源码)

SpringBoot中利用JavaMailSender发送邮件的方法示例(附源码)

SpringBoot中利⽤JavaMailSender发送邮件的⽅法⽰例(附源码)快速⼊门在Spring Boot的⼯程中的pom.xml中引⼊spring-boot-starter-mail依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>如其他⾃动化配置模块⼀样,在完成了依赖引⼊之后,只需要在application.properties中配置相应的属性内容。

下⾯我们以QQ邮箱为例,在application.properties中加⼊如下配置(注意替换⾃⼰的⽤户名和密码):spring.mail.host=ername=⽤户名spring.mail.password=密码spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=true通过单元测试来实现⼀封简单邮件的发送:@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = Application.class)public class ApplicationTests {@Autowiredprivate JavaMailSender mailSender;@Testpublic void sendSimpleMail() throws Exception {SimpleMailMessage message = new SimpleMailMessage();message.setFrom("dyc87112@");message.setTo("dyc87112@");message.setSubject("主题:简单邮件");message.setText("测试邮件内容");mailSender.send(message);}}到这⾥,⼀个简单的邮件发送就完成了,运⾏⼀下该单元测试,看看效果如何?“由于Spring Boot的starter模块提供了⾃动化配置,所以在引⼊了spring-boot-starter-mail依赖之后,会根据配置⽂件中的内容去创建JavaMailSender实例,因此我们可以直接在需要使⽤的地⽅直接@Autowired来引⼊邮件发送对象。

javaemail发送邮件(带附件)

javaemail发送邮件(带附件)

package com.send.email;import javax.mail.*;import javax.mail.internet.*;import java.util.*;import javax.activation.*;public class SendMail2 {private String host = ""; //smtp服务器private String from = ""; //发件人地址private String to = ""; //收件人地址private String affix = ""; //附件地址private String affixName = ""; //附件名称private String user = ""; //用户名private String pwd = ""; //密码private String subject = ""; //邮件标题public void setAddress(String from,String to,String subject){ this.from = from;this.to = to;this.subject = subject;}public void setAffix(String affix,String affixName){this.affix = affix;this.affixName = affixName;}public void send(String host,String user,String pwd) { this.host = host;er = user;this.pwd = pwd;Properties props = new Properties();//设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)props.put("mail.smtp.host", host);//需要经过授权,也就是有户名和密码的校验,这样才能通过验证props.put("mail.smtp.auth", "true");//用刚刚设置好的props对象构建一个sessionSession session = Session.getDefaultInstance(props);//有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使//用(你可以在控制台(console)上看到发送邮件的过程)session.setDebug(true);//用session为参数定义消息对象MimeMessage message = new MimeMessage(session);try{//加载发件人地址message.setFrom(new InternetAddress(from));//加载收件人地址message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//加载标题message.setSubject(subject);// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件Multipart multipart = new MimeMultipart();//设置邮件的文本内容BodyPart contentPart = new MimeBodyPart();contentPart.setText("第二种方法···");multipart.addBodyPart(contentPart);//添加附件BodyPart messageBodyPart= new MimeBodyPart();DataSource source = new FileDataSource(affix);//添加附件的内容messageBodyPart.setDataHandler(new DataHandler(source));//添加附件的标题//这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();messageBodyPart.setFileName("=?GBK?B?"+enc.encode(affixName.getBytes())+"?=");multipart.addBodyPart(messageBodyPart);//将multipart对象放到message中message.setContent(multipart);//保存邮件message.saveChanges();// 发送邮件Transport transport = session.getTransport("smtp");//连接服务器的邮箱transport.connect(host, user, pwd);//把邮件发送出去transport.sendMessage(message, message.getAllRecipients());transport.close();}catch(Exception e){e.printStackTrace();}}public static void main(String[] args){SendMail2 cn = new SendMail2();//设置发件人地址、收件人地址和邮件标题cn.setAddress("发件人地址","收件人的地址","一个带附件的JavaMail邮件(标题)"); //设置要发送附件的位置和标题cn.setAffix("附件的路径","文件名称");//设置smtp服务器以及邮箱的帐号和密码cn.send("","邮箱账号","密码");}}。

javaemail发送邮件(带附件)

javaemail发送邮件(带附件)

private void getMailSet(){this.from = IConstants.MAIL_FROM;senderImpl = new JavaMailSenderImpl();senderImpl.setHost(IConstants.MAIL_HOST.trim());senderImpl.setUsername(IConstants.MAIL_USERNAME.trim());senderImpl.setPassword(IConstants.MAIL_PASSWORD.trim());Properties javaMailProperties = new Properties();javaMailProperties.put("mail.smtp.auth", "true");javaMailProperties.put("mail.smtp.timeout", "25000");senderImpl.setJavaMailProperties(javaMailProperties);}public void sendAffixMail(final String pdfUrl,final String pdfname,final String userEmail,final String username){taskExecutor.execute(new Runnable() {public void run() {try{getMailSet();seAffixMail(pdfUrl,pdfname,userEmail,username);}catch (Exception e) {e.printStackTrace();}}});}//发送附件public void seAffixMail(String pdfUrl,String pdfname,String userEmail,String username) throws MessagingException{try{//javaMail方式Mail mail = new Mail();mail.setSmtpServer(IConstants.MAIL_HOST.trim());//服务器mail.setUserName(IConstants.MAIL_USERNAME.trim());//账户mail.setPassword(IConstants.MAIL_PASSWORD.trim());//密码mail.setFrom(IConstants.MAIL_FROM.trim());//发件人账户mail.setDisplayName(IConstants.NICK);//显示发件人别名,如:楷誉金融<xxyin_vip@>mail.setTo(userEmail);//收件人mail.setIfAuth(true);//开启发送账户验证mail.addAttachfile(pdfUrl.trim());//添加附件mail.setSubject("电子协议"); //主题mail.setContent("尊敬的用户:"+username+"您投资借款成功,收到电子协议,请查收!");//内容HashMap map = mail.send();System.out.println("================="+map);}catch (Exception e) {e.printStackTrace();System.out.println("附件发送失败!");}}public class Mail {//定义发件人、收件人、SMTP服务器、用户名、密码、主题、内容等private String displayName;private String to;private String from;private String smtpServer;private String username;private String password;private String subject;private String content;private boolean ifAuth; //服务器是否要身份认证private String filename="";private Vector file = new Vector(); //用于保存发送附件的文件名的集合/*** 设置SMTP服务器地址*/public void setSmtpServer(String smtpServer){this.smtpServer=smtpServer;}/*** 设置发件人的地址*/public void setFrom(String from){this.from=from;}/*** 设置显示的名称*/public void setDisplayName(String displayName){this.displayName=displayName;}/*** 设置服务器是否需要身份认证*/public void setIfAuth(boolean ifAuth){ this.ifAuth=ifAuth;}/*** 设置E-mail用户名*/public void setUserName(String username){ ername=username;}/*** 设置E-mail密码*/public void setPassword(String password){ this.password=password;}/*** 设置接收者*/public void setTo(String to){this.to=to;}/*** 设置主题*/public void setSubject(String subject){ this.subject=subject;}/*** 设置主体内容*/public void setContent(String content){ this.content=content;}/*** 该方法用于收集附件名*/public void addAttachfile(String fname){file.addElement(fname);}//空构造器public Mail(){}/*** 初始化SMTP服务器地址、发送者E-mail地址、用户名、密码、接收者、主题、内容*/public Mail(String smtpServer,String from,String displayName,String username,String password,String to,String subject,String content){this.smtpServer=smtpServer;this.from=from;this.displayName=displayName;this.ifAuth=true;ername=username;this.password=password;this.to=to;this.subject=subject;this.content=content;}/*** 初始化SMTP服务器地址、发送者E-mail地址、接收者、主题、内容*/public Mail(String smtpServer,String from,String displayName,String to,String subject,String content){this.smtpServer=smtpServer;this.from=from;this.displayName=displayName;this.ifAuth=false;this.to=to;this.subject=subject;this.content=content;}/*** 发送邮件*/public HashMap send(){HashMap map=new HashMap();map.put("state", "success");String message="邮件发送成功!";Session session=null;Properties props = System.getProperties();props.put("mail.smtp.host", smtpServer);if(ifAuth){ //服务器需要身份认证props.put("mail.smtp.auth","true");SmtpAuth smtpAuth=new SmtpAuth(username,password);session=Session.getDefaultInstance(props, smtpAuth);}else{props.put("mail.smtp.auth","false");session=Session.getDefaultInstance(props, null);}//session.setDebug(true);Transport trans = null;try {Message msg = new MimeMessage(session);try{Address from_address = new InternetAddress(from, displayName);msg.setFrom(from_address);}catch(java.io.UnsupportedEncodingException e){e.printStackTrace();}InternetAddress[] address={new InternetAddress(to)};msg.setRecipients(Message.RecipientType.TO,address);msg.setSubject(subject);Multipart mp = new MimeMultipart();MimeBodyPart mbp = new MimeBodyPart();mbp.setContent(content.toString(),"text/html;charset=gb2312");mp.addBodyPart(mbp);if(!file.isEmpty()){//有附件Enumeration efile=file.elements();while(efile.hasMoreElements()){mbp=new MimeBodyPart();filename=efile.nextElement().toString(); //选择出每一个附件名FileDataSource fds=newFileDataSource(filename); //得到数据源mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPartmbp.setFileName(fds.getName()); //得到文件名同样至入BodyPartmp.addBodyPart(mbp);}file.removeAllElements();}msg.setContent(mp); //Multipart加入到信件msg.setSentDate(new Date()); //设置信件头的发送日期//发送信件msg.saveChanges();trans = session.getTransport("smtp");trans.connect(smtpServer, username, password);trans.sendMessage(msg, msg.getAllRecipients());trans.close();}catch(AuthenticationFailedException e){map.put("state", "failed");message="邮件发送失败!错误原因:\n"+"身份验证错误!";e.printStackTrace();}catch (MessagingException e) {message="邮件发送失败!错误原因:\n"+e.getMessage();map.put("state", "failed");e.printStackTrace();Exception ex = null;if ((ex = e.getNextException()) != null) { System.out.println(ex.toString());ex.printStackTrace();}}//System.out.println("\n提示信息:"+message);map.put("message", message);return map;}}。

java利用springJavaMailSenderImpl发送邮件,支持普通文本、附件、。。。

java利用springJavaMailSenderImpl发送邮件,支持普通文本、附件、。。。

java利⽤springJavaMailSenderImpl发送邮件,⽀持普通⽂本、附件、。

博客分类:本⽂主要介绍利⽤发送邮件。

⾸先介绍了发送⼀般邮件,然后介绍了发送富⽂本(html)邮件及以velocity为模板发送邮件。

邮件发送分为为三步:创建邮件发送器、编写邮件、发送邮件。

Spring的提供了强⼤的邮件发送功能,可发送普通⽂本邮件、带附件邮件、html格式邮件、带图⽚邮件、设置发送内容编码格式、设置发送⼈的显⽰名称。

下⾯就进⾏介绍,⽰例代码中很多都是字符串硬编码,实际使⽤时推荐使⽤spring的配置⽂件进⾏配置。

1、创建邮件发送器⾸先定义对象,并对其进⾏smtp相关信息设置,相当于我们⾃⼰的邮箱,如下:Java代码1. JavaMailSenderImpl mailSender = new JavaMailSenderImpl();2. mailSender.setHost("");3. mailSender.setUsername("mosaic@");4. mailSender.setPassword("asterisks");JavaMailSenderImpl mailSender = new JavaMailSenderImpl();mailSender.setHost("");mailSender.setUsername("mosaic@");mailSender.setPassword("asterisks");当然更好的⽅法是使⽤配置⽂件进⾏配置,这⾥只是进⾏介绍,忽略硬编码先。

以上主机为邮箱服务商的smtp地址,⽤户名、密码为⽤户⾃⼰的邮箱。

除以上外还可以设置setPort(int port) 、setProtocol(String protocol) 等,可暂时不考虑。

JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

JavaWeb学习总结(五⼗⼆)——使⽤JavaMail创建邮件和发送邮件⼀、RFC882⽂档简单说明 RFC882⽂档规定了如何编写⼀封简单的邮件(纯⽂本邮件),⼀封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使⽤空⾏分隔。

邮件头包含的内容有:1. from字段 --⽤于指明发件⼈2. to字段 --⽤于指明收件⼈3. subject字段 --⽤于说明邮件主题4. cc字段 -- 抄送,将邮件发送给收件⼈的同时抄送给另⼀个收件⼈,收件⼈可以看到邮件抄送给了谁5. bcc字段 -- 密送,将邮件发送给收件⼈的同时将邮件秘密发送给另⼀个收件⼈,收件⼈⽆法看到邮件密送给了谁 邮件体指的就是邮件的具体内容。

⼆、MIME协议简单介绍 在我们的实际开发当中,⼀封邮件既可能包含图⽚,⼜可能包含有附件,在这样的情况下,RFC882⽂档规定的邮件格式就⽆法满⾜要求了。

MIME协议是对RFC822⽂档的升级和补充,它描述了如何⽣产⼀封复杂的邮件。

通常我们把MIME协议描述的邮件称之为MIME邮件。

MIME协议描述的数据称之为MIME消息。

对于⼀封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使⽤分隔线对多段数据进⾏分隔,并使⽤Content-Type头字段对数据的类型、以及多个数据之间的关系进⾏描述。

三、使⽤JavaMail创建邮件和发送邮件 JavaMail创建的邮件是基于MIME协议的。

因此可以使⽤JavaMail创建出包含图⽚,包含附件的复杂邮件。

3.1、JavaMail API的简单介绍3.2、创建邮件发送测试项⽬3.3、发送⼀封只包含⽂本的简单邮件1package me.gacl.main;23import java.util.Properties;4import javax.mail.Message;5import javax.mail.Session;6import javax.mail.Transport;7import javax.mail.internet.InternetAddress;8import javax.mail.internet.MimeMessage;910/**11* @ClassName: Sendmail12* @Description: 发送Email13* @author: 孤傲苍狼14* @date: 2015-1-12 下午9:42:5615*16*/17public class Sendmail {1819/**20 * @param args21 * @throws Exception22*/23public static void main(String[] args) throws Exception {2425 Properties prop = new Properties();26 prop.setProperty("mail.host", "");27 prop.setProperty("mail.transport.protocol", "smtp");28 prop.setProperty("mail.smtp.auth", "true");29//使⽤JavaMail发送邮件的5个步骤30//1、创建session31 Session session = Session.getInstance(prop);32//开启Session的debug模式,这样就可以查看到程序发送Email的运⾏状态33 session.setDebug(true);34//2、通过session得到transport对象35 Transport ts = session.getTransport();36//3、使⽤邮箱的⽤户名和密码连上邮件服务器,发送邮件时,发件⼈需要提交邮箱的⽤户名和密码给smtp服务器,⽤户名和密码都通过验证之后才能够正常发送邮件给收件⼈。

Java实现读取163邮箱,qq邮箱的邮件内容

Java实现读取163邮箱,qq邮箱的邮件内容

Java实现读取163邮箱,qq邮箱的邮件内容通过使⽤java mail来实现读取163邮箱,qq邮箱的邮件内容。

1.代码实现创建springboot项⽬,引⼊依赖包<!--mail--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>实现类import com.sun.mail.imap.IMAPFolder;import com.sun.mail.imap.protocol.IMAPProtocol;import org.apache.tomcat.util.http.fileupload.IOUtils;import org.springframework.util.ObjectUtils;import javax.mail.*;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeUtility;import java.io.*;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.*;public class ShowMail {public static String NORM_DATETIME_PATTERN = "yyyy-MM-dd hh:mm:ss";private MimeMessage mimeMessage;/*** 附件下载后的存放⽬录*/private String saveAttachPath = "";/*** 存放邮件内容的StringBuffer对象*/private StringBuffer bodyText = new StringBuffer();/*** 构造函数,初始化⼀个MimeMessage对象** @param mimeMessage*/public ShowMail(MimeMessage mimeMessage) {this.mimeMessage = mimeMessage;}/*** 获得发件⼈的地址和姓名** @return* @throws MessagingException*/public String getFrom() throws MessagingException {InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();String from = address[0].getAddress();if (from == null) {from = "";}String personal = address[0].getPersonal();if (personal == null) {personal = "";}String fromAddr = null;if (personal != null || from != null) {fromAddr = personal + "<" + from + ">";}return fromAddr;}/*** 获得邮件的收件⼈,抄送,和密送的地址和姓名,根据所传递的参数的不同** @param type "to"----收件⼈ "cc"---抄送⼈地址 "bcc"---密送⼈地址* @return* @throws MessagingException* @throws UnsupportedEncodingException*/public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException { if (ObjectUtils.isEmpty(type)) {return "";}String addType = type.toUpperCase();if (!addType.equals("TO") && !addType.equals("CC") && !addType.equals("BCC")) {return "";}InternetAddress[] address;if (addType.equals("TO")) {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.TO);} else if (addType.equals("CC")) {address = (InternetAddress[]) mimeMessage.getRecipients();} else {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.BCC);}if (ObjectUtils.isEmpty(address)) {return "";}StringBuilder mailAddr = new StringBuilder();String emailAddr;String personal;for (int i = 0; i < address.length; i++) {emailAddr = address[i].getAddress();if (emailAddr == null) {emailAddr = "";} else {emailAddr = MimeUtility.decodeText(emailAddr);}personal = address[i].getPersonal();if (personal == null) {personal = "";} else {personal = MimeUtility.decodeText(personal);}mailAddr.append(",").append(personal).append("<").append(emailAddr).append(">");}return mailAddr.toString().substring(1);}/*** 获得邮件主题** @return* @throws MessagingException* @throws UnsupportedEncodingException*/public String getSubject() throws MessagingException, UnsupportedEncodingException {String subject = MimeUtility.decodeText(mimeMessage.getSubject());if (subject == null) {subject = "";}return subject;}/*** 获得邮件发送⽇期** @return* @throws MessagingException*/public String getSentDate() throws MessagingException {Date sentDate = mimeMessage.getSentDate();SimpleDateFormat format = new SimpleDateFormat(NORM_DATETIME_PATTERN);return format.format(sentDate);}/*** 获得邮件正⽂内容** @return*/public String getBodyText() {return bodyText.toString();}/*** 解析邮件,把得到的邮件内容保存到⼀个StringBuffer对象中,解析邮件* 主要是根据MimeType类型的不同执⾏不同的操作,⼀步⼀步的解析* @param part* @throws MessagingException* @throws IOException*/public void getMailContent(Part part) throws MessagingException, IOException {String contentType = part.getContentType();int nameIndex = contentType.indexOf("name");boolean conName = false;if (nameIndex != -1) {conName = true;}if (part.isMimeType("text/plain") && conName == false) {bodyText.append((String) part.getContent());} else if (part.isMimeType("text/html") && conName == false) {bodyText.append((String) part.getContent());} else if (part.isMimeType("multipart/*")) {Multipart multipart = (Multipart) part.getContent();int counts = multipart.getCount();for (int i = 0; i < counts; i++) {this.getMailContent(multipart.getBodyPart(i));}} else if (part.isMimeType("message/rfc822")) {this.getMailContent((Part) part.getContent());}}/*** 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"** @return* @throws MessagingException*/public boolean getReplySign() throws MessagingException {boolean replySign = false;String needReply[] = mimeMessage.getHeader("Disposition-Notification-To");if (needReply != null) {replySign = true;}return replySign;}/*** 判断此邮件是否已读,如果未读返回false,反之返回true** @return* @throws MessagingException*/public boolean isNew() throws MessagingException {boolean isNew = false;Flags flags = mimeMessage.getFlags();Flags.Flag[] flag = flags.getSystemFlags();for (int i = 0; i < flag.length; i++) {if (flag[i] == Flags.Flag.SEEN) {isNew = true;}}return isNew;}/*** 判断此邮件是否包含附件** @param part* @return* @throws MessagingException* @throws IOException*/public boolean isContainAttach(Part part) throws MessagingException, IOException { boolean attachFlag = false;if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();BodyPart mPart;String conType;for (int i = 0; i < mp.getCount(); i++) {mPart = mp.getBodyPart(i);String disposition = mPart.getDisposition();if (Part.ATTACHMENT.equals(disposition) || Part.INLINE.equals(disposition)) {} else if (mPart.isMimeType("multipart/*")) {attachFlag = this.isContainAttach(mPart);} else {conType = mPart.getContentType();if (conType.toLowerCase().indexOf("application") != -1 || conType.toLowerCase().indexOf("name") != -1){ attachFlag = true;}}}} else if (part.isMimeType("message/rfc822")) {attachFlag = isContainAttach((Part) part.getContent());}return attachFlag;}/*** 保存附件** @param part* @throws MessagingException* @throws IOException*/public void saveAttachMent(Part part) throws MessagingException, IOException {String fileName;if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();BodyPart mPart;for (int i = 0; i < mp.getCount(); i++) {mPart = mp.getBodyPart(i);String disposition = mPart.getDisposition();if (Part.ATTACHMENT.equals(disposition) || Part.INLINE.equals(disposition)) {fileName = mPart.getFileName();if (null != fileName && fileName.toLowerCase().indexOf("gb2312") != -1) {fileName = MimeUtility.decodeText(fileName);}this.saveFile(fileName, mPart.getInputStream());} else if (mPart.isMimeType("multipart/*")) {this.saveAttachMent(mPart);} else {fileName = mPart.getFileName();if ((fileName != null) && (fileName.toLowerCase().indexOf("GB2312") != -1)) {fileName = MimeUtility.decodeText(fileName);this.saveFile(fileName, mPart.getInputStream());}}}} else if (part.isMimeType("message/rfc822")) {this.saveAttachMent((Part) part.getContent());}}/*** 设置附件存放路径** @param attachPath*/public void setAttachPath(String attachPath) {this.saveAttachPath = attachPath;}/*** 获得附件存放路径** @return*/public String getAttachPath() {return saveAttachPath;}/*** 真正的保存附件到指定⽬录⾥** @param fileName* @param in* @throws IOException*/private void saveFile(String fileName, InputStream in) throws IOException {String osName = System.getProperty("");String storeDir = this.getAttachPath();if (null == osName) {osName = "";}if (osName.toLowerCase().indexOf("win") != -1) {if (ObjectUtils.isEmpty(storeDir))} else {storeDir = "/tmp";}// fileName=fileName.replace("=?", "");// fileName=fileName.replace("?=", "");// fileName = fileName.substring(fileName.length() - 6, fileName.length());FileOutputStream fos = new FileOutputStream(new File(storeDir + File.separator + fileName));IOUtils.copy(in, fos);IOUtils.closeQuietly(fos);IOUtils.closeQuietly(in);}/*** 获取163邮箱信息** @param host* @param username* @param password* @param protocol* @return* @throws MessagingException*/public static Message[] getWEMessage(String host, String username, String password, String protocol) throws MessagingException { //创建属性对象Properties props = System.getProperties();props.setProperty("mail.store.protocol", protocol);//创建会话Session session = Session.getDefaultInstance(props, null);//存储对象Store store = session.getStore(protocol);//连接store.connect(host, username, password);//创建⽬录对象Folder folder = store.getFolder("INBOX");if (folder instanceof IMAPFolder) {IMAPFolder imapFolder = (IMAPFolder)folder;//javamail中使⽤id命令有校验checkOpened, 所以要去掉id⽅法中的checkOpened();imapFolder.doCommand(new IMAPFolder.ProtocolCommand() {public Object doCommand(IMAPProtocol p) throws com.sun.mail.iap.ProtocolException {p.id("FUTONG");return null;}});}if(folder != null) {folder.open(Folder.READ_WRITE);}return folder.getMessages();}/*** 获取qq邮箱信息** @param host* @param username* @param password* @param protocol* @return* @throws MessagingException*/public static Message[] getQQMessage(String host, String username, String password, String protocol) throws MessagingException { //创建属性对象Properties props = new Properties();props.put("mail.store.protocol", protocol);//创建会话Session session = Session.getDefaultInstance(props, null);//存储对象Store store = session.getStore(protocol);//连接store.connect(host,username,password);//创建⽬录对象Folder folder = store.getFolder("Inbox");if(folder != null) {folder.open(Folder.READ_WRITE);}return folder.getMessages();}/*** 过滤邮箱信息** @param messages* @param fromMail 只读取该邮箱发来的邮件,如果为空则不过滤* @param startDate 只读取该⽇期以后的邮件,如果为空则不过滤* @return* @throws MessagingException*/public static List<Message> filterMessage(Message[] messages, String fromMail, String startDate) throws MessagingException, ParseException {List<Message> messageList = new ArrayList<>();if (ObjectUtils.isEmpty(messages)) {return messageList;}boolean isEnptyFromMail = ObjectUtils.isEmpty(fromMail);boolean isEnptyStartDate = ObjectUtils.isEmpty(startDate);if (isEnptyFromMail && isEnptyStartDate) {return Arrays.asList(messages);}String from;for (Message message: messages) {from = null;if(message.getFrom() != null) {from = (message.getFrom()[0]).toString();}if (isEnptyFromMail) {if (message.getSentDate() != null && new SimpleDateFormat(NORM_DATETIME_PATTERN).parse(startDate).getTime() > message.getSentDate().getTime()) { continue;}} else if (null != from && from.contains(fromMail)) {if (!isEnptyStartDate && new SimpleDateFormat(NORM_DATETIME_PATTERN).parse(startDate).getTime() > message.getSentDate().getTime()) {continue;}} else {continue;}messageList.add(message);}return messageList;}/*** 打印邮件** @param messageList* @throws IOException* @throws MessagingException*/public static void printMailMessage(List<Message> messageList) throws IOException, MessagingException {System.out.println("邮件数量:" + messageList.size());ShowMail re;Message message;for (int i = 0, leng = messageList.size(); i < leng; i++) {message = messageList.get(i);re = new ShowMail((MimeMessage) message);System.out.println("邮件【" + i + "】主题:" + re.getSubject());System.out.println("邮件【" + i + "】发送时间:" + re.getSentDate());System.out.println("邮件【" + i + "】是否需要回复:" + re.getReplySign());System.out.println("邮件【" + i + "】是否已读:" + re.isNew());System.out.println("邮件【" + i + "】是否包含附件:" + re.isContainAttach( message));System.out.println("邮件【" + i + "】发送⼈地址:" + re.getFrom());System.out.println("邮件【" + i + "】收信⼈地址:" + re.getMailAddress("to"));System.out.println("邮件【" + i + "】抄送:" + re.getMailAddress("cc"));System.out.println("邮件【" + i + "】暗抄:" + re.getMailAddress("bcc"));System.out.println("邮件【" + i + "】发送时间:" + re.getSentDate());System.out.println("邮件【" + i + "】邮件ID:" + ((MimeMessage) message).getMessageID());re.getMailContent(message);System.out.println("邮件【" + i + "】正⽂内容:\r\n" + re.getBodyText());re.setAttachPath("D:\\Download\\mailFile\\");re.saveAttachMent(message);}}public static void main(String[] args) throws MessagingException, IOException, ParseException {//163登录信息//邮件服务器String host = "";//邮箱账号String username = "xx";//授权码String password = "yy";//协议String protocol = "imaps";//只读取该邮箱发来的邮件String fromMail = null;//只读取该⽇期以后的邮件String startDate = null;List<Message> messageList = filterMessage(getWEMessage(host, username, password, protocol), fromMail, startDate);printMailMessage(messageList);String host2 = "";String username2 = "xx";String password2 = "yy";// String protocol2 = "imaps";String protocol2 = "pop3";String fromMail2 = null;String startDate2 = null;List<Message> messageList2 = filterMessage(getQQMessage(host2, username2, password2, protocol2), fromMail2, startDate2); printMailMessage(messageList2);}}2.配置授权码163邮箱:qq邮箱:3.实现效果:运⾏main⽅法,查看控制台:邮件数量:xx邮件【0】主题:欢迎您使⽤xx邮箱!邮件【0】发送时间:xx邮件【0】是否需要回复:false邮件【0】是否已读:true邮件【0】是否包含附件:false邮件【0】发送⼈地址:xx邮件【0】收信⼈地址:xx邮件【0】抄送:邮件【0】暗抄:邮件【0】发送时间:xx邮件【0】邮件ID:xx邮件【0】正⽂内容:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>欢迎使⽤</title><style>body, div, p, img {padding: 0;margin: 0;font-family: 'Microsoft Yahei', "PingFang SC", "Hiragino Sans GB", "wenquanyi micro hei", Arial, Helvetica, "STHeiti", sans-serif; }.contain {width: 700px;margin: 0 auto;font-size: 0;}.wrap {position: relative;}.wrap .welcome {position: absolute;width: 290px;left: 75px;top: 100px;font-size: 18px;color: #fff;line-height: 32px;font-weight: 500;}.wrap .welcome p.indentation {font-size: 16px;font-weight: normal;}.wrap a {position: absolute;display: block;width: 104px;height: 39px;}.wrap a.mobile{left: 501px;top: 434px;}left: 501px;top: 485px;}</style></head><body><div class="contain"><div class="wrap"><div class="welcome"><p class="indentation-title">尊敬的xx:</p><p class="indentation">您好,您的邮箱已开通。

java中javamail收发邮件实现方法

java中javamail收发邮件实现方法

java中javamail收发邮件实现⽅法概述1、邮件相关的标准⼚商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:SMTP(Simple Mail Transfer Protocol) :即简单邮件传输协议,它是⼀组⽤于由源地址到⽬的地址传送邮件的规则,由它来控制信件的中转⽅式。

POP3(Post Office Protocol – Version 3) :即邮局协议版本 3 ,⽤于接收电⼦邮件的标准协议。

IMAP(Internet Mail Access Protocol) :即 Internet 邮件访问协议。

是 POP3 的替代协议。

这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS , POP3S 和 IMAPS 。

MIME(Multipurpose Internet Mail Extensions) :即多⽤途因特⽹邮件扩展标准。

它不是邮件传输协议。

但对传输内容的消息、附件及其它的内容定义了格式。

2、JavaMail 简介JavaMail 是由 Sun 发布的⽤来处理 email 的 API 。

它并没有包含在 Java SE 中,⽽是作为 Java EE 的⼀部分。

mail.jar :此 JAR ⽂件包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服务提供程序;activation.jar :此 JAR ⽂件包含 JAF API 和 Sun 的实现。

JavaMail 包中⽤于处理电⼦邮件的核⼼类是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。

3、邮件传输过程如上图,电⼦邮件的处理步骤如下:创建⼀个 Session 对象。

Session 对象创建⼀个 Transport 对象 /Store 对象,⽤来发送 / 保存邮件。

javaMail发送邮件(图片,附件)

javaMail发送邮件(图片,附件)

Java类库中是带有javamail的!所有不需要再下载。

1)运行例子时会出现:Exception in thread "main" ng.NoClassDefFoundError: com/sun/mail/util/LineOutputStream这样的错误,原因是版本不兼容,后来我没有用java ee 5.0而是用j2ee1.4.自己导入mail.jar包就没有出现错误。

2)运行完书本的例子(文本,包含有图片,附件。

另外图片是分为两种,一是引用外部资源,二是嵌入内部)。

对其有个大概的了解。

下面给个完整的例子,包含有图片和附件的。

public class ComplexMessage {/***@param args*@throws MessagingException*@throws AddressException*@throws IOException*@throws FileNotFoundException*/public static void main(String[] args) throws AddressException,MessagingException, FileNotFoundException, IOException{// TODO Auto-generated method stubSession session = Session.getDefaultInstance(new Properties()); // 设置发送邮件的客户端服务器端环境MimeMessage message=createMessage( session);message.writeTo(new FileOutputStream("d:\\test3.eml"));}public static MimeMessage createMessage(Session session) throws AddressException, MessagingException{String from = "4054702459047@";String to = "4074505429047@";String subject = "test";String data = "<FONT face=宋体color=#0909f7 size=7><SPAN style='ACKGROUND-COLOR: #6911ee'><SPAN style='BACKGROUND-COLOR: #000000'><SPAN style='BACKGROUND-COLOR: #000000'><SPAN style='BACKGROUND-COLOR: #ffffff'><EM>华南理工大学</EM> </SPAN></SPAN></SPAN></SPAN></FONT>"+"<img src='cid:test1.jpg'>";Message message = new MimeMessage(session);// 创建MimeMessage实例对象message.setFrom(new InternetAddress(from));message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));message.setSentDate(new Date());message.setSubject(subject);MimeBodyPart contentPart=createContent(data,"d:\\test.jpg");MimeBodyPart attachPart1=createAttachment("d:\\xml.xml");MimeBodyPart attachPart2=createAttachment("d:\\report13.jasper");MimeMultipart multipart=new MimeMultipart("mixed");multipart.addBodyPart(contentPart);multipart.addBodyPart(attachPart1);multipart.addBodyPart(attachPart2);//这里MimeMessage是由MIME对象的消息头和MimeMultipart组成,而MimeMultipart可由//MimeBodyPart 组成。

javamail发送文本邮件、HTML邮件及带附件邮件

javamail发送文本邮件、HTML邮件及带附件邮件

javamail发送文本邮件、HTML邮件及带附件邮件MailInfo.java[java] view plain copy1.import java.util.Properties;2.3.public class MailInfo {4.private String mailServerHost;// 服务器ip5.private String mailServerPort;// 端口6.private String fromAddress;// 发送者的邮件地址7.private String toAddress;// 邮件接收者地址8.private String username;// 登录邮件发送服务器的用户名9.private String password;// 登录邮件发送服务器的密码10.private boolean validate = false;// 是否需要身份验证11.private String subject;// 邮件主题12.private String content;// 邮件内容13.private String[] attachFileNames;// 附件名称14.15.public Properties getProperties() {16.Properties p = new Properties();17.p.put("mail.smtp.host", this.mailServerHost);18.p.put("mail.smtp.port", this.mailServerPort);19.p.put("mail.smtp.auth", validate ? "true" : "false");20.return p;21.}22.23.public String getMailServerHost() {24.return mailServerHost;25.}26.27.public void setMailServerHost(String mailServerHost) {28.this.mailServerHost = mailServerHost;29.}30.31.public String getMailServerPort() {32.return mailServerPort;33.}34.35.public void setMailServerPort(String mailServerPort) {36.this.mailServerPort = mailServerPort;37.}38.39.public String getFromAddress() {40.return fromAddress;41.}42.43.public void setFromAddress(String fromAddress) {44.this.fromAddress = fromAddress;45.}46.47.public String getToAddress() {48.return toAddress;49.}50.51.public void setToAddress(String toAddress) {52.this.toAddress = toAddress;53.}54.55.public String getUsername() {56.return username;57.}58.59.public void setUsername(String username) {ername = username;61.}62.63.public String getPassword() {64.return password;65.}66.67.public void setPassword(String password) {68.this.password = password;69.}70.71.public boolean isValidate() {72.return validate;73.}74.75.public void setValidate(boolean validate) {76.this.validate = validate;77.}78.79.public String getSubject() {80.return subject;81.}82.83.public void setSubject(String subject) {84.this.subject = subject;85.}86.87.public String getContent() {88.return content;89.}90.91.public void setContent(String content) {92.this.content = content;93.}94.95.public String[] getAttachFileNames() {96.return attachFileNames;97.}98.99.public void setAttachFileNames(String[] attachFileNa mes) {100.this.attachFileNames = attachFileNames;101.}102.103.}MyAuthenticator.Java[java] view plain copy1.import javax.mail.Authenticator;2.import javax.mail.PasswordAuthentication;3.4.public class MyAuthenticator extends Authenticator {5.private String username = null;6.private String password = null;7.8.public MyAuthenticator() {9.};10.11.public MyAuthenticator(String username, String pass word) {ername = username;13.this.password = password;14.}15.16.protected PasswordAuthentication getPasswordAuthe ntication() {17.return new PasswordAuthentication(username, passw ord);18.}19.20.}SimpleMail.java[java] view plain copy1.import java.io.File;2.import java.util.Date;3.import java.util.Properties;4.5.import javax.activation.DataHandler;6.import javax.activation.FileDataSource;7.import javax.mail.Address;8.import javax.mail.Message;9.import javax.mail.Multipart;10.import javax.mail.Session;11.import javax.mail.Transport;12.import javax.mail.internet.InternetAddress;13.import javax.mail.internet.MimeBodyPart;14.import javax.mail.internet.MimeMessage;15.import javax.mail.internet.MimeMultipart;16.17.public class SimpleMail {18.19.// 以文本格式发送邮件20.public static boolean sendTextMail(MailInfo mailInfo) {21.//判断是否需要身份认证22.MyAuthenticator authenticator = null;23.Properties properties = mailInfo.getProperties();24.if (mailInfo.isValidate()) {25.//如果需要身份认证,则创建一个密码验证器26.authenticator = new MyAuthenticator(mailInfo.getUse rname(), mailInfo.getPassword());27.}28.29.//根据邮件会话属性和密码验证器构造一个发送邮件的session30.Session sendMailSession = Session.getDefaultInstance (properties, authenticator);31.try {32.Message mailMessage = new MimeMessage(sendMai lSession);//根据session创建一个邮件消息33.Address from = new InternetAddress(mailInfo.getFro mAddress());//创建邮件发送者地址34.mailMessage.setFrom(from);//设置邮件消息的发送者35.Address to = new InternetAddress(mailInfo.getT oAddress());//创建邮件的接收者地址36.mailMessage.setRecipient(Message.RecipientType.TO, to);//设置邮件消息的接收者37.mailMessage.setSubject(mailInfo.getSubject());//设置邮件消息的主题38.mailMessage.setSentDate(new Date());//设置邮件消息发送的时间39.//mailMessage.setText(mailInfo.getContent());//设置邮件消息的主要内容40.41.//MimeMultipart类是一个容器类,包含MimeBodyPart 类型的对象42.Multipart mainPart = new MimeMultipart();43.MimeBodyPart messageBodyPart = new MimeBodyPa rt();//创建一个包含附件内容的MimeBodyPart44.//设置HTML内容45.messageBodyPart.setContent(mailInfo.getContent(),"t ext/html; charset=utf-8");46.mainPart.addBodyPart(messageBodyPart);47.48.//存在附件49.String[] filePaths = mailInfo.getAttachFileNames();50.if (filePaths != null && filePaths.length > 0) {51.for(String filePath:filePaths){52.messageBodyPart = new MimeBodyPart();53.File file = new File(filePath);54.if(file.exists()){//附件存在磁盘中55.FileDataSource fds = new FileDataSource(file);//得到数据源56.messageBodyPart.setDataHandler(new DataHandler(fds));//得到附件本身并至入BodyPart57.messageBodyPart.setFileName(file.getName());//得到文件名同样至入BodyPart58.mainPart.addBodyPart(messageBodyPart);59.}60.}61.}62.63.//将MimeMultipart对象设置为邮件内容64.mailMessage.setContent(mainPart);65.Transport.send(mailMessage);//发送邮件66.return true;67.} catch (Exception e) {68. e.printStackTrace();69.}70.return false;71.}72.73.// 以HTML格式发送邮件74.public static boolean sendHtmlMail(MailInfo mailInfo ) {75.//判断是否需要身份认证76.MyAuthenticator authenticator = null;77.Properties properties = mailInfo.getProperties();78.if (mailInfo.isValidate()) {79.// 如果需要身份认证,则创建一个密码验证器80.authenticator = new MyAuthenticator(mailInfo.getUse rname(), mailInfo.getPassword());81.}82.83.// 根据邮件会话属性和密码验证器构造一个发送邮件的session84.Session sendMailSession = Session.getDefaultInstance (properties, authenticator);85.try{86.Message mailMessage = new MimeMessage(sendMai lSession);//根据session创建一个邮件消息87.Address from = new InternetAddress(mailInfo.getFro mAddress());//创建邮件发送者地址88.mailMessage.setFrom(from);//设置邮件消息的发送者89.Address to = new InternetAddress(mailInfo.getT oAddr ess());//创建邮件的接收者地址90.mailMessage.setRecipient(Message.RecipientType.TO, to);//设置邮件消息的接收者91.mailMessage.setSubject(mailInfo.getSubject());//设置邮件消息的主题92.mailMessage.setSentDate(new Date());//设置邮件消息发送的时间93.94.//MimeMultipart类是一个容器类,包含MimeBodyPart 类型的对象95.Multipart mainPart = new MimeMultipart();96.MimeBodyPart messageBodyPart = new MimeBodyPa rt();//创建一个包含HTML内容的MimeBodyPart97.//设置HTML内容98.messageBodyPart.setContent(mailInfo.getContent(),"t ext/html; charset=utf-8");99.mainPart.addBodyPart(messageBodyPart);100.101.//存在附件102.String[] filePaths = mailInfo.getAttachFileNames();103.if (filePaths != null && filePaths.length > 0) {104.for(String filePath:filePaths){105.messageBodyPart = new MimeBodyPart();106.File file = new File(filePath);107.if(file.exists()){//附件存在磁盘中108.FileDataSource fds = new FileDataSource(file);//得到数据源109.messageBodyPart.setDataHandler(new DataHandler(f ds));//得到附件本身并至入BodyPart110.messageBodyPart.setFileName(file.getName());//得到文件名同样至入BodyPart111.mainPart.addBodyPart(messageBodyPart);112.}113.}114.}115.116.//将MimeMultipart对象设置为邮件内容117.mailMessage.setContent(mainPart);118.Transport.send(mailMessage);//发送邮件119.return true;120.}catch (Exception e) {121. e.printStackTrace();122.}123.return false;124.}125.126.}emailTest.java[java] view plain copy1.public class emailTest {2.public static void main(String[] args) {3.MailInfo mailInfo = new MailInfo();4.mailInfo.setMailServerHost("");5.mailInfo.setMailServerPort("25");6.mailInfo.setValidate(true);7.mailInfo.setUsername("***********");8.mailInfo.setPassword("xxxxx");// 您的邮箱密码9.mailInfo.setFromAddress("************");10.mailInfo.setToAddress("************");11.mailInfo.setSubject("设置邮箱标题");12.13.//附件14.String[] attachFileNames={"d:/Sunset.jpg"};15.mailInfo.setAttachFileNames(attachFileNames);16.17.// 这个类主要来发送邮件18.//mailInfo.setContent("设置邮箱内容");19.//SimpleMail.sendTextMail(mailInfo);// 发送文体格式20.StringBuffer demo = new StringBuffer();21.demo.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dt d\">")22..append("<html>")23..append("<head>")24..append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">")25..append("<title>测试邮件</title>")26..append("<style type=\"text/css\">")27..append(".test{font-family:\"Microsoft Yahei\";font-size: 18px;color: red;}")28..append("</style>")29..append("</head>")30..append("<body>")31..append("<span class=\"test\">大家好,这里是测试Demo</span>")32..append("</body>")33..append("</html>");34.mailInfo.setContent(demo.toString());35.SimpleMail.sendHtmlMail(mailInfo);// 发送html格式36.}37.}。

Java解析复合文档的内部目录结构

Java解析复合文档的内部目录结构

Java解析复合文档的内部目录结构解析复合文档的内部目录结构通常需要借助一些工具或库来实现。

在Java中,常用的工具有Apache POI和iText等。

下面是一个使用Apache POI来解析复合文档内部目录结构的示例。

Apache POI是一个用于处理微软Office格式文档的Java库。

它提供了一套API,可以用于读取、创建和修改诸如Word文档、Excel电子表格和PowerPoint幻灯片等类型的文件。

首先,我们需要添加Apache POI库的依赖。

在Maven项目中,可以通过在pom.xml文件中添加以下依赖来导入Apache POI库:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>```接下来,我们将使用该库来解析复合文档(如Word文档)的内部目录结构。

假设我们有一个名为"sample.docx"的Word文档,其中包含一些章节和子章节。

```javaimport ermodel.*;import java.io.FileInputStream;import java.io.IOException;import java.util.List;public class Mainpublic static void main(String[] args)try// 打开Word文档XWPFDocument document = new XWPFDocument(new FileInputStream("sample.docx"));//获取文档的段落列表List<XWPFParagraph> paragraphs = document.getParagraphs(;//遍历每个段落for (XWPFParagraph paragraph : paragraphs)//获取段落中的文本内容String text = paragraph.getText(;//判断是否是目录级别的标题if (isHeading(text))//输出目录级别和标题内容int level = getHeadingLevel(text);String title = getHeadingTitle(text);System.out.println("Level " + level + ": " + title);}}//关闭文档document.close(;} catch (IOException e)e.printStackTrace(;}}private static boolean isHeading(String text)//判断文本是否以数字和"."开头,及是否包含"\t"字符return text.matches("[0-9]+\\..+") && text.contains("\t"); }private static int getHeadingLevel(String text)//提取文本中的数字部分作为目录级别String[] parts = text.split("\\.");return Integer.parseInt(parts[0]);}private static String getHeadingTitle(String text)//去掉文本中的目录级别和"\t"字符return text.substring(text.indexOf("\t") + 1);}```在示例代码中,我们首先打开Word文档"sample.docx",然后获取该文档的所有段落。

javamail邮件Multipart支持同时发text和html混合消息,alterna。。。

javamail邮件Multipart支持同时发text和html混合消息,alterna。。。

javamail邮件Multipart⽀持同时发text和html混合消息,alterna。

javamail邮件Multipart⽀持同时发text和html混合消息alternative纯⽂本与超⽂本共存multipart/mixed:附件。

multipart/related:内嵌资源。

multipart/alternative:纯⽂本与超⽂本共存。

/*** 以Multipart混合格式发送邮件** @param mailInfo* 待发送的邮件信息*/public boolean sendMultipartMail(MailSenderInfo mailInfo) {if(Common.isNullOrEmpty(mailInfo.getFromAddress())) {System.out.println("FromAddress is empty");return false;}// 判断是否需要⾝份认证MailAuthenticator authenticator = null;Properties pro = mailInfo.getProperties();// 如果需要⾝份认证,则创建⼀个密码验证器if (mailInfo.isValidate()) {authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());}// 根据邮件会话属性和密码验证器构造⼀个发送邮件的sessionSession sendMailSession = Session.getDefaultInstance(pro, authenticator);try {// 根据session创建⼀个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 创建邮件发送者地址Address from = new InternetAddress(mailInfo.getFromAddress());// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(mailInfo.getToAddress());// Message.RecipientType.TO属性表⽰接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的主题mailMessage.setSubject(mailInfo.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// System.out.println("mailInfo.getText=" + mailInfo.getText());// System.out.println("mailInfo.getHtml=" + mailInfo.getHtml());MimeBodyPart textPart = new MimeBodyPart();textPart.setContent(mailInfo.getText(), "text/plain; charset=utf-8");MimeBodyPart htmlPart = new MimeBodyPart();htmlPart.setContent(mailInfo.getHtml(), "text/html; charset=utf-8");// MiniMultipart类是⼀个容器类,包含MimeBodyPart类型的对象Multipart mp = new MimeMultipart("alternative");//mixed related alternativemp.addBodyPart(textPart);mp.addBodyPart(htmlPart);// 将MiniMultipart对象设置为邮件内容mailMessage.setContent(mp);// 发送邮件Transport.send(mailMessage);return true;} catch (MessagingException ex) {ex.printStackTrace();}return false;}import java.util.Properties;public class MailSenderInfo {// 发送邮件的服务器的IP和端⼝private String mailServerHost;private String mailServerPort = "25";// 邮件发送者的地址private String fromAddress;// 邮件接收者的地址private String toAddress;// 登陆邮件发送服务器的⽤户名和密码private String userName;private String password;// 是否需要⾝份验证private boolean validate = false;// 邮件主题private String subject;// 邮件的⽂本内容private String html;// 邮件的⽂本内容private String text;// 邮件附件的⽂件名private String[] attachFileNames;private String iwallHost;/*** 获得邮件会话属性*/public Properties getProperties() {Properties p = new Properties();p.put("mail.smtp.host", this.mailServerHost);p.put("mail.smtp.port", this.mailServerPort);p.put("mail.smtp.auth", validate ? "true" : "false"); p.put("erName", erName);p.put("mail.smtp.password", this.password);return p;}public String getMailServerHost() {return mailServerHost;}public void setMailServerHost(String mailServerHost) { this.mailServerHost = mailServerHost;}public String getMailServerPort() {return mailServerPort;}public void setMailServerPort(String mailServerPort) {this.mailServerPort = mailServerPort;}public boolean isValidate() {return validate;}public void setValidate(boolean validate) {this.validate = validate;}public String[] getAttachFileNames() {return attachFileNames;}public void setAttachFileNames(String[] fileNames) {this.attachFileNames = fileNames;}public String getFromAddress() {return fromAddress;}public void setFromAddress(String fromAddress) {this.fromAddress = fromAddress;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getToAddress() {return toAddress;}public void setToAddress(String toAddress) {this.toAddress = toAddress;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getHtml() {return html;}public void setHtml(String html) {this.html = html;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getIwallHost() {return iwallHost;}public void setIwallHost(String iwallHost) {this.iwallHost = iwallHost;}}注:不同运营商发送后看到的邮件源⽂件信息头内容是不⼀样的。

[Java]JavaMail查询邮件

[Java]JavaMail查询邮件

[Java]JavaMail查询邮件上两篇提到如何发送邮件:, 。

本⽂再演⽰下,如何读取邮箱上的邮件。

邮件内容的数据格式种类⽐较多,⽤户直接阅读邮件⽐较常见,通过程序解读邮件⽐较少见,所以,本⽂的例⼦只演⽰读取邮件信封上的内容,例如邮件主题、发件⼈。

若邮件内容是纯⽂本格式,也能直接读取。

若邮件内容是⾮⽂本格式,可以通过分解获取到的 Message 继续解读,不过这种情况不在本⽂演⽰范围内。

CheckingMail,查询邮件,根据提供的 pop3 服务器域名,邮箱账号,密码,查询该邮箱账号⾥⾯的邮件。

只查看邮件主题,发件⼈,邮件内容类型,如果是纯⽂本内容,也会显⽰出现。

注意点:如果 InternetAddress 的 personName 包含中⽂,直接调⽤InternetAddress.toString() 会显⽰不正常,需要单独调⽤ InternetAddress 的 getPersonal() 提取发件⼈姓名,才能正常显⽰发件⼈姓名。

CheckingMailDemo,演⽰邮件查询。

具体代码:CheckingMail,查询邮件。

import static ng.System.out;import java.util.Properties;import javax.mail.Address;import javax.mail.Folder;import javax.mail.Message;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Store;import javax.mail.internet.InternetAddress;public class CheckingMail {private String username;private String password;private String host;private String port = "995";public CheckingMail(String host, String username, String password){this.host = host;ername = username;this.password = password;}public void check() throws Exception{Properties props = new Properties();props.put("mail.pop3.host", host);props.put("mail.pop3.port", port);props.put("mail.pop3.stattls.enable", "true");Session session = Session.getInstance(props,new javax.mail.Authenticator(){protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}});Store store = session.getStore("pop3s");store.connect(host, username, password);System.out.println(" connect completed ");Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message[] messages = folder.getMessages();System.out.println(" the number of message retrieved from mailbox : " + messages.length);for (int i = 0 ; i < messages.length; i++){Message msg = messages[i];InternetAddress address = (InternetAddress) msg.getFrom()[0];out.println(" [ #" + i + " ] ");out.println( "Subject : " + msg.getSubject());out.println("From : " + address.getPersonal() + "<" + address.getAddress() + ">");out.println("ContentType : " + msg.getContentType());out.println("Content Detail : " + msg.getContent().toString());out.println();}out.println(" Eamil retrieved completely ");folder.close(false);store.close();}}CheckingMailDemo,演⽰邮件查询。

浅析JavaMail发送邮件后再通过JavaMail接收格式问题

浅析JavaMail发送邮件后再通过JavaMail接收格式问题

浅析JavaMail发送邮件后再通过JavaMail接收格式问题复杂邮件发送问题关于 JavaMail 如何发送邮件这⾥就不赘述了,⽹上有很多例⼦。

其中最复杂的邮件发送莫过于 html邮件包含内嵌图⽚以及附件,最近项⽬中的这项功能我在发送邮件时就出现了⼀系列问题。

我在使⽤ JavaMail 发送了邮件之后,会再次通过 JavaMail 将其获取回来进⾏解析,由于发送操作不当,导致了解析就不是那么回事了。

接下来先看看正常的解析过程吧。

关于邮件的解析,⽹上依然有很多例⼦。

private static void multipartMailParser(Multipart mail) throws Exception {int count = mail.getCount();System.out.println("part count: " + count);for (int i = 0; i < count; i++) {BodyPart bodyPart = mail.getBodyPart(i);//cid 解析//cid ⽰例: <4a85b9c9$1$16af704cfc3$Coremail$user_taohan$>String[] cids = bodyPart.getHeader("Content-Id");System.out.println("=========> cids: " + (cids == null ? "NULL" : cids.length));String content = "", cid = "";if (cids != null && cids.length > 0) {content = cids[0];if (content.startsWith("<") && content.endsWith(">")) {cid = "cid:" + content.substring(1, content.length() - 1);} else {cid = "cid:" + content;}}System.out.println(content+"---"+cid);System.out.println(bodyPart.getContentType());if (bodyPart.isMimeType("text/plain")) {System.out.println("纯⽂本邮件: " + bodyPart.getContent());} else if (bodyPart.isMimeType("text/html")) {System.out.println("html邮件: " + bodyPart.getContent());} else if (bodyPart.isMimeType("multipart/*")) {Multipart part = (Multipart)bodyPart.getContent();multipartMailParser(part);} else if (bodyPart.isMimeType("application/octet-stream")) {String disposition = bodyPart.getDisposition();System.out.println("任意的⼆进制数据: " + disposition);//这⾥就是对附件进⾏解析if (disposition.equalsIgnoreCase(BodyPart.ATTACHMENT)) {String fileName = bodyPart.getFileName();System.out.println("------------------------保存附件 " + fileName);InputStream is = bodyPart.getInputStream();File file = new File("C:\\Users\\AB\\Desktop\\mail\\"+fileName);copy(is, new FileOutputStream(file));}} else if (bodyPart.isMimeType("image/*") && !("".equals(cid))) {//内嵌图⽚处理DataHandler dataHandler = bodyPart.getDataHandler();String name = dataHandler.getName();System.out.println("内嵌图⽚ NAME: " + name);InputStream is = dataHandler.getInputStream();File file = new File("C:\\Users\\AB\\Desktop\\mail\\"+name);copy(is, new FileOutputStream(file));}}}private static void copy(InputStream is, OutputStream os) throws IOException {byte[] bytes = new byte[1024];int len = 0;while ((len=is.read(bytes)) != -1 ) {os.write(bytes, 0, len);}if (os != null)os.close();if (is != null)is.close();}使⽤以上⽅法对邮件进⾏解析是没有问题的,内嵌图⽚、附件都是可以分开解析的。

javamail发送文本邮件、HTML邮件及带附件邮件

javamail发送文本邮件、HTML邮件及带附件邮件

javamail发送文本邮件、HTML邮件及带附件邮件MailInfo.java[java] view plain copyimportjava.util.Properties; public class MailInfo{ private String mailServerHost;// 服务器ipprivate String mailServerPort;// 端口private String fromAddress;// 发送者的邮件地址private String toAddress;// 邮件接收者地址private String username;// 登录邮件发送服务器的用户名private String password;// 登录邮件发送服务器的密码private boolean validate = false;// 是否需要身份验证private String subject;// 邮件主题private String content;// 邮件内容private String[] attachFileNames;// 附件名称public Properties getProperties() { Properties p = new Properties(); p.put("mail.smtp.host",this.mailServerHost); p.put("mail.smtp.port", this.mailServerPort); p.put("mail.smtp.auth", validate ? "true" : "false"); return p; } public String getMailServerHost() { return mailServerHost; } public void setMailServerHost(String mailServerHost){ this.mailServerHost = mailServerHost; } public String getMailServerPort() { return mailServerPort; } public void setMailServerPort(String mailServerPort){ this.mailServerPort = mailServerPort; } public String getFromAddress() { return fromAddress; } public void setFromAddress(String fromAddress){ this.fromAddress = fromAddress; } public String getToAddress() { return toAddress; } public voidsetToAddress(String toAddress){ this.toAddress = toAddress; }public String getUsername() { return username; } public void setUsername(String username) { ername = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public boolean isValidate() { returnvalidate; } public void setValidate(boolean validate) { this.validate = validate; }public String getSubject() { returnsubject; } public void setSubject(String subject) { this.subject = subject; }public String getContent() { returncontent; } public void setContent(String content) { this.content = content; }public String[] getAttachFileNames() { return attachFileNames; } public void setAttachFileNames(String[] attachFileNames){ this.attachFileNames =attachFileNames; } }MyAuthenticator.Java[java] view plain copyimportjavax.mail.Authenticator; importjavax.mail.PasswordAuthentication; public class MyAuthenticator extends Authenticator { private String username = null; private String password = null; public MyAuthenticator() { };public MyAuthenticator(String username, String password) { ername = username;this.password = password; } protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(username,password); } } SimpleMail.java[java] view plain copyimport java.io.File; import java.util.Date; import java.util.Properties; importjavax.activation.DataHandler; importjavax.activation.FileDataSource; importjavax.mail.Address; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; importjavax.mail.internet.InternetAddress; importjavax.mail.internet.MimeBodyPart; importjavax.mail.internet.MimeMessage; importjavax.mail.internet.MimeMultipart; public class SimpleMail { // 以文本格式发送邮件public static boolean sendTextMail(MailInfo mailInfo){ //判断是否需要身份认证MyAuthenticator authenticator = null; Properties properties = mailInfo.getProperties(); if (mailInfo.isValidate()) { //如果需要身份认证,则创建一个密码验证器authenticator = new MyAuthenticator(mailInfo.getUsername(),mailInfo.getPassword()); }//根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(properties, authenticator);try { Message mailMessage = new MimeMessage(sendMailSession);//根据session创建一个邮件消息Address from = new InternetAddress(mailInfo.getFromAddress());//创建邮件发送者地址mailMessage.setFrom(from);//设置邮件消息的发送者Address to = new InternetAddress(mailInfo.getToAddress());//创建邮件的接收者地址mailMessage.setRecipient(Message.RecipientType.TO, to);//设置邮件消息的接收者mailMessage.setSubject(mailInfo.getSubject());//设置邮件消息的主题mailMessage.setSentDate(new Date());//设置邮件消息发送的时间//mailMessage.setText(mailInfo.getContent());//设置邮件消息的主要内容//MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart(); MimeBodyPart messageBodyPart = new MimeBodyPart();//创建一个包含附件内容的MimeBodyPart //设置HTML内容messageBodyPart.setContent(mailInfo.getContent(),"text/ html; charset=utf-8");mainPart.addBodyPart(messageBodyPart);//存在附件String[] filePaths =mailInfo.getAttachFileNames(); if (filePaths != null &amp;&amp; filePaths.length &gt; 0) { for(StringfilePath:filePaths){ messageBody Part = new MimeBodyPart(); File file = new File(filePath);if(file.exists()){//附件存在磁盘中FileDataSource fds = new FileDataSource(file);//得到数据源messageBodyPart.setDataHandler(newDataHandler(fds));//得到附件本身并至入BodyPart messageBodyPart.setFileName(file.getName());//得到文件名同样至入BodyPartmainPart.addBodyPart(messageBodyPart);} } }//将MimeMultipart对象设置为邮件内容mailMessage.setContent(mainPart);Transport.send(mailMessage);//发送邮件return true; } catch (Exception e){ e.printStackTrace(); }return false; } // 以HTML格式发送邮件public static boolean sendHtmlMail(MailInfo mailInfo) { //判断是否需要身份认证MyAuthenticator authenticator = null; Properties properties = mailInfo.getProperties(); if (mailInfo.isValidate()) { // 如果需要身份认证,则创建一个密码验证器authenticator = new MyAuthenticator(mailInfo.getUsername(),mailInfo.getPassword()); } // 根据邮件会话属性和密码验证器构造一个发送邮件的session Session sendMailSession =Session.getDefaultInstance(properties, authenticator);try{ Message mailMessage = new MimeMessage(sendMailSession);//根据session创建一个邮件消息Address from = new InternetAddress(mailInfo.getFromAddress());//创建邮件发送者地址mailMessage.setFrom(from);//设置邮件消息的发送者Address to = new InternetAddress(mailInfo.getToAddress());//创建邮件的接收者地址mailMessage.setRecipient(Message.RecipientType.TO, to);//设置邮件消息的接收者mailMessage.setSubject(mailInfo.getSubject());//设置邮件消息的主题mailMessage.setSentDate(new Date());//设置邮件消息发送的时间//MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart(); MimeBodyPart messageBodyPart = new MimeBodyPart();//创建一个包含HTML内容的MimeBodyPart //设置HTML 内容messageBodyPart.setContent(mailInfo.getContent(),"text/ html; charset=utf-8");mainPart.addBodyPart(messageBodyPart);//存在附件String[] filePaths =mailInfo.getAttachFileNames(); if (filePaths != null &amp;&amp; filePaths.length &gt; 0){ for(StringfilePath:filePaths){ messageBody Part = new MimeBodyPart(); File file = new File(filePath);if(file.exists()){//附件存在磁盘中FileDataSource fds = new FileDataSource(file);//得到数据源messageBodyPart.setDataHandler(newDataHandler(fds));//得到附件本身并至入BodyPart messageBodyPart.setFileName(file.getName());//得到文件名同样至入BodyPartmainPart.addBodyPart(messageBodyPart);} } }//将MimeMultipart对象设置为邮件内容mailMessage.setContent(mainPart);Transport.send(mailMessage);//发送邮件return true; }catch (Exception e){ e.printStackTrace(); }return false; } } emailTest.java[java] view plain copypublic class emailTest { public static voidmain(String[] args) { MailInfo mailInfo = new MailInfo();mailInfo.setMailServerHost("");mailInfo.setMailServerPort("25");mailInfo.setValidate(true);mailInfo.setUsername("xxx@");mailInfo.setPassword("xxxxx");// 您的邮箱密码mailInfo.setFromAddress("xxxx@");mailInfo.setToAddress("xxxx@");mailInfo.setSubject("设置邮箱标题");//附件String[]attachFileNames={"d:/Sunset.jpg"};mailInfo.setAttachFileNames(attachFileNames);// 这个类主要来发送邮件//mailInfo.setContent("设置邮箱内容");//SimpleMail.sendTextMail(mailInfo);// 发送文体格式StringBuffer demo = new StringBuffer();demo.append("&lt;!DOCTYPE html PUBLIC\"-//W3C//DTD HTML 4.01 Transitional//EN\"\"/TR/html4/loose.dtd\"&gt;") . append("&lt;html&gt;") .append("&lt;head&gt;") .append("&lt;meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"&gt;") .append("&lt;title&gt;测试邮件&lt;/title&gt;") .append("&lt;styletype=\"text/css\"&gt;") .append(".test{font-family :\"Microsoft Yahei\";font-size: 18px;color:red;}") .append("&lt;/style&gt;") .append("&lt;/head&gt;") .append("&lt;body&gt;") .append("&lt;span class=\"test\"&gt;大家好,这里是测试Demo&lt;/span&gt;") .append("&lt;/body&gt;") .append("&lt;/html&gt;");mailInfo.setContent(demo.toString());SimpleMail.sendHtmlMail(mailInfo);// 发送html格式} }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用JavaMail显示复合邮件的内容
2001-07-09· ·spczhou ··jdeveloper
复合邮件:既含图片又含正文,一般是html格式显示。

简单理解的话,就是非常漂亮的那种邮件。

(个人注解,不很全面)
当我们需要做一个收取邮件的程序时,我们该如何去显示复合邮件的内容呢?
今天我将我得一点心得写出来,希望后来者能够少走弯路。

当然也希望同志多加指正。

首先,我们需要从folder中得到一个message对象。

这一步不难实现。

可以参看很多例子。

当我们得到这个message对象后,下一步就是去显示他的内容了。

在这部分开始前,首先需要简要介绍一下mimetype的几个重要类型:
text/html
texl/plain
multipart/alternative
multipart/related
前两个不必多介绍,一个是html格式的正文,一个是无格式正文。

如果你的message对象是这两个mimetype的一种的话。

那么你的邮件就不是multipart的邮件。

你就可以直接去显示他们。

如下:
Object o = m.getContent();
if (m.isMimeType("text/plain")||m.isMimeType("text/html"))
{
s="
"+(String)o+"
";
return s;
}
s为要返回的内容字符串。

m为message对象。

如果你的message对象是后两种的话,就说明你的邮件是multipart的。

需要做一些处理和判断才能正常显示内容。

如果message是multipart,只要得到multipart 的各个部分(part)的内容。

则整个message的内容就得到了。

if (m.isMimeType("multipart/*")
{
Multipart mp = (Multipart)o;
int cnt = mp.getCount();
for (int i = 0; i < cnt; i++)
{
w=w+"
"+getPart(mp.getBodyPart(i), i, 2,x);
}
}
getPart 是得到part内容的方法。

那没如何得到part得内容呢?
这里有一点要强调,并非得到part对象后,调用part.getContent()就能得到part 的内容。

当初我就是在这里被卡住了。

为什么呢?原因是:
理论上的指明内容第一个part,既不是一个text/plain类型,也不是一个text/html 类型。

所以,第15行是永远不成立的。

后来经过研究发现,指明内容的第一个part 又是一个multipart类型。

也就是说,这个邮件可分为多个部分,正文和图片等,而正文部分又可以分为多个部分,如plain的正文和html的正文。

这样,就象一个树。

只有到达叶子时,你才能知道它时plain还是html。

因此,我们在part中递归调用本身就解决了问题。

1 public String getPart(Part part, int partNum)
2 throws MessagingException,IOException
3 {
4 String s="";
5 String s1="";
6 String s2="";
7 String s3="";
8 String sct = part.getContentType();
9 if (sct == null)
10 {
11 s="part 无效";
12 return s;
13 }
14 ContentType ct = new ContentType(sct);
15 if (ct.match("text/plain"))
16 {
17 // display text/plain inline
18 s1="
";
19 }
20 else
21 {
22 String temp="";
23 if ((temp = part.getFileName()) != null)
24 s2= "Filename: " + temp + "
";
25 temp = null;
26 if ((temp = part.getDescription()) != null)
27 s3= "Description: " + temp + "
";
28 }
29 s=s1+s2+s3;
30 return s;
31 }
下面是经过改造的getpart方法(很粗糟,未优化),使用它能够正确显示复合邮件。

public String getPart(Part part, int partNum, int msgNum,int x) throws
MessagingException,IOException
{
String s="";
String s1=""; x参数来确定是以html格式显示还是以plain
String s2="";
String s3="";
String s5="";
String sct = part.getContentType();
if (sct == null)
{
s="part 无效";
return s;
}
ContentType ct = new ContentType(sct);
if (ct.match("text/html")||ct.match("text/plain"))
{
// display text/plain inline
s1="
";
}
else if(partNum!=0)
{
String temp="";
if ((temp = part.getFileName()) != null)
{
s2= "Filename: " + temp + "
";
}
/*
out.println(" HttpUtils.getRequestURL(req) +
"?message=" +
msgNum + "&part=" +
partNum + "\">Display Attachment");
*/
}
if(part.isMimeType("multipart/alternative")) {
String s6="";
String s7="";
Multipart mp = (Multipart)part.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++)
{
if(mp.getBodyPart(i).isMimeType("text/plain")) s7=getPart(mp.getBodyPart(i), i, 3,2);
if(mp.getBodyPart(i).isMimeType("text/html")) s6=getPart(mp.getBodyPart(i), i, 3,1);
}
if(x==1){s5=s6;}
if(x==2){s5=s7;}
return s5;
}
s=s1+s2;
return s;
}
希望大家探讨。

相关文档
最新文档