发邮件_发邮件代码 - CSDN
  • Java 发送邮件的几种方式

    万次阅读 多人点赞 2018-10-24 14:53:38
    发送文件的项目地址(free):... 导入jar包:activation-1.1.jar javax.mail-1.6.2.jar 内容:1.发送一封只包含文本的简单邮件 SendEmail_text.java  2.发送包含内嵌图片的邮件 Send...

    发送文件的项目地址(free):https://download.csdn.net/download/qq_36474549/10741073

    导入jar包:activation-1.1.jar   javax.mail-1.6.2.jar

    内容:1.发送一封只包含文本的简单邮件    SendEmail_text.java

               2.发送包含内嵌图片的邮件     SendEmail_photo.java

               3.发送包含附件的邮件     SendEmail_attachments.java

               4.发送包含内嵌图片和附件的复杂邮件     SendEmail_Photo_Attachments.java

    1. 发送一封只包含文本的简单邮件

    package cn.wz.util;
    
    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;
    
    /**
     * @ClassName: Sendmail
     * @Description: 发送一封只包含文本的简单邮件
     */
    public class SendEmail_text {
    	private static String mailFrom = null;// 指明邮件的发件人
    	private static String password_mailFrom = null;// 指明邮件的发件人登陆密码
    	private static String mailTo = null;	// 指明邮件的收件人
    	private static String mailTittle = null;// 邮件的标题
    	private static String mailText =null;	// 邮件的文本内容
    	private static String mail_host =null;	// 邮件的服务器域名
    	
    	public static void main(String[] args) throws Exception {
    		mailFrom = "test1@wz.com";
    		password_mailFrom="test";
    		mailTo = "test2@xk.com";
    		mailTittle="节日快乐2!";
    		mailText = "这是一个简单的邮件";
    		mail_host="wz.com";
    		
    		Properties prop = new Properties();
    		prop.setProperty("mail.host", mail_host);
    		prop.setProperty("mail.transport.protocol", "smtp");
    		prop.setProperty("mail.smtp.auth", "true");
    
    		// 使用JavaMail发送邮件的5个步骤
    
    		// 1、创建session
    		Session session = Session.getInstance(prop);
    		// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
    		session.setDebug(true);
    		// 2、通过session得到transport对象
    		Transport ts = session.getTransport();
    		// 3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
    		ts.connect(mail_host,mailFrom, password_mailFrom);
    		// 4、创建邮件
    		Message message = createSimpleMail(session,mailFrom,mailTo,mailTittle,mailText);
    		// 5、发送邮件
    		ts.sendMessage(message, message.getAllRecipients());
    		ts.close();
    	}
    
    	/**
    	 * @Method: createSimpleMail
    	 * @Description: 创建一封只包含文本的邮件
    	 */
    	public static MimeMessage createSimpleMail(Session session, String mailfrom, String mailTo, String mailTittle,
    			String mailText) throws Exception {
    		// 创建邮件对象
    		MimeMessage message = new MimeMessage(session);
    		// 指明邮件的发件人
    		message.setFrom(new InternetAddress(mailfrom));
    		// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
    		message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));
    		// 邮件的标题
    		message.setSubject(mailTittle);
    		// 邮件的文本内容
    		message.setContent(mailText, "text/html;charset=UTF-8");
    		// 返回创建好的邮件对象
    		return message;
    	}
    }
    

    2.发送包含内嵌图片的邮件

    package cn.wz.util;
    
    import java.io.FileOutputStream;
    import java.util.Properties;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    /**
     * @Description: 发送包含内嵌图片的邮件
     */
    public class SendEmail_photo {
    
    	private static String mailFrom = null;// 指明邮件的发件人
    	private static String password_mailFrom = null;// 指明邮件的发件人登陆密码
    
    	private static String mailTo = null; // 指明邮件的收件人
    
    	private static String mailTittle = null;// 邮件的标题
    
    	private static String mailText = null; // 邮件的文本内容
    
    	private static String mail_host = null; // 邮件的服务器域名
    
    	private static String photoSrc = null; // 发送图片的路径
    
    	public static void main(String[] args) throws Exception {
    
    		mailFrom = "test1@wz.com";
    		password_mailFrom = "test";
    		mailTo = "test2@wz.com";
    		mailTittle = "带图片的邮件";
    		mailText = "这是一封邮件正文带图片的邮件";
    		mail_host = "wz.com";
    		photoSrc = "resource\\images\\3.jpg";
    
    		Properties prop = new Properties();
    		prop.setProperty("mail.host", mail_host);// 需要修改
    		prop.setProperty("mail.transport.protocol", "smtp");
    		prop.setProperty("mail.smtp.auth", "true");
    		// 使用JavaMail发送邮件的5个步骤
    		// 1、创建session
    		Session session = Session.getInstance(prop);
    		// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
    		session.setDebug(true);
    		// 2、通过session得到transport对象
    		Transport ts = session.getTransport();
    		// 3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证
    		ts.connect(mail_host, mailFrom, password_mailFrom);// 需要修改
    		// 4、创建邮件
    		Message message = createImageMail(session);
    		// 5、发送邮件
    		ts.sendMessage(message, message.getAllRecipients());
    		ts.close();
    	}
    
    	/**
    	 * @Method: createImageMail
    	 * @Description: 生成一封邮件正文带图片的邮件
    	 * @param session
    	 * @return
    	 * @throws Exception
    	 */
    	public static MimeMessage createImageMail(Session session) throws Exception {
    		// 创建邮件
    		MimeMessage message = new MimeMessage(session);
    		// 设置邮件的基本信息
    
    		message.setFrom(new InternetAddress(mailFrom)); // 发件人
    
    		message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo)); // 收件人
    		// 邮件标题
    		message.setSubject(mailTittle);
    
    		// 准备邮件数据
    		// 准备邮件正文数据
    		MimeBodyPart text = new MimeBodyPart();
    		text.setContent(mailText + "<img src='cid:xxx.jpg'>", "text/html;charset=UTF-8");// 需要修改
    		// 准备图片数据
    		MimeBodyPart image = new MimeBodyPart();
    		DataHandler dh = new DataHandler(new FileDataSource(photoSrc));// 需要修改
    		image.setDataHandler(dh);
    		image.setContentID("xxx.jpg");// 需要修改
    		// 描述数据关系
    		MimeMultipart mm = new MimeMultipart();
    		mm.addBodyPart(text);
    		mm.addBodyPart(image);
    		mm.setSubType("related");
    
    		message.setContent(mm);
    		message.saveChanges();
    		// 将创建好的邮件写入到F盘以文件的形式进行保存
    		message.writeTo(new FileOutputStream("F:/Program Files/TestMail/ImageMail.eml"));// 需要修改
    		// 返回创建好的邮件
    		return message;
    	}
    }

    3.发送包含附件的邮件

    package cn.wz.util;
    
    import java.io.FileOutputStream;
    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    /**
     * @Description: 发送包含附件的邮件
     */
    
    public class SendEmail_attachments {
    
    	private static String mailFrom = null;// 指明邮件的发件人
    	private static String password_mailFrom = null;// 指明邮件的发件人登陆密码
    	private static String mailTo = null; // 指明邮件的收件人
    	private static String mailTittle = null;// 邮件的标题
    	private static String mailText = null; // 邮件的文本内容
    	private static String mail_host = null; // 邮件的服务器域名
    	private static String photoSrc = null; // 发送图片的路径
    	public static void main(String[] args) throws Exception {
    
    		mailFrom = "test1@wz.com";
    		password_mailFrom = "test";
    		mailTo = "test2@wz.com";
    		mailTittle = "JavaMail邮件发送测试";
    		mailText = "使用JavaMail创建的带附件的邮件";
    		mail_host = "wz.com";
    		photoSrc = "resource\\images\\5.jpg";
    
    		Properties prop = new Properties();
    		prop.setProperty("mail.host", mail_host);// 需要修改
    		prop.setProperty("mail.transport.protocol", "smtp");
    		prop.setProperty("mail.smtp.auth", "true");
    
    		// 使用JavaMail发送邮件的5个步骤
    		// 1、创建session
    		Session session = Session.getInstance(prop);
    		// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
    		session.setDebug(true);
    		// 2、通过session得到transport对象
    		Transport ts = session.getTransport();
    		// 3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证
    		ts.connect(mail_host, mailFrom, password_mailFrom);// 需要修改
    		// 4、创建邮件
    		Message message = createAttachMail(session);
    		// 5、发送邮件
    		ts.sendMessage(message, message.getAllRecipients());
    		ts.close();
    	}
    
    	/**
    	 * @Method: createAttachMail
    	 * @Description: 创建一封带附件的邮件
    	 */
    	public static MimeMessage createAttachMail(Session session) throws Exception {
    		MimeMessage message = new MimeMessage(session);
    
    		// 设置邮件的基本信息
    	
    		message.setFrom(new InternetAddress(mailFrom));	// 发件人
    		
    		message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));// 收件人
    		// 邮件标题
    		message.setSubject(mailTittle);
    
    		// 创建邮件正文,为了避免邮件正文中文乱码问题,需要使用charset=UTF-8指明字符编码
    		MimeBodyPart text = new MimeBodyPart();
    		text.setContent(mailText, "text/html;charset=UTF-8");
    
    		// 创建邮件附件
    		MimeBodyPart attach = new MimeBodyPart();
    		DataHandler dh = new DataHandler(new FileDataSource(photoSrc));// 需要修改
    		attach.setDataHandler(dh);
    		attach.setFileName(dh.getName());
    
    		// 创建容器描述数据关系
    		MimeMultipart mp = new MimeMultipart();
    		mp.addBodyPart(text);
    		mp.addBodyPart(attach);
    		mp.setSubType("mixed");
    
    		message.setContent(mp);
    		message.saveChanges();
    		// 将创建的Email写入到F盘存储
    		message.writeTo(new FileOutputStream("F:/Program Files/TestMail/ImageMail.eml"));// 需要修改
    		// 返回生成的邮件
    		return message;
    	}
    }

    4.发送包含内嵌图片和附件的复杂邮件

    package cn.wz.util;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;
    
    /**
     * @Description: 发送包含内嵌图片和附件的复杂邮件
     */
    
    public class SendEmail_Photo_Attachments {
    
    	private static String mailFrom = null;// 指明邮件的发件人
    	private static String password_mailFrom = null;// 指明邮件的发件人登陆密码
    	private static String mailTo = null; // 指明邮件的收件人
    	private static String mailTittle = null;// 邮件的标题
    	private static String mailText = null; // 邮件的文本内容
    	private static String mail_host = null; // 邮件的服务器域名
    	private static String photoSrc = null; // 发送图片的路径
    	private static List<String> fileList = new ArrayList<>(); // 发送附件的路径
    
    	public static void main(String[] args) throws Exception {
    		mailFrom = "test2@wz.com";
    		password_mailFrom = "test";
    		mailTo = "test3@wz.com";
    		mailTittle = "带附件和带图片的的邮件";
    		mailText ="xxx这是xxxx";
    		mail_host = "wz.com";
    		photoSrc = "resource\\images\\4.jpg";
    		fileList.add(0,"resource\\attachments\\a.7z");
    		fileList.add(1,"resource\\attachments\\b.7z");
    		
    
    		Properties prop = new Properties();
    		prop.setProperty("mail.host", mail_host);// 需要修改
    		prop.setProperty("mail.transport.protocol", "smtp");
    		prop.setProperty("mail.smtp.auth", "true");
    
    		// 使用JavaMail发送邮件的5个步骤
    		// 1、创建session
    		Session session = Session.getInstance(prop);
    		// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
    		session.setDebug(true);
    		// 2、通过session得到transport对象
    		Transport ts = session.getTransport();
    		// 3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证
    		ts.connect(mail_host, mailFrom, password_mailFrom);// 需要修改
    		// 4、创建邮件
    		Message message = createMixedMail(session);
    		// 5、发送邮件
    		ts.sendMessage(message, message.getAllRecipients());
    		ts.close();
    	}
    
    	/**
    	 * @Method: createMixedMail
    	 * @Description: 生成一封带附件和带图片的邮件
    	 */
    	public static MimeMessage createMixedMail(Session session) throws Exception {
    		MimeMessage message = new MimeMessage(session);
    		// 设置邮件的基本信息
    		message.setFrom(new InternetAddress(mailFrom));	// 发件人	
    		message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));// 收件人
    		message.setSubject(mailTittle);
    
    		// 正文
    		MimeBodyPart text = new MimeBodyPart();
    		text.setContent(mailText+"<br/><img src='cid:aaa.jpg'>", "text/html;charset=UTF-8");
    
    		// 图片
    		MimeBodyPart image = new MimeBodyPart();
    		image.setDataHandler(new DataHandler(new FileDataSource(photoSrc)));
    		image.setContentID("aaa.jpg");
    
    		// 附件1
    		MimeBodyPart attach = new MimeBodyPart();
    		DataHandler dh = new DataHandler(new FileDataSource(fileList.get(0)));
    		attach.setDataHandler(dh);
    		attach.setFileName(dh.getName());
    
    		// 附件2
    		MimeBodyPart attach2 = new MimeBodyPart();
    		DataHandler dh2 = new DataHandler(new FileDataSource(fileList.get(1)));
    		attach2.setDataHandler(dh2);
    		attach2.setFileName(MimeUtility.encodeText(dh2.getName()));
    
    		// 描述关系:正文和图片
    		MimeMultipart mp1 = new MimeMultipart();
    		mp1.addBodyPart(text);
    		mp1.addBodyPart(image);
    		mp1.setSubType("related");
    
    		// 描述关系:正文和附件
    		MimeMultipart mp2 = new MimeMultipart();
    		mp2.addBodyPart(attach);
    		mp2.addBodyPart(attach2);
    
    		// 代表正文的bodypart
    		MimeBodyPart content = new MimeBodyPart();
    		content.setContent(mp1);
    		mp2.addBodyPart(content);
    		mp2.setSubType("mixed");
    
    		message.setContent(mp2);
    		message.saveChanges();
    
    		message.writeTo(new FileOutputStream("F:/Program Files/TestMail/ImageMail.eml"));
    		// 返回创建好的的邮件
    		return message;
    	}
    }

     

    展开全文
  • Java邮件发送详解

    万次阅读 多人点赞 2019-08-13 09:06:30
    电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp....

    电子邮件

    要在网络上实现邮件功能,必须要有专门的邮件服务器。

    这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

    SMTP服务器地址:一般是 smtp.xxx.com比如163邮箱是smtp.163.comqq邮箱是smtp.qq.com

    电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能;
    在这里插入图片描述

    传输协议

    SMTP协议

    发送邮件:

    我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    POP3协议

    接收邮件:

    我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    邮件收发原理

    在这里插入图片描述

    1. 首先通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
    2. 网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的Smtp服务器
    3. QQ将接收到的邮件存储在545646733@qq.com这个邮件账号的空间中
    4. 再通过Pop3协议连接到Pop3服务器收取邮件
    5. 从545646733@qq.com这个邮件账号的空间中取出邮件
    6. Pop3服务器将取出来的邮件送出去

    注意】有可能填写的收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试

    Java发送邮件

    概述

    我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。

    使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework 。

    得到两个jar包:

    • mail.jar
    • activation.jar

    JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

    我们可以先尝试发送一封简单的邮件,首先请确保电脑可以连接网络。

    • 创建包含邮件服务器的网络连接信息的Session对象。
    • 创建代表邮件内容的Message对象
    • 创建Transport对象,连接服务器,发送Message,关闭连接

    主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序,如图所示:
    在这里插入图片描述

    纯文本邮件

    先在项目中导入jar包
    导入的就是在概述中提到的activation,jar和mail.jar包,如图所示:
    1563456199217.png

    QQ邮箱中获取对应的权限

    QQ邮箱需要安全验证,我们需要获取他对应的权限;

    进入QQ邮箱–>邮箱设置–>账户,下滑找到POP3/IMAP/SMTP/Exchange/CardDav/CalDav服务,开启POP3/SMTP服务,如图所示:
    在这里插入图片描述
    在这里插入图片描述
    记住这16位授权码,然后开始编写测试程序:

    import com.sun.mail.util.MailSSLSocketFactory;
    
    import java.util.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    
    public class SendEmail {
    
        public static void main(String[] args) throws Exception {
    
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");  设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //使用JavaMail发送邮件的5个步骤
    
            //创建定义整个应用程序所需的环境信息的 Session 对象
    
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
    
            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
    
            //2、通过session得到transport对象
            Transport ts = session.getTransport();
    
            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect("smtp.qq.com", "545646733@qq.com", "授权码");
    
            //4、创建邮件
    
            //创建邮件对象
            MimeMessage message = new MimeMessage(session);
    
            //指明邮件的发件人
            message.setFrom(new InternetAddress("545646733@qq.com"));
    
            //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
            message.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
    
            //邮件的标题
            message.setSubject("只包含文本的简单邮件");
    
            //邮件的文本内容
            message.setContent("你好啊!", "text/html;charset=UTF-8");
    
            //5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
    
            ts.close();
        }
    
    }
    

    带图片和附件的邮件

    先认识两个类一个名词:

    MIME(多用途互联网邮件扩展类型)

    MimeBodyPart类

    javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

    MimeMultipart类

    javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。

    1563462870340.png

    创建包含内嵌图片的邮件

    前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。
    代码如下:

    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import java.util.Properties;
    
    public class SendImageEmail {
        public static void main(String[] args) throws Exception {
    
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");  设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //使用JavaMail发送邮件的5个步骤
    
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
    
            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
    
            //2、通过session得到transport对象
            Transport ts = session.getTransport();
    
            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect("smtp.qq.com", "545646733@qq.com", "授权码");
    
            //4、创建邮件
    
            //创建邮件
            MimeMessage message = new MimeMessage(session);
    
            // 设置邮件的基本信息
            //发件人
            message.setFrom(new InternetAddress("545646733@qq.com"));
            //收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
            //邮件标题
            message.setSubject("带图片的邮件");
    
            // 准备邮件数据
    
            // 准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("src/resources/bz.jpg"));
            image.setDataHandler(dh);
            image.setContentID("bz.jpg");
    
            // 准备正文数据
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html;charset=UTF-8");
    
            // 描述数据关系
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text);
            mm.addBodyPart(image);
            mm.setSubType("related");
    
            //设置到消息中,保存修改
            message.setContent(mm);
            message.saveChanges();
    
            //5.发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }
    }
    

    带图片和附件的复杂邮件发送
    代码如下:

    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendFileMail {
        public static void main(String[] args) throws MessagingException, GeneralSecurityException {
    
            //创建一个配置文件保存并读取信息
            Properties properties = new Properties();
    
            //设置qq邮件服务器
            properties.setProperty("mail.host","smtp.qq.com");
            //设置发送的协议
            properties.setProperty("mail.transport.protocol","smtp");
            //设置用户是否需要验证
            properties.setProperty("mail.smtp.auth", "true");
    
    
            //=================================只有QQ存在的一个特性,需要建立一个安全的链接
            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
    
            //=================================准备工作完毕
    
            //1.创建一个session会话对象;
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("545646733@qq.com", "授权码");
                }
            });
    
            //可以通过session开启Dubug模式,查看所有的过程
            session.setDebug(true);
    
    
            //2.获取连接对象,通过session对象获得Transport,需要捕获或者抛出异常;
            Transport tp = session.getTransport();
    
            //3.连接服务器,需要抛出异常;
            tp.connect("smtp.qq.com","545646733@qq.com","授权码");
    
            //4.连接上之后我们需要发送邮件;
            MimeMessage mimeMessage = imageMail(session);
    
            //5.发送邮件
            tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //6.关闭连接
            tp.close();
    
        }
    
    
        public static MimeMessage imageMail(Session session) throws MessagingException {
    
            //消息的固定信息
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress("545646733@qq.com"));
            //邮件接收人,可以同时发送给很多人,我们这里只发给自己;
            mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("545646733@qq.com"));
            mimeMessage.setSubject("我也不知道是个什么东西就发给你了"); //邮件主题
    
    
            /*
            编写邮件内容
            1.图片
            2.附件
            3.文本
             */
    
            //图片
            MimeBodyPart body1 = new MimeBodyPart();
            body1.setDataHandler(new DataHandler(new FileDataSource("src/resources/yhbxb.png")));
            body1.setContentID("yhbxb.png"); //图片设置ID
    
            //文本
            MimeBodyPart body2 = new MimeBodyPart();
            body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");
    
            //附件
            MimeBodyPart body3 = new MimeBodyPart();
            body3.setDataHandler(new DataHandler(new FileDataSource("src/resources/log4j.properties")));
            body3.setFileName("log4j.properties"); //附件设置名字
    
            MimeBodyPart body4 = new MimeBodyPart();
            body4.setDataHandler(new DataHandler(new FileDataSource("src/resources/1.txt")));
            body4.setFileName(""); //附件设置名字
    
            //拼装邮件正文内容
            MimeMultipart multipart1 = new MimeMultipart();
            multipart1.addBodyPart(body1);
            multipart1.addBodyPart(body2);
            multipart1.setSubType("related"); //1.文本和图片内嵌成功!
    
            //new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
            MimeBodyPart contentText =  new MimeBodyPart();
            contentText.setContent(multipart1);
    
            //拼接附件
            MimeMultipart allFile =new MimeMultipart();
            allFile.addBodyPart(body3); //附件
            allFile.addBodyPart(body4); //附件
            allFile.addBodyPart(contentText);//正文
            allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;
    
    
            //放到Message消息中
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();//保存修改
    
    
            return mimeMessage;
    
        }
    
    }
    

    JavaWeb发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

    项目实现:

    1. 新建一个JavaWeb项目,配置tomcat的参数,然后添加jar包(记得在tomcat目录下的common目录下也导包,不然会报500错误),并且添加实体类User,Servlet类RegisterServlet,工具类Sendmail,如图所示:
      在这里插入图片描述
    2. User类代码如下:
    public class User {
    
        private String username;
        private String password;
        private String email;
    
        public User() {
        }
    
        public User(String username, String password, String email) {
            this.username = username;
            this.password = password;
            this.email = email;
        }
    
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }
    
    1. 前端注册页面register.jsp代码如下:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>注册</title>
    </head>
    <body>
    
    <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"><br/>
        邮箱:<input type="text" name="email"><br/>
        <input type="submit" value="注册">
    </form>
    
    </body>
    </html>
    
    1. 工具类Sendmail类代码如下:
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Properties;
    
    public class Sendmail extends Thread {
    
        //用于给用户发送邮件的邮箱
        private String from = "24736743@qq.com";
        //邮箱的用户名
        private String username = "24736743@qq.com";
        //邮箱的密码
        private String password = "授权码";
        //发送邮件的服务器地址
        private String host = "smtp.qq.com";
    
        private User user;
        public Sendmail(User user){
            this.user = user;
        }
    
        //重写run方法的实现,在run方法中发送邮件给指定的用户
        @Override
        public void run() {
            try{
                Properties prop = new Properties();
                prop.setProperty("mail.host", host);
                prop.setProperty("mail.transport.protocol", "smtp");
                prop.setProperty("mail.smtp.auth", "true");
    
                // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
                MailSSLSocketFactory sf = new MailSSLSocketFactory();
                sf.setTrustAllHosts(true);
                prop.put("mail.smtp.ssl.enable", "true");
                prop.put("mail.smtp.ssl.socketFactory", sf);
    
                //1、创建定义整个应用程序所需的环境信息的 Session 对象
                Session session = Session.getDefaultInstance(prop, new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        //发件人邮件用户名、授权码
                        return new PasswordAuthentication("24736743@qq.com", "授权码");
                    }
                });
    
                //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
                session.setDebug(true);
    
                //2、通过session得到transport对象
                Transport ts = session.getTransport();
    
                //3、使用邮箱的用户名和授权码连上邮件服务器
                ts.connect(host, username, password);
    
                //4、创建邮件
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(from)); //发件人
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
                message.setSubject("用户注册邮件"); //邮件的标题
    
                String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
    
                message.setContent(info, "text/html;charset=UTF-8");
                message.saveChanges();
    
                //发送邮件
                ts.sendMessage(message, message.getAllRecipients());
                ts.close();
            }catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    1. Servlet类RegisterServlet类代码如下:
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class RegisterServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                //接收用户请求,封装成对象
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                String email = request.getParameter("email");
                User user = new User(username,password,email);
    
                //用户注册成功之后,给用户发送一封邮件
                //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况;
                Sendmail send = new Sendmail(user);
                //启动线程,线程启动之后就会执行run方法来发送邮件
                send.start();
    
                //注册用户
                request.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
                request.getRequestDispatcher("info.jsp").forward(request, response);
            } catch (Exception e) {
                e.printStackTrace();
                request.setAttribute("message", "注册失败!!");
                request.getRequestDispatcher("info.jsp").forward(request, response);
            }
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    1. 配置web.xml,代码如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>register</servlet-name>
            <servlet-class>com.kuang.servlet.RegisterServlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>register</servlet-name>
            <url-pattern>/RegisterServlet.do</url-pattern>
        </servlet-mapping>
    </web-app>
    
    1. 编写反馈页面info.jsp,代码如下:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>提示信息</title>
    </head>
    <body>
        ${message}
    </body>
    </html>
    
    展开全文
  • Java实现邮件发送

    万次阅读 多人点赞 2019-08-22 14:05:18
    Java实现邮件发送 一、邮件服务器与传输协议 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱...

    Java实现邮件发送

    一、邮件服务器与传输协议

    • 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

    • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

    • SMTP协议

      通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    • POP3协议

      通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    二、Java发送邮件

    在这里插入图片描述
    使用到的jar包:

    • mail.jar
    • activation.jar

    QQ邮箱需获取相应的权限:

    QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
    在这里插入图片描述
    Java实现纯文本邮件发送

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendEamil {
        public static void main(String[] args) throws MessagingException, GeneralSecurityException {
            //创建一个配置文件并保存
            Properties properties = new Properties();
    
            properties.setProperty("mail.host","smtp.qq.com");
    
            properties.setProperty("mail.transport.protocol","smtp");
    
            properties.setProperty("mail.smtp.auth","true");
    
    
            //QQ存在一个特性设置SSL加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
    
            //创建一个session对象
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //开启debug模式
            session.setDebug(true);
    
            //获取连接对象
            Transport transport = session.getTransport();
    
            //连接服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //创建邮件对象
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
    
            //邮件接收人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("875203654@qq.com"));
    
            //邮件标题
            mimeMessage.setSubject("Hello Mail");
    
            //邮件内容
            mimeMessage.setContent("我的想法是把代码放进一个循环里","text/html;charset=UTF-8");
    
            //发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //关闭连接
            transport.close();
        }
    }
    

    Java实现文本图片附件复杂的邮件发送
    MIME(多用途互联网邮件扩展类型)

    MimeBodyPart类

    javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

    MimeMultipart类

    javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象

    package org.westos.email;
    
    import com.sun.mail.util.MailSSLSocketFactory;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.security.GeneralSecurityException;
    import java.util.Properties;
    
    public class SendComplexEmail {
        public static void main(String[] args) throws GeneralSecurityException, MessagingException {
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");  设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
    
            // QQ邮箱设置SSL加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
    
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //传入发件人的姓名和授权码
                    return new PasswordAuthentication("619046217@qq.com","16位授权码");
                }
            });
    
            //2、通过session获取transport对象
            Transport transport = session.getTransport();
    
            //3、通过transport对象邮箱用户名和授权码连接邮箱服务器
            transport.connect("smtp.qq.com","619046217@qq.com","16位授权码");
    
            //4、创建邮件,传入session对象
            MimeMessage mimeMessage = complexEmail(session);
    
            //5、发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    
            //6、关闭连接
            transport.close();
    
    
        }
    
        public static MimeMessage complexEmail(Session session) throws MessagingException {
            //消息的固定信息
            MimeMessage mimeMessage = new MimeMessage(session);
    
            //发件人
            mimeMessage.setFrom(new InternetAddress("619046217@qq.com"));
            //收件人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("619046217@qq.com"));
            //邮件标题
            mimeMessage.setSubject("带图片和附件的邮件");
    
            //邮件内容
            //准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            DataHandler handler = new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试图片.png"));
            image.setDataHandler(handler);
            image.setContentID("test.png"); //设置图片id
    
            //准备文本
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
    
            //附件
            MimeBodyPart appendix = new MimeBodyPart();
            appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\IdeaProjects\\WebEmail\\resources\\测试文件.txt")));
            appendix.setFileName("test.txt");
    
            //拼装邮件正文
            MimeMultipart mimeMultipart = new MimeMultipart();
            mimeMultipart.addBodyPart(image);
            mimeMultipart.addBodyPart(text);
            mimeMultipart.setSubType("related");//文本和图片内嵌成功
    
            //将拼装好的正文内容设置为主体
            MimeBodyPart contentText = new MimeBodyPart();
            contentText.setContent(mimeMultipart);
    
            //拼接附件
            MimeMultipart allFile = new MimeMultipart();
            allFile.addBodyPart(appendix);//附件
            allFile.addBodyPart(contentText);//正文
            allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
    
    
            //放到Message消息中
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();//保存修改
    
            return mimeMessage;
        }
    }
    
    

    JavaWeb发送邮件(网站注册成功发送提示邮件)

    1. User

      package org.westos.mail;
      
      public class User {
          private String name;
          private String password;
          private String mail;
      
          public User() {
          }
      
          public User(String name, String password, String mail) {
              this.name = name;
              this.password = password;
              this.mail = mail;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getPassword() {
              return password;
          }
      
          public void setPassword(String password) {
              this.password = password;
          }
      
          public String getMail() {
              return mail;
          }
      
          public void setMail(String mail) {
              this.mail = mail;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "name='" + name + '\'' +
                      ", password='" + password + '\'' +
                      ", mail='" + mail + '\'' +
                      '}';
          }
      }
      
      
    2. Servlet

      package org.westos.mail;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      public class Servlet extends javax.servlet.http.HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request,response);
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) {
              //处理前端请求
              String username = request.getParameter("username");
              String password = request.getParameter("password");
              String email = request.getParameter("email");
      
              //将信息封装进user对象
              User user = new User(username, password, email);
      
              SendMail sendMail = new SendMail(user);
              sendMail.start(); //开启线程
      
              request.setAttribute("msg","发送成功");
              try {
                  request.getRequestDispatcher("msg.jsp").forward(request,response);
              } catch (ServletException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
      
          }
      }
      
      
    3. SengMail

      package org.westos.mail;
      
      import com.sun.mail.util.MailSSLSocketFactory;
      
      import javax.mail.*;
      import javax.mail.internet.AddressException;
      import javax.mail.internet.InternetAddress;
      import javax.mail.internet.MimeMessage;
      import java.security.GeneralSecurityException;
      import java.security.PublicKey;
      import java.util.Properties;
      
      public class SendMail extends Thread {
          //发件人信息
          private String From = "619046217@qq.com";
          //发件人邮箱
          private String recipient = "619046217@qq.com";
          //邮箱密码
          private String password = "16位授权码";
          //邮件发送的服务器
          private String host = "smtp.qq.com";
      
          //收件人信息
          private User user;
          public SendMail(User user){
              this.user = user;
          }
      
          @Override
          public void run() {
              try {
                  Properties properties = new Properties();
      
                  properties.setProperty("mail.host","smtp.qq.com");
      
                  properties.setProperty("mail.transport.protocol","smtp");
      
                  properties.setProperty("mail.smtp.auth","true");
      
                  //QQ存在一个特性设置SSL加密
                  MailSSLSocketFactory sf = null;
                  try {
                      sf = new MailSSLSocketFactory();
                  } catch (GeneralSecurityException e) {
                      e.printStackTrace();
                  }
                  sf.setTrustAllHosts(true);
                  properties.put("mail.smtp.ssl.enable", "true");
                  properties.put("mail.smtp.ssl.socketFactory", sf);
      
                  //创建一个session对象
                  Session session = Session.getDefaultInstance(properties, new Authenticator() {
                      @Override
                      protected PasswordAuthentication getPasswordAuthentication() {
                          return new PasswordAuthentication(recipient,password);
                      }
                  });
      
                  //开启debug模式
                  session.setDebug(true);
      
                  //获取连接对象
                  Transport transport = null;
                  try {
                      transport = session.getTransport();
                  } catch (NoSuchProviderException e) {
                      e.printStackTrace();
                  }
      
                  //连接服务器
                  transport.connect(host,From,password);
      
      
                  //创建一个邮件发送对象
                  MimeMessage mimeMessage = new MimeMessage(session);
                  //邮件发送人
                  mimeMessage.setFrom(new InternetAddress(recipient));
      
                  //邮件接收人
                  mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
      
                  //邮件标题
                  mimeMessage.setSubject("网站注册成功");
      
                  //邮件内容
                  mimeMessage.setContent("网站注册成功,密码为"+user.getPassword()+",请妥善保管密码","text/html;charset=UTF-8");
      
                  //发送邮件
                  transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
      
                  transport.close();
      
              }catch (Exception e){
                  e.printStackTrace();
              }
      
          }
      
      }
      
      
      
    4. register.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>注册页面</title>
      </head>
      <body>
      
      <form action="${pageContext.request.contextPath}/a.do" method="post">
          <p>用户名:<input type="text" name="username" required></p>
          <p>密码:<input type="password" name="password" required></p>
          <p>邮箱:<input type="email" name="email" required></p>
          <p><input type="submit" value="提交"></p>
      </form>
      </body>
      </html>
      
      
    5. msg.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
      ${msg}
      </body>
      </html>
      
      
    6. web.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
          <servlet>
              <servlet-name>Servlet</servlet-name>
              <servlet-class>org.westos.mail.Servlet</servlet-class>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>Servlet</servlet-name>
              <url-pattern>/a.do</url-pattern>
          </servlet-mapping>
      </web-app>
      
    展开全文
  • 利用java实现发送邮件

    万次阅读 多人点赞 2018-11-04 17:44:53
    很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。电子邮件协议 电子邮件在网络中传输和网页...

    电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

    电子邮件协议
    电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
    JavaMail
    我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载,这里我从 JavaEE 官方的 Github 仓库下载。
    JavaMail 下载地址:https://github.com/javaee/javamail/releases
    最新的版本是 1.6.0 ,包含了 SMTP, IMAP, 和 POP3 协议的实现:

    如果是mvn项目的话,我们只需要添加依赖即可
    <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
    </dependency>
    创建一封简单的电子邮件
    邮件创建步骤:
    1. 创建一个邮件对象(MimeMessage);
    2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
    3. 设置邮件的主题(标题);
    4. 设置邮件的正文(内容);
    5. 设置显示的发送时间;
    6. 保存到本地。
    代码如下:

     

    public class TestMail {
        public static void main(String[] args) throws Exception {
            // 1. 创建一封邮件
            Properties props = new Properties();                // 用于连接邮件服务器的参数配置(发送邮件时才需要用到)
            Session session= Session.getInstance(props);        // 根据参数配置,创建会话对象(为了发送邮件准备的)
            MimeMessage message = new MimeMessage(session);     // 创建邮件对象
    
            /*
             * 也可以根据已有的eml邮件文件创建 MimeMessage 对象
             * MimeMessage message = new MimeMessage(session, new FileInputStream("myEmail.eml"));
             */
    
            // 2. From: 发件人
            //    其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
            //    真正要发送时, 邮箱必须是真实有效的邮箱。
            message.setFrom(new InternetAddress("email@send.com", "USER_AA", "UTF-8"));
    
            // 3. To: 收件人
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8"));
            //    To: 增加收件人(可选)
            message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
            //    Cc: 抄送(可选)
            message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
            //    Bcc: 密送(可选)
            message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));
    
            // 4. Subject: 邮件主题
            message.setSubject("邮件主题", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)
            message.setContent("这是邮件正文", "text/html;charset=UTF-8");
    
            // 6. 设置显示的发件时间
            message.setSentDate(new Date());
    
            // 7. 保存前面的设置
            message.saveChanges();
    
            // 8. 将该邮件保存到本地
            OutputStream out = new FileOutputStream("myEmail.eml");
            message.writeTo(out);
            out.flush();
            out.close();
        }
    }

    保存的 myEmail.eml 可以使用邮件客户端打开查看,实际上就是一堆符合SMTP协议格式的文本(内容使用base64进行了编码),也可用记事本打开,如下所示:

    发送电子邮件
    发送邮件首先需要有一个邮箱账号和密码,本文以网易126邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):

    代码实现:

     

    public class SendMail {
        // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
        // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
        //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
        public static String myEmailAccount = "xxxxxxx@126.com";
        public static String myEmailPassword = "xxxxxxxx";
    
        // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
        // 网易126邮箱的 SMTP 服务器地址为: smtp.126.com
        public static String myEmailSMTPHost = "smtp.126.com";
    
        // 收件人邮箱(替换为自己知道的有效邮箱)
        public static String receiveMailAccount = "xxxxxx@qq.com";
    
        public static void main(String[] args) throws Exception {
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    // 参数配置
            props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
    
            // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
            //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
            //     取消下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
            /*
            // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
            //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
            //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
            final String smtpPort = "465";
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            */
    
            // 2. 根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getInstance(props);
            // 设置为debug模式, 可以查看详细的发送 log
            session.setDebug(true);
    
            // 3. 创建一封邮件
            MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
    
            // 4. 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();
    
            // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
            //
            //    PS_01: 如果连接服务器失败, 都会在控制台输出相应失败原因的log。
            //    仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接,
            //    根据给出的错误类型到对应邮件服务器的帮助网站上查看具体失败原因。
            //
            //    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
            //           (1) 邮箱没有开启 SMTP 服务;
            //           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
            //           (3) 邮箱服务器要求必须要使用 SSL 安全连接;
            //           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
            //           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
            //
            transport.connect(myEmailAccount, myEmailPassword);
    
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
    
            // 7. 关闭连接
            transport.close();
        }
    
        /**
         * 创建一封只包含文本的简单邮件
         *
         * @param session     和服务器交互的会话
         * @param sendMail    发件人邮箱
         * @param receiveMail 收件人邮箱
         * @return
         * @throws Exception
         */
        public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
            // 1. 创建一封邮件
            MimeMessage message = new MimeMessage(session);
    
            // 2. From: 发件人
            message.setFrom(new InternetAddress(sendMail, "昵称", "UTF-8"));
    
            // 3. To: 收件人(可以增加多个收件人、抄送、密送)
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));
    
            // 4. Subject: 邮件主题
            message.setSubject("主题", "UTF-8");
    
            // 5. Content: 邮件正文(可以使用html标签)
            message.setContent("邮件正文", "text/html;charset=UTF-8");
                // 6. 设置发件时间
            message.setSentDate(new Date());
    
            // 7. 保存设置
            message.saveChanges();
    
            return message;
        }
    }

    下面我们对我们的代码解析一下:
    1、对应用程序配置邮件会话
    javax.mail.Session保存邮件系统的配置属性和提供用户验证的信息,发送email首先要获取session对象。
    (1)Session.getInstance(java.util.Properties)获取非共享的session对象
    (2)Session.getDefaultInstance(java.utilProperties)获取共享的session对象
    两者都必须建立Properties prop=new Properties()对象;
    注意:一般对单用户桌面应用程序使用共享Session对象。
    用SMTP协议发送Email时通常要设置mail.smtp.host(mail.protocol.host协议特定邮件服务器名)属性。

    prop.put("mail.smtp.host","smtp.mailServer.com");
    Session mailSession=Session.getInstance(prop);

    注意:在真正使用创建的过程中,往往会让我们验证密码,这是我们要写一个密码验证类。javax.mail.Authenticator是一个抽象类,我们要写MyAuthenticator的密码验证类,该类继承Authenticator实现:

    protected PasswordAuthentication getPasswordAuthentication(){
    return new PasswordAuthentication(String userName, String password);
    }

    这时我们创建Session对象:
    Session mailSession=Session.getInstance(prop,new MyAuthenticator(userName,Password));
    并且要设置使用验证:prop.put("mail.smtp.auth","true");
    使用 STARTTLS安全连接:prop.put("mail.smtp.starttls.enable","true");
    2、配置邮件会话之后,要编写消息
    要编写消息就要生成javax.mail.Message子类的实例或对Internet邮件使用javax.mail.interet.MimeMessage类。
    (1)建立MimeMessage对象
    MimeMessage扩展抽象的Message类,构造MimeMessage对象:
    MimeMessage message=new MimeMessage(mailSession);
    (2)消息发送者、日期、主题

    message.setFrom(Address theSender);
    message.setSentDate(java.util.Date theDate);
    message.setSubject(String theSubject);

    (3)设置消息的接受者与发送者(寻址接收)

    setRecipient(Message.RecipientType type , Address theAddress);
    setRecipients(Message.RecipientType type , Address[] theAddress);
    addRecipient(Message.RecipientType type , Address theAddress);
    addRecipients(Message.RecipientType type,Address[] theAddress);

    方法都可以指定接受者类型,但是一般用后两个,这样可以避免意外的替换或者覆盖接受者名单。定义接受者类型:
    Message.RecipientType.TO:消息接受者
    Message.RecipientType.CC:消息抄送者
    Message.RecipientType.BCC:匿名抄送接收者(其他接受者看不到这个接受者的姓名和地址)
    (4)设置消息内容
    JavaMail基于JavaBean Activation FrameWork(JAF),JAF可以构造文本消息也可以支持附件。
    设置消息内容时,要提供消息的内容类型-----即方法签名:
    MimeMessage.setContent(Object theContent,String type);
    也可以不用显式的制定消息的内容类型:MimeMessage.setText(String theText);

     

    注意:建立地址javax.mail.InternetAddress toAddress=new InternetAddress(String address);

     

     

    源码

    参考:

    http://blog.csdn.net/qq_32371887/article/details/72821291

    http://www.cnblogs.com/codeplus/archive/2011/10/30/2229391.html

    http://blog.csdn.net/xietansheng/article/details/51673073

    http://blog.csdn.net/xietansheng/article/details/51722660

    http://www.cnblogs.com/jiaguozhilian/p/5809815.html

    http://blog.csdn.net/karem/article/details/4646071

    http://blog.csdn.net/csh624366188/article/details/7183457

    http://www.cnblogs.com/Ant-soldier/p/6592858.html

    http://blog.csdn.net/shuaicihai/article/details/59484175

     

     

     

    展开全文
  • 图文并茂邮件实现、普通邮件发送演示、带附件的邮件发送的源码以及编写时所参考的相关资料和大家分享一下!
  • javaEmail发送邮件

    千次阅读 2019-03-28 11:58:49
    SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议。该协议定义了邮件客户端软件和SMTP服务器之间,以及两台SMTP服务器之间的通信规则。在Java Mail API中,基于Java Mail的程序将与本公司或Internet...
  • HtmlEmail发送邮件

    千次阅读 2018-10-15 15:18:15
    开启服务的时候会让你输入一个授权码,那个授权码就是你发送邮件时的密码,一定要记住! 2、导入相关包 &lt;dependency&gt;  &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;  &...
  • 电子邮件发送协议主要是SMTP,收件协议主要是POP3和IMAP; SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。...
  • python发邮件详解,smtplib和email模块详解

    万次阅读 多人点赞 2018-09-06 18:20:56
    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它...
  • Python自动发邮件

    千次阅读 2019-02-12 18:45:26
    获得授权码后将其写在下面程序中,然后就可以给自己的邮箱发邮件了# 使用QQ邮箱发送邮件 # Content是发送的内容,格式为{'header':'你的发送主题','text':'你的正文内容'} # HostUserName你自己
  • Python发邮件遇到的巨坑

    千次阅读 2020-06-17 21:52:29
    使用的是django框架,因为它已经封装好了发邮件的模块,想来不会太难。结果一试,553、553、553…然后,一天过去了… 1.使用QQ邮箱发邮件   上面提到的535,百度一查,说是没有开启POP3/SMTP服务的原因,登上qq...
  • [333]python自动发邮件总结及实例说明

    千次阅读 2019-12-14 15:34:20
    python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。 smtplib模块主要负责发送邮件:是一个发送邮件的...
  • 如何给苹果公司发邮件

    万次阅读 2017-07-11 09:41:39
    作为一名iOS开发人员,免不了和...作为解决问题的一种手段,当你遇到此类问题(苹果账号登录,AppleId,AppStore审核,被拒原因,其他技术问题),也可以通过发邮件这种途径来解决   一、登录苹果开发者官网,找到
  • 自动发邮件脚本

    千次阅读 2017-12-22 11:48:07
    在内网内连接服务器经常需要知道服务器的ip地址,那么有没有办法在开机的时候自动发邮件告诉我们呢?答案是肯定的。 系统 ubantu16.04 思路:利用系统初始化时启动的脚本执行一个发送邮件的python脚本查阅资料可以...
  • Windows下bat脚本自动发邮件

    千次阅读 2017-08-30 17:24:11
    摘要:说明:很多木马会利用自身的程序截取系统敏感文件或信息发往指定的邮箱,而blat并不是木马,它小巧却有强大的发邮件功能,可不要用它做违法事,感觉和木马功能有一拼!下面先看个具体的实例(在blat同目录创建...
  • jira的发邮件配置

    千次阅读 2017-11-05 17:49:18
    1. 先登录jira,然后在配置里面的系统,找到收发邮件设置; 2.我测试了好几个邮箱,qq,163,阿里邮箱,感觉就163没出错,不用配置什么,其他的好像都要配置一些设置的,所有我选择用...5.一般在用户邀请哪里,可以发邮件,我刚刚
  • 阿里云服务器不能发邮件解决方法

    万次阅读 2018-06-10 11:19:19
    特别注意阿里云的《25端口使用服务协议》: 我/我公司承诺并保证TCP 25端口仅用来连接第三方的SMTP服务器,从第三方的SMTP服务器外发邮件。如发现您使用本机IP直接SMTP发送邮件,有权永久性封禁TCP 25端口,并不再...
  • 发邮件+实习+简历+

    千次阅读 2018-03-20 16:17:24
    转载自面试求职那些事求职经1︱直投简历给HR,像这样发邮件,100%石沉大海!给HR直投邮件的几个要注意的点。做到这些,才算是给HR发了一封“得体”的邮件。1、发送邮箱:最好用新浪邮箱、网易邮箱发送;用QQ邮箱发送...
  • 阿里云服务器 discuz不能发邮件

    千次阅读 2017-10-30 20:23:31
    阿里云服务器现在不能通过25端口发邮件【推荐阅读:阿里云服务器不能发邮件(二)】,即不通过php函数的方式发邮件,很多人都有这个问题 今天帮一兄弟解决阿里云服务器discuz不能发邮件的问题,之前也有人找我帮忙...
  •  我在我做的邮箱系统中绑定了163邮箱,然后给我的gmail邮箱发邮件,gmail没有收到邮件。这时,心里大惊,我靠,不会是我系统出bug了吧!!用QQ邮箱发一遍,gmail收到了。这时更加慌张了,心想应该是我的系统bug了。...
1 2 3 4 5 ... 20
收藏数 250,722
精华内容 100,288
关键字:

发邮件