用JAVA实现电子邮件的发送——JAVA Email
邮件协议
pop3协议
pop3的标准全称为《邮政总局电报数据传输程序——第版》,即《邮局电报数据传输程序》版本三。该标准属于TCP/IP协议家族的一员,并由RFC标准编号198规定。本技术规范主要用于支持客户端远程管理服务器上的电子邮件存储服务功能。该规范还提供了采用SSL加密的POP3版本称为POPSSS方案?具体而言,在此规范下实现的是离线邮件存储和删除功能服务?而POPSSS服务则是一个基于该规范的邮件接收服务器实现方案?它是互联网邮件传输的第一个离线存储方案标准?在这一规范下实现的是从服务器上将邮件本地化存储,并且能够删除保存在邮件服务器中的相关邮件文件的功能;而相应的接收邮件功能则由遵循该规范的接收邮件服务器(即POPSSS服务器)来完成。
SMTP协议:
SMTP(Simple Mail Transfer Protocol)是一种规范性文件,在通信领域具有重要地位。作为TCP/IP协议家族的重要成员之一,在全球范围内的电子邮件传递过程中发挥着关键作用。其运行机制就是帮助发送者和接收者快速找到对方所在的服务器节点。基于该协议构建的系统负责将用户的邮件发送至指定收件人地址,并通过其运行机制实现邮件中转过程的管理。为了确保系统的安全性与可靠性,在建立连接前必须进行身份验证流程——即所谓的认证环节——只有经过验证才能接入服务端口。这种认证机制的设计初衷是为了防止未授权用户接入系统的行为,并且在这一过程中起到了有效打击非法传播垃圾信息的作用
IMAP协议:
IMAP的全称是Internet Mail Access Protocol(IMP),它与POP3等其他邮件访问标准协议中的一种具有相似性。值得注意的是,在开启IMAP服务后,在您的电子邮件客户端接收的邮件仍然保留在服务器上,并且所有在客户端上的操作都会实时反馈到服务器端进行处理。例如,在浏览器或客户端软件登录邮箱后删除一封邮件、设置为已读等操作都会导致服务器相应地执行删除或标记已读的动作。因此,在使用任何邮箱服务时无需担心状态同步的问题
IMPA协议和POP3协议和区别:
该协议使客户端能够下载服务器存储的邮件。但这些操作(例如将邮件移动至其他文件夹或标记为已读)不会影响到服务器。例如,在接收这三封邮件后将它们转移至其他文件夹,则在客户端进行操作后,这些邮件并未同步地从服务器上转移。
该系统支持WebMail与电子邮件客户端之间的双向通信机制。各个客户端的操作结果会被服务器响应。对于发送或接收邮件的行为而言,在发送邮件时服务器会生成新的邮件条目,并在接收邮件时更新用户的收件箱列表。
发送邮件具体代码实现:
在发送邮件之前(段落保持不变),每次都会启动Session连接(句子结构调整),这里推荐创建一个名为JavaMailUtils的工具类(词汇替换)。每当创建Session连接时(动词时态变化),只需要调用createSession()方法(主动被动转换),这样就能让整个流程更加便捷(表达方式优化)。值得注意的是(引导词加入),小编使用的是网易邮箱(具体信息补充),在发送邮件之前(时间关联词优化),为了确保密码的安全性(逻辑关系加强),可以在官网上申请获取认证凭证(动词形式变化)。使用Properties对象来管理这些配置项(概念相近替代),实际上它是一个映射集合(同义词替换)。例如:主机名、主机端口号等信息可以通过该对象进行管理(列举变详细列举)。例如:是否需要用户认证、是否启用TLS加密等关键设置都可以通过该对象进行配置管理(补充细节增强描述)。例如:例如:包含以下几点内容如主机名、端口号等基础信息)
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class JavaMailUtils {
public static Session createSession() {
//SMTP服务器地址
String smtp = "smtp.163.com";
//邮箱账号密码(授权密码)
String userName = "***********@163.com";
String password = "************";
// 连接到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() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName , password);
}
});
// 开启调试模式:
session.setDebug(true);
System.out.println(session);
return session;
}
}
发送普通邮件:
在发送邮件时,我们应先创建一个Message对象,并通过调用Transport.send(Message)来完成整个邮件发送过程。绝大多数邮件服务器要求发件地址与登录用户名需保持一致以确保成功发送;否则会导致无法成功发送。
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Test3 {
public static void main(String[] args) {
try {
//创建session会话
Session session = JavaMailUtils.createSession();
//创建邮件对象(Mession抽象类的子类对象)
MimeMessage msg = new MimeMessage(session);//传入session
msg.setFrom(new InternetAddress("*************@163.com"));//发件人邮箱
msg.setRecipient(RecipientType.TO,
new InternetAddress("********@qq.com"));//收件人邮箱
msg.setSubject("这是一份测试邮件"+"utf-8");
msg.setText("爱你孤身走<b>暗巷</b>","utf-8","html");
//发送
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
发送邮件并带有附件:
要在电子邮件中携带附件,则不能直接调用 message setText 方法。
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import java.io.FileInputStream;
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.Message.RecipientType;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
public class Test4 {
public static void main(String[] args) throws IOException {
try {
//创建session会话
Session session = JavaMailUtils.createSession();
//创建邮件对象(Mession抽象类的子类对象)
MimeMessage msg = new MimeMessage(session);//传入session
msg.setFrom(new InternetAddress("******@163.com"));//发件人邮箱
msg.setRecipient(RecipientType.TO,
new InternetAddress("********@qq.com"));//收件人邮箱
msg.setSubject("这是一份测试邮件","utf-8");
//邮件内容"复合"对象
Multipart multipart = new MimeMultipart();
//正文
BodyPart textPart = new MimeBodyPart();
//参数1:正文内容
//参数2:内容类型;字符编码集
textPart.setContent("当我看花瓣<b>脱离</b>花蕊慢慢萎",
"text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("li.jpg");//设置附件的文件的显示格式
//数据处理对象(读取附件文件从本地磁盘进行读取)
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(
Paths.get("D:\ ***\ ***.jpg")), //发送图片的位置
"application/octet-stream")));
//添加至邮件内容
multipart.addBodyPart(textPart);//添加正文
multipart.addBodyPart(imagePart);//添加附件
//设置邮件内容
msg.setContent(multipart);
//发送
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
发送内嵌图片的HTML邮件:
若要在HTML邮件中嵌入图像,则可采用插入标记语的方式实现;具体操作时需遵循以下步骤:首先确定文件标识符并将其赋值给变量;然后使用<img src="cid:文件标识">语法将图像插入到目标位置;最后通过调用相关函数完成整个过程;特别提示:为确保效果,请避免在src字段前后留有空白字符;另外建议使用标准的HTTP头参数格式进行配置以获得最佳效果
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
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.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
public class Test5 {
public static void main(String[] args) {
Session session = JavaMailUtils.createSession();
try {
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("******@163.com"));//发件人邮箱
msg.setRecipient(RecipientType.TO,
new InternetAddress("********@qq.com"));//收件人
msg.setRecipient(RecipientType.CC,
new InternetAddress("*********@qq.com"));//抄送人
msg.setSubject("这是一份测试邮件","utf-8");
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>海贼王路飞</h1>");
body.append("<img src=\"cid:haizi\"/>");
textBodyPart.setContent(body.toString(), "text/html;charset=utf-8");
//邮件附件部分
BodyPart imageBodyPart = new MimeBodyPart();
imageBodyPart.setFileName("lufei.jpg");//附件名称
imageBodyPart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(
Paths.get("D:\ test\ 16038656526110945.jpg")), //图片位置
"application/octet-stream")));
imageBodyPart.setHeader("Content-ID", "<haizi>");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart);//添加正文
multipart.addBodyPart(imageBodyPart);//添加附件
//设置邮件内容
msg.setContent(multipart);
//发送
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
