*错误描述
报错信息: Couldn't connect to host, port: 10.10.10.10,333;timeout -1
邮件发送失败
*解决方式
方式一:
核对host,port的配置是不是正确的 尝试更换可用的主机端口号
方式二:
这也是本篇文章要说的.
需求说明: 由于主机端口号已经失效 并且无法修复 所以需要更换邮件的发送协议(stmp->ews)使用EWS协议发送 但是要改动的代码量过去庞大 且客户急需所以采用这种取巧的方式
1.创建装换工具类
import javax.mail.Address;
import javax.mail.Message;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
//注意: 原有代码不要改变
@Component
public class EWSEmailUtil {
private static String user;
private static String password;
private static String mailServer;
//发送邮件
public void send(Message message,String bodyText,String attachmentName,String attachmentPath){
try {
String subject = message.getSubject();
Address[] toAddress = message.getRecipients(Message.RecipientType.TO);
String[] to = new String[toAddress.length];
for (int i = 0; i < toAddress.length; i++) {
to[i]=toAddress[i].toString();
}
Address[] ccAddress = message.getRecipients(Message.RecipientType.CC);
String[] cc = null;
if (ccAddress!=null){
cc = new String[ccAddress.length];
for (int i = 0; i < ccAddress.length; i++) {
cc[i]=ccAddress[i].toString();
}
}
if (attachmentPath == null){
//发送不带附件的邮件
doSend(subject,to,cc,bodyText,null,null);
}else {
//发送带有附件的邮件
doSend(subject,to,cc,bodyText,attachmentName,attachmentPath);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void doSend(String subject, String[] to, String[] cc, String bodyText,String attachmentName, String attachmentPath) throws Exception {
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
ExchangeCredentials credentials = new WebCredentials(user, password);
service.setCredentials(credentials);
try {
service.setUrl(new URI(mailServer));
} catch (URISyntaxException e) {
e.printStackTrace();
}
EmailMessage msg = new EmailMessage(service);
msg.setSubject(subject);
MessageBody body = MessageBody.getMessageBodyFromText(bodyText);
body.setBodyType(BodyType.HTML);
msg.setBody(body);
for (String s : to) {
msg.getToRecipients().add(s);
}
if (cc != null) {
for (String s : cc) {
msg.getCcRecipients().add(s);
}
}
if (attachmentPath!=null){
//这里只提供单个附件的方法 如果你需要多个邮件 循环遍历你懂得!
msg.getAttachments().addFileAttachment(attachmentName,attachmentPath);
}
msg.send();
}
}
需要的依赖就自己搜一下好了
2.向原有发送邮件方法中注入工具类
@Autowired private EWSEmailUtil ewsEmailUtil;
当然你也可以把方法改成静态的 (如果你的工具类中不依赖其他的类)
3.替换发送方法
// Transport.send(message);
注释以上代码 替换为
ewsEmailUtil.send(message,bodytext,attachmentName,attachmentPath);
最好重构代码 可以应急