java发送邮件操作(携带或不携带附件),发送失败异常情况分析

分析新需求时,发现收件邮箱有问题导致发送邮件失败时并没有抛出预估的sendfailedexception异常,在网上找了许多博客也没有说清楚院校,在我进行一些测试后断定,这个和发邮件的服务器有关

导入依赖

<dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>

代码示例

需要邮件发送服务器的邮箱和密钥,一般来说密钥不等于密码;以QQ邮箱和163邮箱为例,在 安全设置账号与安全中可找到开启 SMTP服务,然后生成授权码,这个授权码就是我们用到的密钥;可在其帮助或者说明文档中找到对应的服务器地址和端口。smtp为发送邮件服务,imap为接收邮件服务。

一些参数并不一定是非得设置,视情况而定,下面是测试代码。

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

/**
 * @Description
 * @Author 
 */
public class MailTest {
    public static void main(String[] args) {
   
        String username1 = ""; // 邮箱
        String password1 = ""; // 密钥
        String host1 = "smtp.163.com";
        String username2 = "";
        String password2 = "";
        String host2 = "smtp.qq.com";
        sendingEmails(username2, password2, host2);
    }


    private static void sendingEmails(String username, String password, String host) {
        try {
            // 创建连接对象,用来连接邮箱地址
            Properties props = new Properties();
            // 设置发送邮箱的服务器协议
            props.setProperty("mail.transport.protocol", "SMTP");
            // 设置服务器地址
            props.setProperty("mail.smtp.host", host);
            // 设置服务器端口
            props.setProperty("mail.smtp.port", "465"); // qq为 465或587
            // 发件人是否合法,需为true
            props.setProperty("mail.smtp.auth", "true");
            // 若为ssl连接则需要设置
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.port", "465");
            // 设计发送邮件的账号和密码,此处的密码大都为密钥,要看服务器决定
            Session session = Session.getInstance(props, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
            Message msg = new MimeMessage(session);
            // 创建收件人 可以用数组存多个收件人
//            Address[] address = new InternetAddress[2];
//            address[0]=new InternetAddress("");
//            address[1]=new InternetAddress("");
            Address address = new InternetAddress("email@qq.com");
            // 设置发件人属性,需和登录邮箱一致
            msg.setFrom(new InternetAddress(username));
            // 设置收件人或者抄送人等,收件人地址(可用数组存放多个收件人)
            msg.setRecipient(Message.RecipientType.TO, address);
//            msg.setRecipients(Message.RecipientType.TO, address); // 多个收件人
            msg.setText("test"); // 设置邮件内容(不携带附件有效)

            // ------------携带附件,若没有附件可不配置------------
            // 设置邮件正文,msg.setText()设置的内容会失效
            Multipart multipart = new MimeMultipart();
            MimeBodyPart messageBody = new MimeBodyPart();
            // 第一个参数为邮件正文,第二个参数未解析类型
            messageBody.setContent("test","text/html");
            multipart.addBodyPart(messageBody);

            // 添加附件,可添加多个附件,要注意文件名
            MimeBodyPart mimeBodyPart = new MimeBodyPart();
            // 需上传的附件的Inputstream
            InputStream inputStream = new FileInputStream("E:\\information\\新建文本文档.txt");
            DataSource source = new ByteArrayDataSource(inputStream, "application/octet-stream");
            mimeBodyPart.setDataHandler(new DataHandler(source));
            mimeBodyPart.setFileName("test.txt"); // 附件文件名字
            multipart.addBodyPart(mimeBodyPart);
            msg.setContent(multipart);
            // ------------------------------------------

            // 发送邮件
            Transport.send(msg);
        } catch (Exception e) {
        	// 捕获抛出的异常,打印在控制台
            System.err.println("" + e);
        }
    }
}

抛出异常分析

源码的注释说明了,Transport.send()这个方法会抛出MessagingException和SendFailedException这两个异常;
抛出MessagingException一般是除发送外的其他异常情况;抛出SendFailedException则是邮件发送的问题,但经过测试发现这个异常是否抛出还和邮件服务器有关。
在这里插入图片描述
以QQ邮箱和163邮箱为例
我用这两个服务器向同一个不存在的邮箱(email@qq.com)发送邮件,QQ是程序抛出异常,163是退回邮件(没有异常被捕获)
QQ
在这里插入图片描述163
在这里插入图片描述如果是@后面的域名问题都会退回邮件
QQ
在这里插入图片描述
163
在这里插入图片描述
像收件邮箱满了之类的也是退回邮件,sendFailedException这个异常和服务器的反馈有关。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用JavaMail API来发送附件的电子邮件。以下是一个示例代码,展示了如何使用Java Servlet发送附件的邮件: ```java import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; // 邮件服务器的配置信息 final String username = "your_email@example.com"; final String password = "your_email_password"; final String smtpHost = "smtp.example.com"; final int smtpPort = 587; // 发件人和收件人的电子邮件地址 String fromEmail = "from@example.com"; String toEmail = "to@example.com"; // 创建一个会话对象 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.port", smtpPort); Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { // 创建一个默认的MimeMessage对象 MimeMessage message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(fromEmail)); // 设置收件人 message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); // 设置主题 message.setSubject("邮件主题"); // 创建一个Multipart对象,用于存储邮件的各个部分 Multipart multipart = new MimeMultipart(); // 创建邮件正文部分 BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("邮件正文"); multipart.addBodyPart(messageBodyPart); // 创建附件部分 messageBodyPart = new MimeBodyPart(); String filename = "path_to_attachment_file"; DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); // 将Multipart对象设置为邮件内容 message.setContent(multipart); // 发送邮件 Transport.send(message); System.out.println("邮件发送成功"); } catch (MessagingException e) { e.printStackTrace(); } ``` 请将代码中的 `your_email@example.com`,`your_email_password`,`smtp.example.com`,`from@example.com`,`to@example.com` 和 `path_to_attachment_file` 替换为你自己的实际信息。 这段代码使用了JavaMail API来创建一个MimeMessage对象,并设置了发件人、收件人、主题和邮件正文。然后,创建了一个Multipart对象,并向其中添加了邮件正文部分和附件部分。最后,将Multipart对象设置为邮件内容,通过Transport类的send()方法发送邮件。 确保你的项目中包含了JavaMail API的相关依赖,并在Servlet的web.xml文件中配置好Servlet的映射和相关参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值