JAVA怎么来发送邮件的(JAVA Email)

发布于:2022-07-17 ⋅ 阅读:(297) ⋅ 点赞:(0)

邮件想必大家都耳熟能详,也知道具体的流程,其实和现在的寄快递差不多,比如说你要把一件东西邮到上海的一个朋友手里,你是西安人,你先把你的包裹信息填好给西安的邮递公司,再又西安的邮递公司转手送到上海,这是时候就是等你朋友过来取了对不对,就是一个流程一个流程来的,用JAVA发送邮件也是一样的,接下来我们用一个图片来简单的说明一下。

 MUA邮件软件;全称Mail  User Agent意思给用户提供邮件代理的。

MTA邮件服务器;全称 Mail  Transfer  Agent 意思是提供邮件中转服务。

MDA最终到达邮件服务器:全称 Mail Delivery Agent 意思邮件到达代理的地方,一旦电子邮件到达MDA就不动了,等着收件人过来取。

快递有快递的规矩,比如快递不能有一些易燃易爆的东西,危险的东西,JavaEmail也是,其他电子邮箱也是也有他们对应的规定。接下来我们介绍一下邮件协议,常见的协议有POP3,SMTP,IMAP.

POP3:是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到internet的邮件服务器和下载电子邮件的电子协议。件服务器上的它是因特网电子邮件的第一个离线协议标准POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

SMTP:的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。

IMAP;IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的.

第一;在发送邮件之前我们得先准备SMTP登录信息,就是编写一个MUA软件把邮件发送到MTA上,在这个过程中发送邮件的协议就是SMTP,发的时候我们的确定MTA的地址和端口号。邮件地址一般是smtp.example.com    至于端口号是有邮件服务商提供的在这我们以126邮箱为例,他的地址smtp.126.com,对应的端口号是25,其他的邮件软件地址和端口如下

 第二:首先我们得先连接到126的服务器上,一端口25为例创建properties对象,目的是填相关得到信息就好比你寄快递你的写寄件人,收件人呀什么的,然后获取Session实例,然后具体的解释代码里有注解。把连接服务器和创建Session对象写在JavaSessionmail类的creat方法里是为了方便,不用重复的写。

package emile.com;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class JavaSessionmail {
	public static Session creat() {
		/**
		 * 创建Session(会话 )
		 */
		// SMTP服务器地址
		String smtp = "smtp.126.com";
		// 邮箱账号和密码
		String userName = "ouwengogo@126.com";
		String password = "DUJSCJKTATITPXNUBP";
		// SMTP服务器的连接信息
		Properties pros = new Properties();
		pros.put("mail.smtp.host", smtp);// SMPT主机名
		pros.put("mail.smtp.port", "25");// 主机端口号
		pros.put("mail.smtp.auth", "true");// 是否需要认证
		pros.put("mail.smtp.starttls.enable", "true");// 启动TLS加密

		Session session = Session.getInstance(pros, new Authenticator() {

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

		});
		//启动Debug模式遍历调试
		session.setDebug(true);
		
		return session;
	}
}

第三:就是发送邮件啦,但是我们在发送时候构造一个Message对象然后调用Transport.send(msg)方法就可以发送了,具体使用的方法在代码里,也有相对于的注解

package emile.com;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

public class Sentmail01 {
	public static void main(String[] args) {

		try {
			// 创建Session回话
			Session session = JavaSessionmail.creat();
			// 创建邮箱对象(Message抽象类的子类)
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("ouwengogo@126.com"));// 发送者是来自哪里
			msg.setRecipient(RecipientType.TO, new InternetAddress("251909651250@qq.com"));//收件是谁
			msg.setSubject("你被警察通缉了", "utf-8");// 邮件的标题
			msg.setText("立马束手就擒,我是你爹", "utf-8");//正文内容
			// 发送邮件
			Transport.send(msg);
		} catch (MessagingException e) {

			e.printStackTrace();
		}
	}
}

接下来我们就可以在控制太看到如下代码代表你发送邮件成功了,因为你在创建Session对象是后调用debug调试模式

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.126.com", port 25, isSSL false
220 126.com Anti-spam GT for Coremail System (126com[20140526])
DEBUG SMTP: connected to host "smtp.126.com", port: 25

EHLO DESKTOP-V13H850
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrAVC3lUCa0xDrUUUUj
250-STARTTLS
250-ID
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrAVC3lUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ID", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
STARTTLS
220 Ready to start TLS
EHLO DESKTOP-V13H850
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UF8RndZUCa0xDrUUUUj
250-STARTTLS
250-ID
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UF8RndZUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ID", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<billgogoogooo@126.com>
250 Mail OK
RCPT TO:<55094839@qq.com>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   55094839@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>
From: billgogoogooo@126.com
To: 55094839@qq.com
Message-ID: <186370029.0.1655292470948.JavaMail.apple@DESKTOP-V13H850>
Subject: Hello
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

Hi Xiaoming...
.
250 Mail OK queued as smtp2,DMmowAC3Hv9HwqlibNsyDQ--.51230S3 1655292488
QUIT
221 Bye

3.3发送HTML邮件:再比如说在这个的基础上需要做一些格式,让某个字或者某些字变粗,可以实现如下代码

msg.setText("立马束手就擒,我是你<b>爹</b>", "utf-8","html");//还有其他格式(爹变粗)

3.4发送附件:再比如说你在发送正文的同时还想发送一些附件如照片啊什么的实现的代码就需要构造一个Multpart对象,一个Multpart对象可以添加若干个bodypart,一个可以代表是文本一个可以代表是附件BodyPart 依靠 setContent()决定添加的内容。用setcontent("...","text/plain;chars et=utf-8”)添加纯文本,

setcontent("...","text/html;charset=utf-8'?添加HTML文本。

如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个 DataHandler(),传入文件的MIME类型。二进制文件可以用 application/octet-stream,Word文档则是application/msword。
最后,通过 setContent()把 Multipart 添加到 Message 中,即可发送。(代码里有相应方法的注解)

package emile.com;

import java.io.IOException;

import java.nio.file.Files;
import java.nio.file.Paths;

import javax.activation.DataHandler;

import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class Sentmail03 {
	public static void main(String[] args) {
		try {
			// 创建Session回话
			Session session = JavaSessionmail.creat();
			// 创建邮箱对象(Message抽象类的子类)
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("ouwengogo@126.com"));// 是谁发的
			msg.setRecipient(RecipientType.TO, new InternetAddress("25***99620@qq.com"));
			msg.setSubject("你被张警官通缉了", "utf-8");// 邮件的标题

			// 邮件内容“复合”对象			
			Multipart multipart=new MimeMultipart();		
			//正文
			BodyPart textpart=new MimeBodyPart();
			//参数一正文内容
			//参数二是内容类型,字符内容	
			textpart.setContent("我在练习java编程,不要试图猜测我是谁,要猜就是你<b>爹</b>", "text/html;charset=utf-8");
			
			//附件
			BodyPart imgepart=new MimeBodyPart();
			imgepart.setFileName("zhy.jpg");//设置附件文件的显示名称	
			imgepart.setDataHandler(new DataHandler
					(new ByteArrayDataSource//字节数组源
							(Files.readAllBytes//将拿到的图片变成字节数组
									(Paths.get("C:\\pic\\pic1\\zhy.JPEG")),//图片的路径
									"application/octet")));//ttp的一种协议	
			//添加至邮箱内容
			multipart.addBodyPart(textpart);//添加正文
			multipart.addBodyPart(imgepart);//从    添加附件		
			msg.setContent(multipart);			
			Transport.send(msg);
		} catch (MessagingException e) {

			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到