zoukankan      html  css  js  c++  java
  • 用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邮件发送:简单邮件发送

  • 相关阅读:
    图的存储代码实现
    最小生成树算法
    图的遍历
    图的存储结构
    ftp服务器的配置
    利用c++利用odbc连接mysql数据库
    测试odbc连接sqlsever数据库是否成功的代码
    gk888t打印机安装
    Win10下windows mobile设备中心连接不上的方法无法启动
    js千分位加逗号和四舍五入保留两位小数
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/9664906.html
Copyright © 2011-2022 走看看