Java实现电子邮箱发送

邮件发送

邮件服务器与传输协议

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

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

SMTP协议:

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

POP3协议:

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

工作原理:

image

步骤:

①发信人调用用户代理来撰写和编辑要发送的邮件。用户代理用SMTP协议把邮件传送给发送方邮件服务器
发送方邮件服务器将邮件放入邮件缓存队列中,等待发送
③运行在发送方邮件服务器的SMTP客户进程,发现邮件缓存中有待发送的邮件,就向运行在接收方邮件服务器的SMTP服务器进程发起建立TCP连接
TCP连接建立后,SMTP客户进程开始向远程SMTP服务器进程发送邮件。当所有待发送邮件发完后,SMTP就关闭所建立的TCP连接。
⑤运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,将邮件放入收信人的用户邮箱,等待收信人在方便时进行读取。
收信人打算收信时,调用用户代理,使用POP3(或IMAP)协议将自己的邮件从接收方邮件服务器的用户邮箱中取回(如果邮箱中有来信的话)。

邮箱提供的支持:

我们需要到邮箱设置中开开启POP3/SMTP服务 , 获取授权码 , 如下以QQ邮箱为例,

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

image

Java第三方库

我们可以调用activation-1.1.1.jar , mail-1.4.7.jar 第三方库使用java实现发送邮箱功能

Maven导入:

 <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>javax.mail-api</artifactId>
      <version>1.6.2</version>
    </dependency>
  </dependencies>

工作流程:

image

代码实现:

普通文本邮件发送:
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class Demo1 {
    public static void main(String[] args) throws MessagingException {
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");///设置QQ邮件SMTP服务器
        properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication

        //以前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() {
                // 设置链接SMTP服务器的用户邮箱,即发送者的邮箱
                return new PasswordAuthentication("318482536@qq.com","邮箱厂商提供的校验码"); 
            }
        });

        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2.通过session得到transport对象
        Transport ts=session.getTransport();
        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","318482536@qq.com","邮箱厂商提供的校验码");

        //4.创建邮件:写文件
        //注意需要传递session
        MimeMessage message=new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("318482536@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("318482536@qq.com"));
        //邮件标题
        message.setSubject("邮件标题");
        //邮件的文本内容
        message.setContent("文件内容","text/html;charset=UTF-8");
        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();
    }
}
文本内嵌图片邮件发送:

多用途互联网邮件扩展(英语:Multipurpose Internet Mail Extensions,缩写:MIME)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:

image

在上面普通文本文件的基础上,在设置邮件内容时,追加如下代码即可

//设置邮件的文本内容
        //=================================准备图片数据=======================================
        MimeBodyPart image=new MimeBodyPart();
        //图片需要经过数据化的处理
        DataHandler dh=new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg"));
        //在part中放入这个处理过图片的数据
        image.setDataHandler(dh);
        //给这个part设置一个ID名字
        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());
        //6.关闭连接
        ts.close();
附件邮件发送:

在普通本文邮件的基础上添加如下内容即可:

/*************设置邮件的文本内容***********************/
        //正文
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封带有附件的邮件","text/html;charset=utf-8");

        //附件
        MimeBodyPart appendix = new MimeBodyPart();
        appendix.setDataHandler(new DataHandler(new FileDataSource("E:\\幼年神里凌华.jpeg")));
        appendix.setFileName("附件文件名.jpeg");

//      拼接邮件内容
        MimeMultipart allContent = new MimeMultipart();
        allContent.addBodyPart(appendix);//附件
        allContent.addBodyPart(text);//正文
        allContent.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
        
        message.setContent(allContent);
        message.saveChanges();

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();
封装好的工具类:
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class MailUtil {

    public String addresser; //发送者邮箱名
    public String hostName;  // 邮箱主机名

    private String checkCode;  // 校验码
    private Properties properties;  // 配置
    private Session session;
    private Transport transport;
    private boolean isDebug = false;


    // 默认用QQ发送
    public void properties(){
        properties("smtp.qq.com");
    }
    //配置需要发送的邮箱类型,QQ ,163等
    public  void properties(String mailHost){
        this.hostName = mailHost;
        properties = new Properties();
        properties.setProperty("mail.host",mailHost);///设置QQ邮件SMTP服务器
        properties.setProperty("mail.transport.protocol","smtp");//邮件发送协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户密码 authentication
    }

    //设置发送者的邮箱信息,如邮箱名, 校验码,是否打印deBug日志
    public void senderInfo(String addresser,String checkCode,boolean isDebug) throws MessagingException {
        this.addresser = addresser;
        this.checkCode = checkCode;
        this.session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(addresser,checkCode);
            }
        });
        this.transport = session.getTransport();
        this.transport.connect(addresser,checkCode);
    }

    // 发送普通文本邮件
    public void sendTextMailMessage(String recipients,String mailTitle,String mailContent) throws MessagingException {
        MimeMessage message=new MimeMessage(this.session);
        //设置邮件的发件人
        message.setFrom(new InternetAddress(this.addresser));
        //设置邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(recipients));
        //邮件标题
        message.setSubject(mailTitle);
        //邮件的文本内容
        message.setContent(mailContent,"text/html;charset=UTF-8");
        //5.发送邮件
        this.transport.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        this.transport.close();
    }

}

通过工具类使用:

// 1.创建工具类对象
MailUtil mailUtil = new MailUtil();
// 2.设置服务器主机名
mailUtil.properties();  //默认用QQ邮箱发送,也可以通过有参方法设置别的邮箱发送,设置成别的邮箱服务器主机名即可
//mailUtil.properties("服务器主机名");
// 3.设置发送邮件的相关信息
mailUtil.senderInfo("发送者的邮箱名","邮箱服务厂商提供的校验码",true); //设置发送者的信息
mailUtil.sendTextMailMessage("收件人的邮箱名","邮件标题","邮件内容");  // 设置需要发送的内容标题等信息
posted @ 2022-04-22 21:57  南城小友  阅读(462)  评论(0编辑  收藏  举报