文章目录

  • 一、前言
  • 二、准备
  • 三、代码
  • 更多文章



一、前言

在写一些项目时(比如涉及到账号需要找回),我们不可避免需要用上邮件,而实际上java可以通过代码直接实现自动发邮件。

: 本文使用的发件邮箱为网易163邮箱,若使用QQ邮箱则需要在代码中加入一段SSL加密的代码,请注意(仅QQ邮箱需要,请注意代码中的注释块)。至于收件邮箱没有要求。

二、准备

如果使用Maven,请在pom中加入以下依赖:

<dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.1</version>
  </dependency>
  
  <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.4.4</version>
  </dependency>
</dependencies>

如果和本文一样使用常规javaee开发,请下载以下两个jar:

然后将两个jar添加到模块的库(libs)。


接下来,确定发件邮箱的smtp地址(一般为smtp.xxx.com如smtp.163.com,ping一下看能否连上即可。qq邮箱的是smtp.qq.com)。

然后开启IMAP和POP3服务(以下以163邮箱为例):

邮箱主页点击上方设置按钮

java发送邮箱带图片工具类 java实现发送邮箱_SSL


选择POP3/SMTP/IMAP,开启服务

java发送邮箱带图片工具类 java实现发送邮箱_java_02


然后你需要获取授权码(注意不是邮箱密码),一般需要你用邮箱绑定手机号发送消息,获取后是一串密码,将它保存下来待会要用。

至此,让我们正式开始写代码罢。


三、代码

(心急的直接往下拖有完整代码)

为了方便写,我把所有代码写到了一个Main类中。
先定义俩常量,是发件邮箱及授权码(再说一遍:不是邮密!)

static final String USER = "mymail@example.com";
static final String PASSWD = "YOURCODE*****";

我们不妨先确定收件邮箱和信件内容,收件人可以和发件人一样,也可以是你的别的邮箱:

static final String toMail = "anothermail@example2.com";
static String TEXT = "hello world";//正文
static String SUBJECT = "test";//标题

首先创建一个Properties对象,里面填写各种信息:

Properties properties = new Properties();
properties.setProperty("mail.host","smtp.163.com");//第二个参数要换成你自己使用的smtp服务器
properties.setProperty("mail.transport.protocol","smtp");
properties.setProperty("mail.smtp.auth","true");
properties.setProperty("mail.smtp.timeout", "1000");
properties.setProperty("mail.smtp.port", "25");//其余这些若非特殊需要都不必改

/* 这一段代码是用于QQ邮箱的SSL加密的,使用其他邮箱均无需加此段
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
*/

authenticator = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(USER, PASSWD);//即发件邮箱和授权码,都是String
    }
};

接下来获取一个Session

Session session = Session.getDefaultInstance(properties, authenticator);
session.setDebug(true);//测试时可以加上这句,会显示发件时的详细信息,便于找错

然后获取一个邮件实例:

MimeMessage msg = new MimeMessage(session);

浅浅设一下信息的参数:

msg.setFrom(new InternetAddress(USER));//发件人邮箱
msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));//收件人邮箱
msg.setSubject(SUBJECT);//标题
msg.setContent(TEXT, "text/html;charset=utf-8");//使用utf-8编码
msg.saveChanges();//保存修改

然后就可以发送辣:

Transport.send(msg);



请注意,导入的是以下的东西:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

找不到的话就是没有添加依赖哦。


附上我稍作整理后的完整代码:

package xunlanstd.xjmailer;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;


public class Main {

    static final String USER = "xxxun******@163.com";//发件人
    static final String PASSWD = "EY**************";//授权码

    static final String toMail = "18******@qq.com";
    static String TEXT = "Hello world";
    static String SUBJECT = "Test";

    static Properties properties = new Properties();
    static Authenticator authenticator = null;

    public static void initProp(){
        properties.setProperty("mail.host","smtp.163.com");
        properties.setProperty("mail.transport.protocol","smtp");
        properties.setProperty("mail.smtp.auth","true");
        properties.setProperty("mail.smtp.timeout", "1000");
        properties.setProperty("mail.smtp.port", "25");
        authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER, PASSWD);
            }
        };
    }
    public static Session getSession(){
        return Session.getDefaultInstance(properties, authenticator);
    }

    public static void main(String [] args) throws MessagingException {
        initProp();

        Session session = getSession();

        //session.setDebug(true);

        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(USER));
        msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toMail));
        msg.setSubject(SUBJECT);
        msg.setContent(TEXT, "text/html;charset=utf-8");
        msg.saveChanges();
        Transport.send(msg);
    }
}

激动的心,颤抖的手,点下运行按钮罢!

java发送邮箱带图片工具类 java实现发送邮箱_SMTP_03


成功力!

这只是纯文字邮件,含图片、附件的邮件需要稍改一下(其实就是MimeMessage那里改一点就行了),我就不写了。毕竟是入门向,看完本文再去看那些难度高一点的文章应该就能看懂了。




@HaohaoCppDebuger|寻兰 
2022/10/6 

-----THE END-----
THANK YOU !