用javaMail发送邮件

电子邮件协议

SMTP是推协议,负责用户代理向邮件服务器或邮件服务器与邮件服务器间发送邮件;POP3、IMAP是拉协议,负责用户代理从邮件服务器读取邮件。

如何写一封邮件

javaMail用Message对象表示一封邮件。Message类是一个抽象类,我们通常使用它的子类MimeMessage表示一封邮件。

MimeMessage构造器接受一个Session对象,Session对象表示一个会话,该对象由Session.getInstance(property)方法生成,property参数是一个Properties对象,我们借用它设置邮件传输的相关信息。

文本邮件

package com.weixia.SMTP;

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import java.io.FileOutputStream;

public class Message_text {
    public static void main(String[] args) throws Exception {
        String from = "";   // 发件人
        String to   = "";   // 收件人
        String subject = "This ia a SMTP test mail";    // 主题
        String body = "Hello,world!";   // 邮件正文

        Properties property = new Properties();
        Session session = Session.getInstance(property);
        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));
        // Message.RecipientType.TO :收件人;Message.RecipientType.CC :抄送人;Message.RecipientType.BCC :密送人
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSentDate(new Date());
        message.setSubject(subject,"UTF-8");
        message.setText(body,"UTF-8");
        message.saveChanges();
        message.writeTo(new FileOutputStream("F:\\mail.eml"));
    }
}

InternetAddress类解析邮件地址,它的构造器接受一个邮箱格式的字符串,放回一个InternetAddress对象;它的parse方法作用相同,但返回InternetAddress[],可以用来群发。

HTML格式邮件

package com.weixia.SMTP;

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import java.io.FileOutputStream;

public class MailWithHtml {
    public static void main(String[] args) throws Exception {
        String from = "";
        String to   = "";
        String subject = "This ia a SMTP test mail";
        String body = "<p>Hello,world!</p>";

        Properties property = new Properties();
        Session session = Session.getInstance(property);
        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSentDate(new Date());
        message.setSubject(subject,"UTF-8");
        message.setContent(body,"text/html;charset=UTF-8");
        message.saveChanges();
        message.writeTo(new FileOutputStream("F:\\mailWithHtml.eml"));
    }
}

HTML格式只需改变设置正文的方法,指明MIME类型。

含有图片、附件或其他媒体类型的邮件

这种复杂邮件,我们把图片、附件或其他媒体类型看作是一个BodyPart对象。因为Message对象setContent方法接受Multipart类型参数,所以必须把BodyPart封装为Multipart对象。

封装的方法如下图:

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;

public class MultiMail {
    public static void main(String[] args) throws Exception {
        String from = "";
        String to   = "";

        Properties property = new Properties();
        Session session = Session.getInstance(property);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject("这是我用java发送的一封邮件", "UTF-8");
        message.setSentDate(new Date());

        // create picture node
        MimeBodyPart image = new MimeBodyPart();
        FileDataSource file = new FileDataSource("F:\\邮件.jpg");
        image.setDataHandler(new DataHandler(file));
        // 后边引用该ID时,须使用"cid:idName"的形式,例如"<img src=‘cid:image_id‘ />"
        image.setContentID("image_id");

        // create text node
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("<p>This is a test picture</p><img src=‘cid:image_id‘ />","text/html;charset=UTF-8");

        MimeMultipart text_image = new MimeMultipart("related");
        text_image.addBodyPart(image);
        text_image.addBodyPart(text);
        // 为了添加附件,将text_image封装为BodyPart对象
        MimeBodyPart text_image_node = new MimeBodyPart();
        text_image_node.setContent(text_image);

        // 创建附件
        MimeBodyPart attachment = new MimeBodyPart();
        FileDataSource attachmentFile = new FileDataSource("F:\\mail.eml");
        DataHandler handler = new DataHandler(attachmentFile);
        attachment.setDataHandler(handler);
        attachment.setFileName(attachmentFile.getName());

        MimeMultipart body = new MimeMultipart("mixed");
        body.addBodyPart(text_image_node);
        body.addBodyPart(attachment);

        message.setContent(body);
        message.saveChanges();

        return message;
    }
}

发送邮件

在发送邮件时,我们要设置传输邮件的相关信息,这里我们使用Properties对象来设置Session会话对象。

通过Session对象获取Transport对象,用connect方法连接邮件服务器,然后用sendMessage方法发送邮件。

SSL连接

现在邮件服务提供商通常使用SSL加密连接,设置SSL如下:

String smtpPort = "465";
Properties property = new Properties();
property.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
property.setProperty("mail.smtp.socketFactory.fallback","false");
property.setProperty("mail.smtp.socketFactory.port",smtpPort);

完整代码如下:

package com.weixia.SMTP;

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;

public class SentMultiMail {
    public static void main(String[] args) throws Exception {
        String emailAccount = "";
        String emailPassword = "";

        String recipient = "";

        String smtpHost = "smtp.sina.com";
        String smtpPort = "465";

        Properties property = new Properties();

        property.setProperty("mail.transport.protocol","smtp");
        property.setProperty("mail.smtp.host",smtpHost);
        property.setProperty("mail.smtp,port",smtpPort);
        property.setProperty("mail.smtp.auth","true");

        property.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        property.setProperty("mail.smtp.socketFactory.fallback","false");
        property.setProperty("mail.smtp.socketFactory.port",smtpPort);

        Session session = Session.getInstance(property);
        session.setDebug(true);
        MimeMessage message = createMail(session, emailAccount, recipient);

        Transport transport = session.getTransport();
        transport.connect(emailAccount, emailPassword);
        transport.sendMessage(message,message.getAllRecipients());
        transport.close();
    }

    public static MimeMessage createMail(Session session, String from, String to) throws Exception {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        message.setSubject("这是我用java发送的一封邮件", "UTF-8");
        message.setSentDate(new Date());

        // create picture node
        MimeBodyPart image = new MimeBodyPart();
        FileDataSource file = new FileDataSource("F:\\邮件.jpg");
        image.setDataHandler(new DataHandler(file));
        // 后边引用该ID时,须使用"cid:idName"的形式,例如"<img src=‘cid:image_id‘ />"
        image.setContentID("image_id");

        // create text node
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("<p>This is a test picture</p><img src=‘cid:image_id‘ />","text/html;charset=UTF-8");

        MimeMultipart text_image = new MimeMultipart("related");
        text_image.addBodyPart(image);
        text_image.addBodyPart(text);
        // 为了添加附件,将text_image封装为BodyPart对象
        MimeBodyPart text_image_node = new MimeBodyPart();
        text_image_node.setContent(text_image);

        // 创建附件
        MimeBodyPart attachment = new MimeBodyPart();
        FileDataSource attachmentFile = new FileDataSource("F:\\mail.eml");
        DataHandler handler = new DataHandler(attachmentFile);
        attachment.setDataHandler(handler);
        attachment.setFileName(attachmentFile.getName());

        MimeMultipart body = new MimeMultipart("mixed");
        body.addBodyPart(text_image_node);
        body.addBodyPart(attachment);

        message.setContent(body);
        message.saveChanges();

        return message;
    }
}

参考链接

JavaMail入门第二篇 创建邮件

基于JavaMail的Java邮件发送:简单邮件发送

原文地址:https://www.cnblogs.com/weixia-blog/p/9664906.html

时间: 2024-10-13 23:03:27

用javaMail发送邮件的相关文章

使用JavaMail发送邮件和接受邮件

一. 为什么要学习JavaMail 为什么要学习JavaMail开发? 现在很多WEB应用在开发时都需要集成邮件发送功能,例如: 1. 给新注册的用户自动发送一封包含其注册信息的欢迎E-Mail. 2. 给过生日的注册会员自动发送一封表示祝贺的E-Mail. 3. 将网站的最新活动信息通过E-Mail发送给所有的注册会员. 二. 邮件服务器和协议 1. 邮件服务器: 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.so

javamail发送邮件的简单实例(转)

javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可. 第一个类:MailSenderInfo.java package com.util.mail;    /**    * 发送邮件需要使用的基本信息  *author by wangfun http://www.5a520.cn 小说520   */  

JavaMail发送邮件

发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁 bcc字段   -- 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁 邮件体指的就是邮件的具体内容. 使用JavaMail创建邮件和发送邮件 JavaMail创建的邮件是基于MIME协议的.因此可以使用Java

javamail发送邮件(转)

今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可.jar包因为我不知道怎么传到javaeye上,所以朋友们回去自己打吧. 我的代码有三个类: 第一个类:MailSenderInfo.java Java代码   package com.util.mail; /** * 发送邮件需要使用的基本信息 */ import java.util.Pr

JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

SSM框架+Javamail发送邮件

本博客介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实也是Foxmail邮箱 先要了解一下SMTP协议和SSL加密 SMTP:称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效.可靠的邮件传输.SMTP是一种请求响应的协议,也就是客户机向远程服务器发送请求,服务器响应,监听端口是25,所以其工作模式有两种:发送SMTP,接收SMTP SSL加密:用来保障浏

web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

(转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

博客源地址:http://www.cnblogs.com/xdp-gacl/p/4220190.html 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Js

使用JavaMail发送邮件-no object DCH for MIME type multipart/mixed报错解决

最近需要实现一个使用Spring schedule按一定时间间隔自动触发条件发送邮件的功能,在开发的过程中,是按照先测试能发出text/html文本邮件,然后测试添加附件发送邮件,我碰到的问题是,文本邮件能正常发送出来,但是添加附件的邮件却发不出来,这个问题困扰了我很久,所以有必要记录下. 报错内容:"javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed" 初

使用JavaMail发送邮件

一.邮件的相关概念 邮件协议.主要包括: SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件 POP3协议:Post Office Protocol 3,即邮局协议的第三个版本,用于接收邮件 IMAP协议:Internet Message Access Protocol,即互联网消息访问协议,是POP3的替代协议 二.搭建James邮件服务器 James是Apache的一个开源项目,纯Java实现 搭建James服务器 ① 下载apac