JAVA代码发送邮件示例和解释

下载和上传附件、发送短信和发送邮件,都算是程序中很常用的功能,之前记录了文件的上传和下载还有发送短信,由于最近比较忙,邮件发送的功能就没有时间去弄,好在昨晚终于走通代码成功以163邮箱发送邮件到qq邮箱,以下是相关代码,具体解释可以参考代码中注释:

package test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
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.MimeMultipart;
import com.sun.mail.util.MailSSLSocketFactory;

///**
// *
// * @author tuzongxun123
// * @Description 邮件发送测试类
// */
public class sendMailTest {
    public static void main(String[] args) throws Exception {
        // 配置信息
        Properties pro = new Properties();
        pro.put("mail.smtp.host", "smtp.163.com");
        pro.put("mail.smtp.auth", "true");
        // SSL加密
        MailSSLSocketFactory sf = null;
        sf = new MailSSLSocketFactory();
        // 设置信任所有的主机
        sf.setTrustAllHosts(true);
        pro.put("mail.smtp.ssl.enable", "true");
        pro.put("mail.smtp.ssl.socketFactory", sf);
        // 根据邮件的会话属性构造一个发送邮件的Session,这里需要注意的是用户名那里不能加后缀,否则便不是用户名了
        //还需要注意的是,这里的密码不是正常使用邮箱的登陆密码,而是客户端生成的另一个专门的授权码
        MailAuthenticator authenticator = new MailAuthenticator("tuzongxun123",
                "客户端授权码");
        Session session = Session.getInstance(pro, authenticator);
        // 根据Session 构建邮件信息
        Message message = new MimeMessage(session);
        // 创建邮件发送者地址
        Address from = new InternetAddress("tuzongxun123@163.com");
        // 设置邮件消息的发送者
        message.setFrom(from);
        // 验证收件人邮箱地址
        List<String> toAddressList = new ArrayList<>();
        toAddressList.add("1160569243@qq.com");
        StringBuffer buffer = new StringBuffer();
        if (!toAddressList.isEmpty()) {
            String regEx = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
            Pattern p = Pattern.compile(regEx);
            for (int i = 0; i < toAddressList.size(); i++) {
                Matcher match = p.matcher(toAddressList.get(i));
                if (match.matches()) {
                    buffer.append(toAddressList.get(i));
                    if (i < toAddressList.size() - 1) {
                        buffer.append(",");
                    }
                }
            }
        }
        String toAddress = buffer.toString();
        if (!toAddress.isEmpty()) {
            // 创建邮件的接收者地址
            Address[] to = InternetAddress.parse(toAddress);
            // 设置邮件接收人地址
            message.setRecipients(Message.RecipientType.TO, to);
            // 邮件主题
            // message.setSubject("java邮件测试");
            message.setSubject("为什么错了");
            // 邮件容器
            MimeMultipart mimeMultiPart = new MimeMultipart();
            // 设置HTML
            BodyPart bodyPart = new MimeBodyPart();
            // 邮件内容
            // String htmlText = "java邮件测试111";
            String htmlText = "为什么错了";
            bodyPart.setContent(htmlText, "text/html;charset=utf-8");
            mimeMultiPart.addBodyPart(bodyPart);
          // 添加附件
            List<String> fileAddressList = new ArrayList<String>();
            fileAddressList
                    .add("C:\\Users\\tuzongxun123\\Desktop\\新建 Microsoft Office Word 文档.docx");
            if (fileAddressList != null) {
                BodyPart attchPart = null;
                for (int i = 0; i < fileAddressList.size(); i++) {
                    if (!fileAddressList.get(i).isEmpty()) {
                        attchPart = new MimeBodyPart();
                        // 附件数据源
                        DataSource source = new FileDataSource(
                                fileAddressList.get(i));
                        // 将附件数据源添加到邮件体
                        attchPart.setDataHandler(new DataHandler(source));
                        // 设置附件名称为原文件名
                        attchPart.setFileName(MimeUtility.encodeText(source
                                .getName()));
                        mimeMultiPart.addBodyPart(attchPart);
                    }
                }
            }
            message.setContent(mimeMultiPart);
            message.setSentDate(new Date());
            // 保存邮件
            message.saveChanges();
            // 发送邮件
            Transport.send(message);
        }
    }
}

class MailAuthenticator extends Authenticator {

    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;

    /**
     * 创建一个新的实例 MailAuthenticator.
     *
     * @param username
     * @param password
     */
    public MailAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

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

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

注:我有个同事使用我这个代码更换为他的账号和客户端授权码后,一运行就报错,然后重置了一下邮箱的客户端授权码后,错误便消失了。

时间: 2024-09-22 17:44:06

JAVA代码发送邮件示例和解释的相关文章

JAVA代码发送邮件示例和解释(二)

之前有使用过一次在程序中发邮件的功能,也写了一篇相关的笔记,当时使用的是163邮箱,经过测试多个163账号都是可行的.但是最近把账号换成中国移动@chinamobilesz.com这种结尾的时候,却一直连接不上服务器,验证不通过,于是只好重新进行了一些改动,这期间也有参考另一个同事之前的写法,成功实现. 这种实现方式和上一种大同小异,只是经过测试后,这种方式不仅163的邮箱没有问题,中国移动@chinamobilesz.com这种也可以,因此相对前边写的那种应该要更好一些,具体代码如下: pac

java代码执行顺序求解释?

问题描述 java代码执行顺序求解释? public class ExA { private static ExA a = new ExA(); static { System.out.println("父类--静态代码块"); } public ExA() { System.out.println("父类--构造函数"); } { System.out.println("父类--非静态代码块"); } public static void ma

如何使用java代码 发送邮件

问题描述 不知道如何使用java代码发送在网上查了几个都使用了都不行各位大侠给个答案吧 解决方案 解决方案二:用javamail这个jar包或者可以用spring的javamailsender解决方案三:.............Up解决方案四:引用1楼l417584711的回复: 用javamail这个jar包或者可以用spring的javamailsender up!!!!!!!解决方案五:javamail网上一大堆!

java发送邮件示例讲解_java

本文实例讲解了java发邮件的详细过程,供大家参考,具体内容如下 1.邮件协议 发邮件的:SMTP (Simple Mail Transport  Protocal) 收邮件的协议:pop3 (Post Office Protocal 3) IMAP 新协议 发邮件也可以收邮件. (一步步的与服务器交互) SMTP : 2.收发邮件的过程: 一般情况下,smtp和pop3是两个服务器(主机). Smtp邮件的端口为25. POP3 端口 为110. 发邮件示例 1).安装foxmail: 2).

java代码0用163邮箱发送邮件时报这个错

问题描述 java代码0用163邮箱发送邮件时报这个错 com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,163 smtp14,EsCowEBZ50rSm3JWmXF+AA--.3541S2 1450351570 java代码: public class EmailTools { public static boolean send(String to,String subject,String c

谁有JAVA核心技术的示例代码?

问题描述 谁有JAVA核心技术的示例代码? 解决方案 解决方案二:何谓核心?解决方案三:引用楼主ybingxin1234的回复: 谁有JAVA核心技术的示例代码? 你要的核心技术的下载包里肯定有example解决方案四:<JAVA核心技术>里的示例代码?解决方案五:JDK的安装包里....解决方案六:JDK安装包中的demo中有源码

java8-谁能帮我解释下这段Java代码

问题描述 谁能帮我解释下这段Java代码 public class CollectionDemo { public static void main(String[] args) { Collection list= new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.iterator().forEachRemaining(lang->System.out.p

Java Mail与Apache Mail发送邮件示例_java

一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例如xxx@xx.com 2.收件人姓名:大部分的邮件显示时都会显示,例如loadfate 779554589@qq.com 3.发件人:发件人的邮箱地址 4.发件人姓名: 5.主题:邮件的标题 6.内容及附件:邮件的主要内容 二.使用Java发邮件的通用步骤 一般的项目中没有单独的邮件服务器,一般情况下都是使用别人的服务器. 1.设置smtp服务器:不同的邮件服务器有不同的地址,

java与js代码互调示例代码

用到java和js方法互调,在用HTML5做跨平台应用开发时经常会用到,在这里分享一些自己在实际开发过程中的用法,希望对初学者有所帮助   在用HTML5做跨平台应用开发时,尝尝会用到java和js方法互调的问题,对初学者而言,可能会有点难,在这里分享一些自己在实际开发过程中的用法,希望对你有帮助: 首先是js代码调用java代码介绍: 复制代码 代码如下: public class CzingLBWebMain extends DroidGap { @Override public void