Summer--ice 2019-03-14 09:12 采纳率: 100%
浏览 6257
已结题

Java,163邮箱发送失败问题;com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smt

Java实现 邮箱发送,163邮箱在发送过程中出现间接性发送失败问题;
错误信息:
邮件发送失败!com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp5,D9GowADn0DpklIBclT7UBw--.45S2 1551930470,please see http://mail.163.com/help/help_spam_16.htm?ip=61.178.126.61&hostid=smtp5&time=1551930470
已尝试网上的解决办法(在发送邮件之前向自己抄送一份),邮箱设置中也设置了白名单(无效果);
下面是实现代码:

package com.dfec.obp.util;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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 javax.mail.internet.MimeUtility;


public class MailUtil { 

private MimeMessage mimeMsg; // MIME邮件对象
private Session session; // 邮件会话对象
private Properties props; // 系统属性
private boolean needAuth = false; // smtp是否需要认证
// smtp认证用户名和密码
private String username; 
private String password; 
private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象

/**
 * Constructor
 * 
 * @param smtp
 *            邮件发送服务器
 */
public MailUtil(String smtp){ 
    setSmtpHost(smtp); 
    createMimeMessage(); 
} 

/**
 * 设置邮件发送服务器
 * 
 * @param hostName
 *            String
 */
public  void setSmtpHost(String hostName) { 
    // System.out.println("设置系统属性:mail.smtp.host = "+hostName);
    if(props == null)
        props = System.getProperties(); // 获得系统属性对象
    props.setProperty("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");

    props.setProperty("mail.smtp.socketFactory.fallback", "false");

    props.put("mail.smtp.host", hostName); // 设置SMTP主机
    props.setProperty("mail.smtp.port", "465");//qq设置465///25

} 


/**
 * 创建MIME邮件对象
 * 
 * @return
 */
public boolean createMimeMessage() 
{ 
    try { 
        // System.out.println("准备获取邮件会话对象!");
        session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
        session.setDebug(true);
    } 
    catch(Exception e){ 
        System.err.println("获取邮件会话对象时发生错误!" + e);
        return false; 
    } 

    // System.out.println("准备创建MIME邮件对象!");
    try { 
        mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
        mp = new MimeMultipart(); 

        return true; 
    } catch(Exception e){ 
        System.err.println("创建MIME邮件对象失败!" + e);
        return false; 
    } 
}   

/**
 * 设置SMTP是否需要验证
 * 
 * @param need
 */
public void setNeedAuth(boolean need) { 
    // System.out.println("设置smtp身份认证:mail.smtp.auth = "+need);
    if(props == null) props = System.getProperties(); 
    if(need){ 
        props.put("mail.smtp.auth","true"); 
    }else{ 
        props.put("mail.smtp.auth","false"); 
    } 
} 

/**
 * 设置用户名和密码
 * 
 * @param name
 * @param pass
 */
public void setNamePass(String name,String pass) { 
    username = name; 
    password = pass; 
} 

/**
 * 设置邮件主题
 * 
 * @param mailSubject
 * @return
 */
public boolean setSubject(String mailSubject) { 
    // System.out.println("设置邮件主题!");
    try{ 
        mimeMsg.setSubject(mailSubject); 
        return true; 
    } 
    catch(Exception e) { 
        System.err.println("设置邮件主题发生错误!");
        return false; 
    } 
}

/**
 * 设置邮件正文
 * 
 * @param mailBody
 *            String
 */ 
public boolean setBody(String mailBody) { 
    try{ 
        BodyPart bp = new MimeBodyPart(); 
        bp.setContent(""+mailBody,"text/html;charset=GBK"); 
        mp.addBodyPart(bp); 
        return true; 
    } catch(Exception e){ 
        System.err.println("设置邮件正文时发生错误!" + e);
    return false; 
    } 
} 

/**
 * 添加附件
 * 
 * @param filename
 *            String
 */ 
public boolean addFileAffix(String filename) { 

    // System.out.println("增加邮件附件:"+filename);
    try{ 
        BodyPart bp = new MimeBodyPart(); 
        FileDataSource fileds = new FileDataSource(filename); 
        bp.setDataHandler(new DataHandler(fileds)); 
        bp.setFileName(MimeUtility.encodeText(fileds.getName()));       
        mp.addBodyPart(bp); 
        return true; 
    } catch(Exception e){ 
        System.err.println("增加邮件附件:" + filename + "发生错误!" + e);
        return false; 
    } 
} 

/**
 * 设置发信人
 * 
 * @param from
 *            String
 */ 
public boolean setFrom(String from) { 
    // System.out.println("设置发信人!");
    try{ 

        mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人

        return true; 
    } catch(Exception e) { 
        return false; 
    } 
} 

/**
 * 设置收信人
 * 
 *  设置属性
 *  private Properties p; // p是属性集合类,用来设置邮件的一些属性比如timeout等
 *  p.put("userName","xxx@163.com"); //这里填上你的邮箱(发送方)
 *  构件MimeMessage 对象,并设置在发送给收信人之前给自己(发送方)抄送一份
 *  MimeMessage msg = mailSender.createMimeMessage();
 *  msg.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(p.getProperty("userName")));
 *
 * @param to
 *            String
 */ 
public boolean setTo(String[] to,String from){ 
    if(to == null)return false; 

    try{ 
        mimeMsg.addRecipients(Message.RecipientType.CC,InternetAddress.parse(from));//给自己抄送一份

        int mailSize = to.length;
        for(int i = 0; i < mailSize; i++){
            InternetAddress toStr = new  InternetAddress(to[i]);
            mimeMsg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(toStr.toString()));
        }

        return true; 
    } catch(Exception e) { 
        return false; 
    }   
} 

/**
 * 发送邮件
 */ 
public boolean sendOut() 
{ 
    try{ 
        mimeMsg.setContent(mp); 
        mimeMsg.saveChanges(); 
        // System.out.println("正在发送邮件....");

        Session mailSession = Session.getInstance(props,null); 
        Transport transport = mailSession.getTransport("smtp"); 
        transport.connect((String)props.get("mail.smtp.host"),username,password); 
        transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
        //transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
         System.out.println("发送邮件成功!");
        transport.close();          
        return true; 
    } catch(Exception e) { 
        System.err.println("邮件发送失败!" + e);
        return false; 
    } 
} 

/**
 * 调用sendOut方法完成邮件发送
 * 
 * @param smtp
 * @param from
 * @param to
 * @param subject
 * @param content
 * @param username
 * @param password
 * @return boolean
 */
public static boolean send(String smtp,String from,String[] to,String subject,String content,String username,String password) {
    MailUtil theMail = new MailUtil(smtp);
    theMail.setNeedAuth(true); // 需要验证

    if(!theMail.setSubject(subject)) return false;
    if(!theMail.setBody(content)) return false;
    if(!theMail.setTo(to,from)) return false;
    if(!theMail.setFrom(from)) return false;
    theMail.setNamePass(username,password);

    if(!theMail.sendOut()) return false;
    return true;
}

/**
 * 调用sendOut方法完成邮件发送,带附件
 * 
 * @param smtp
 * @param from
 * @param to
 * @param subject
 * @param content
 * @param username
 * @param password
 * @param filename
 *            附件路径
 * @return
 */
public static boolean send(String smtp,String from,String[] to,String subject,String content,String username,String password,String filename) {
    MailUtil theMail = new MailUtil(smtp);
    theMail.setNeedAuth(true); // 需要验证

    if(!theMail.setSubject(subject)) return false;
    if(!theMail.setBody(content)) return false;
    if(!theMail.addFileAffix(filename)) return false; 
    if(!theMail.setTo(to,from)) return false;
    if(!theMail.setFrom(from)) return false;
    theMail.setNamePass(username,password);
    if(!theMail.sendOut()) return false;
    return true;
}

}

  • 写回答

3条回答 默认 最新

  • 强化脑细胞 2019-03-14 09:25
    关注

    邮件正文带有很多垃圾邮件特征或发送环境缺乏规范性。需调整邮件内容或优化发送环境,先将邮件内容改一改,之后再试一下

    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程