锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

JAVA Emaile

时间:2023-11-04 22:37:01 uxr抗硫化厚膜芯片电阻

电子邮件是用户电脑的电子邮件软件,比如 Outlook ,可以通过多个邮件服务发送到邮件服务器 最终到达对方邮件服务器时,收件人可以用软件接收邮件:

我们把类似 Outlook 这种邮件软件叫 MUA : Mail User Agent ,意思是为用户服务的邮件代理;邮件服务器称为 MTA : Mail Tra nsfer Agent ,意思是邮件中转代理;最终到达的邮件服务器称为 MDA : Mail Delivery Agent ,意思是邮件到达的代理。一旦电子邮件 到达MDA,就不再动了。一旦电子邮件 到达MDA,不再动了。事实上,电子邮件通常存储在MDA服务器的硬盘上,然后等收件人通过软件或者登陆浏览器查看邮件

邮件协议:

MTA 和 MDA 这种服务器软件通常是现成的,我们通常不关心这些邮件服务器的内部是如何运行的。更多的需求场景需要 发邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议包括: POP3 、 SMTP 、 IMAP 。

POP3:

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

SMTP:

SMTP 的全称是“Simple Mail Transfer Protocol即简单的邮件传输协议。它是从源地址到目的地地址传输邮件的一组规范 中转邮件的方式。SMTP 协议属于 TCP/IP 协议簇帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器遵循 SMTP 发送协议邮件服务器。 SMTP 简单地说,认证需要在提供账户名和密码后才能登录 SMTP 服务器,这使得垃圾邮件的传播者没有机会。 增加 SMTP 认证的目的是防止用户被垃圾邮件入侵。

IMAP:

IMAP全称是Internet Mail Access Protocol,即交互式电子邮件访问协议,它与POP类似邮件访问标准协议之一。不同的是,它打开了IMAP 之后,您在电子邮件客户端收到的电子邮件仍然保留 在服务器上,客户端上的操作会反馈给服务器,如删除邮件、标记已读、服务器 上的邮件也会做相应的动作。因此,无论是从浏览器还是客户端登录邮箱 软件登录邮箱,看到的邮件和状态一致。

IMAP和POP3有什么区别:

POP3协议允许电子邮件客户下载服务器上的电子邮件,但客户操作(如移动电子邮件、标记已读等)不会反馈给服务器,如通过客户收集 将邮箱中的三封邮件移动到其他文件夹中,邮箱服务器上的邮件不同时移动 。

IMAP提供webmail 对于与电子邮件客户端的双向通信,客户端的操作将反馈给服务器。对于电子邮件的操作,服务器上的电子邮件也将相应移动 作。

相关协议端口:


因此,当我们关心如何实现邮件发送时,我们实际上是在编写一个 MUA 发送邮件的软件 MTA 上。 MUA 到 MTA 发邮件的协议是 SMTP 协 议,它是 Simple Mail Transport Protocol 使用标准端口的缩写 25 ,也可使用加密端口 465 或 587 。 SMTP 协议是基于的 T CP 任何程序发送电子邮件都必须遵守上述协议 SMTP 协议。使用 Java 当程序发送电子邮件时,我们不需要关心 SMTP 只需使用协议的底层原理 Ja vaMail 这个标准 API 邮件可以直接发送。

准备SMTP登录信息

假设我们要用自己的邮件地址 me@example.com 给令狐冲发邮件,已知令狐冲的邮件地址是 xiaoming@somewhere.com ,发 在发送邮件之前,我们必须首先确定它 MTA 邮件服务器地址及端口号。邮件服务器地址通常是 smtp.example.com ,邮件服务提供商提供端口号 确定使用 25 、 465 还是 587 。

常用的邮件服务提供商 SMTP 信息:

QQ邮箱 :SMTP服务器是 smtp.qq.com ,端口是 465 / 587

163邮箱 :SMTP服务器是 smtp.163.com ,端口是 465

126邮箱 :SMTP服务器是 smtp.126.com ,端口是 25

Gmail邮箱 :SMTP服务器是 smtp.gmail.com ,端口是 465 / 587

准备好SMTP登录信息后,我们必须首先检查 JavaMail 相关的依赖 Jar 包 javax.mail-1.6.2.jar 加入当前项目。准备好。SMTP登录信息后,我们必须首先检查 JavaMail 相关的依赖 Jar 包 javax.mail-1.6.2.jar 加入当前项目。

// 服务器地址: String smtp = "smtp.126.com";  // 登录用户名: String username = "billgogoogooo@126.com";  // 登录口令: String password = "P***YKKUUCAAXTEUVUI";  // 连接到SMTP服务器25端口: Properties props = new Properties(); props.put("mail.smtp.host", smtp); // SMTP主机名 props.put("mail.smtp.port", "25"); // 主机端口号 props.put("mail.smtp.auth", "true"); // 是否需要用户认证 props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密  // 获取Session实例: Session session = Session.getInstance(props, new Authenticator() {     protected PasswordAuthentication getPasswordAuthentication() {         return new PasswordAuthentication(username, password);     } }); // 设置debug调试方便: session.setDebug(true);

发送邮件

当我们发送时,我们需要构建一个 Message 对象,然后调用 Transport.send(Message) 完成发送:绝大多数邮件服务器需要发送方地址和登录 用户名必须一致,否则发送将失败

try {     MimeMessage message = new MimeMessage(session);     // 设置发送方地址:     message.setFrom(new InternetAddress("billgogoogooo@126.com"));     // 设置接收方地址:     message.setRecipient(Message.RecipientType.TO, new InternetAddress("55094839@qq.com"));     // 设置邮件主题:     message.setSubject("Hello", "UTF-8");     // 设置邮件文本:     message.setText("Hi Xiaoming...", "UTF-8");     // 发送:     Transport.send(message); } catch (AddressException e) {     e.printStackTrace(); } catch (MessagingException e) {     e.printStackTrace(); }

填写真实地址并运行上述代码。我们可以在控制台上看到它JavaMail打印调试信息:

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 8BTMIME
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:
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 .
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

 从上面的调试信息可以看出,SMTP协议是一个请求-响应协议,客户端总是发送命令,然后等待服务器响应。服务器响应总是以数字开头,后面 的信息才是用于调试的文本。这些响应码已经被定义在 SMTP 协议中了,查看具体的响应码就可以知道出错原因。

 

 发送HTML邮件:

message.setText(body, "UTF-8", "html");

发送附件:

要在电子邮件中携带附件,我们就不能直接调用 message.setText() 方法,而是要构造一个 Multipart 对象:

// 创建MimeMessage邮件信息对象
// ...略

// 创建Multipart复合对象
Multipart multipart = new MimeMultipart();

// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body, "text/html;charset=utf-8");
multipart.addBodyPart(textpart);

// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName(附件名称);
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件流字节数组, "application/octet-stream")));
multipart.addBodyPart(imagepart);

// 设置邮件内容为multipart:
message.setContent(multipart);

一个 Multipart 对象可以添加若干个 BodyPart ,其中第一个 BodyPart 是文本,即邮件正文,后面的 BodyPart 是附件。 BodyPa rt 依靠 setContent() 决定添加的内容,如果添加文本,用 setContent("...", "text/plain;charset=utf-8") 添加纯文本,或者用 setContent("...", "text/html;charset=utf-8") 添加 HTML 文本。如果添加附件,需要设置文件名(不一定和真实文件名一致), 并且添加一个 DataHandler() ,传入文件的 MIME 类型。二进制文件可以用 application/octet-stream ,Word文档则是 applicati on/msword 。 最后,通过 setContent() 把 Multipart 添加到 Message 中,即可发送。

小节:

使用 JavaMail API 发送邮件本质上是一个 MUA 软件通过 SMTP 协议发送邮件至 MTA 服务器

打开调试模式可以看到详细的 SMTP 交互信息

某些邮件服务商需要开启 SMTP ,并需要独立的 SMTP 登录密码 。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章