码迷,mamicode.com
首页 > 编程语言 > 详细

用javaMail发送邮件

时间:2018-09-17 21:31:00      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:基于   add   java   ssl   用户   alt   tde   str   抽象   

电子邮件协议

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邮件发送:简单邮件发送

用javaMail发送邮件

标签:基于   add   java   ssl   用户   alt   tde   str   抽象   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!