JAVAMAIL 发Email案例

本文记录了使用JavaMail发送邮件过程中遇到的问题及其解决办法,包括认证失败、循环发送邮件时的异常处理等,并提供了一个JavaMail示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天试了下JAVAMAIL的代码,郁闷到吐血,他们的邮箱都可以发送成功,我的邮箱就报
Java代码 复制代码
  1. javax.mail.AuthenticationFailedException   
  2.     at javax.mail.Service.connect(Service.java:319)   
  3.     at javax.mail.Service.connect(Service.java:169)   
  4.     at javax.mail.Service.connect(Service.java:118)   
  5.     at javax.mail.Transport.send0(Transport.java:188)   
  6.     at javax.mail.Transport.send(Transport.java:118)   
  7.     at HelloJMail.sendMail(HelloJMail.java:48)   
  8.     at HelloJMail.main(HelloJMail.java:56)  
javax.mail.AuthenticationFailedException
	at javax.mail.Service.connect(Service.java:319)
	at javax.mail.Service.connect(Service.java:169)
	at javax.mail.Service.connect(Service.java:118)
	at javax.mail.Transport.send0(Transport.java:188)
	at javax.mail.Transport.send(Transport.java:118)
	at HelloJMail.sendMail(HelloJMail.java:48)
	at HelloJMail.main(HelloJMail.java:56)

 

我改了好多次密码都不行,密码绝对没有输入错误,我也试了我的另外的邮箱也是失败,非常的郁闷,值到最后我无意在网上看到,一些邮箱服务器把新注册的邮箱不支持pop3协议,我就找别人拿几年前注册的邮箱,果然可以.郁闷死了

 

记的以前有写过不用密码就可以发送的,

结果发现现在已经不能使用的.

其实是有些邮箱服务商为了避免别人乱发广告而加了一个需要密码验证

Java代码 复制代码
  1. // 这样才能通过验证   
  2. props.setProperty("mail.smtp.auth""true");  
// 这样才能通过验证
props.setProperty("mail.smtp.auth", "true");

 

我同学尝试着用循环发送邮件,其实到最后只收到一封,而且发多了会报

 

Java代码 复制代码
  1. javax.mail.MessagingException: Can't send command to SMTP host;   
  2.   nested exception is:   
  3.     java.net.SocketException: Software caused connection abort: socket write error   
  4.     at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420)   
  5.     at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408)   
  6.     at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1358)   
  7.     at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:836)   
  8.     at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)   
  9.     at javax.mail.Service.connect(Service.java:297)   
  10.     at javax.mail.Service.connect(Service.java:156)   
  11.     at javax.mail.Service.connect(Service.java:105)   
  12.     at javax.mail.Transport.send0(Transport.java:168)   
  13.     at javax.mail.Transport.send(Transport.java:98)   
  14.     at com.zhaipuhong.j2ee.jmail.HelloJMail.sendMail(HelloJMail.java:53)   
  15.     at com.zhaipuhong.j2ee.jmail.HelloJMail.main(HelloJMail.java:61)   
  16. Caused by: java.net.SocketException: Software caused connection abort: socket write error   
  17.     at java.net.SocketOutputStream.socketWrite0(Native Method)   
  18.     at java.net.SocketOutputStream.socketWrite(Unknown Source)   
  19.     at java.net.SocketOutputStream.write(Unknown Source)   
  20.     at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:101)   
  21.     at java.io.BufferedOutputStream.flushBuffer(Unknown Source)   
  22.     at java.io.BufferedOutputStream.flush(Unknown Source)   
  23.     at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1418)   
  24.     ... 11 more  
javax.mail.MessagingException: Can't send command to SMTP host;
  nested exception is:
	java.net.SocketException: Software caused connection abort: socket write error
	at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420)
	at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408)
	at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1358)
	at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:836)
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)
	at javax.mail.Service.connect(Service.java:297)
	at javax.mail.Service.connect(Service.java:156)
	at javax.mail.Service.connect(Service.java:105)
	at javax.mail.Transport.send0(Transport.java:168)
	at javax.mail.Transport.send(Transport.java:98)
	at com.zhaipuhong.j2ee.jmail.HelloJMail.sendMail(HelloJMail.java:53)
	at com.zhaipuhong.j2ee.jmail.HelloJMail.main(HelloJMail.java:61)
Caused by: java.net.SocketException: Software caused connection abort: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(Unknown Source)
	at java.net.SocketOutputStream.write(Unknown Source)
	at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:101)
	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
	at java.io.BufferedOutputStream.flush(Unknown Source)
	at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1418)
	... 11 more

 而且帐户可能会被封,所以小心小心.

 

其实发送邮件还有很多开源的架包,javamail只是一种,具体问题具体分析,这就不说了.

 

底下是我在网上找的一个javamail的例子,具体的地方已经不知道是哪了,先引用下

Java代码 复制代码
  1. import javax.mail.*;   
  2. import java.util.*;   
  3. import javax.mail.internet.*;   
  4. import java.io.*;   
  5. import javax.activation.*;   
  6.   
  7. public class JavaMail {   
  8.     String m_user = ""// 用于需要验证的用户名   
  9.     String m_pass = ""// 口令   
  10.     String m_server = ""// SMTP服务器名称   
  11.     int m_port = 25// 端口号,缺省为25   
  12.     String m_from = ""// 发件人   
  13.     String m_to = ""// 收件人   
  14.     String m_cc = null// 抄送   
  15.     String m_bcc = null// 密送   
  16.     String m_subject = null// 主题   
  17.     String m_body = null// 内容体   
  18.     LinkedList m_attach = null// 附件的文件名列表   
  19.   
  20.     JavaMail() {   
  21.     }   
  22.   
  23.     // 设定smtp服务器用户名(可选)   
  24.     public void setUser(String user) {   
  25.         m_user = user;   
  26.     }   
  27.   
  28.     // 设定smtp服务器口令(可选)   
  29.     public void setPass(String pass) {   
  30.         m_pass = pass;   
  31.     }   
  32.   
  33.     // 设定smtp的地址和端口号(可选)   
  34.     public void setServer(String server, int port) {   
  35.         if (port > 0) {   
  36.             m_port = port;   
  37.         }   
  38.         m_server = server;   
  39.     }   
  40.   
  41.     // 设定smtp服务器地址,端口号使用缺省值   
  42.     public void setServer(String server) {   
  43.         m_server = server;   
  44.     }   
  45.   
  46.     // 发件人   
  47.     public void setFrom(String from) {   
  48.         m_from = from;   
  49.     }   
  50.   
  51.     // 收件人   
  52.     public void setTo(String to) {   
  53.         m_to = to;   
  54.     }   
  55.   
  56.     // 抄送(可选)   
  57.     public void setCc(String cc) {   
  58.         m_cc = cc;   
  59.     }   
  60.   
  61.     // 密送(可选)   
  62.     public void setBcc(String bcc) {   
  63.         m_bcc = bcc;   
  64.     }   
  65.   
  66.     // 设置新的主题(可选)   
  67.     public void setSubject(String subject) {   
  68.         m_subject = subject;   
  69.     }   
  70.   
  71.     // 设置信的内容,若以<html>或<HTML>开头的内容为text/html格式   
  72.     public void setBody(String body) {   
  73.         m_body = body;   
  74.     }   
  75.   
  76.     // 可以多次添加附件,文件名最好是全路径,使用相对路径容易出错   
  77.     public void attach(String attachfile) {   
  78.         if (m_attach == null) {   
  79.             m_attach = new LinkedList();   
  80.         }   
  81.         m_attach.add(attachfile);   
  82.     }   
  83.   
  84.     public boolean sendMail() throws Exception {   
  85.   
  86.         Properties props = System.getProperties();   
  87.         props.setProperty("mail.transport.protocol""smtp"); // smtp协议   
  88.         props.setProperty("mail.smtp.host", m_server); // 服务器地址   
  89.         props.setProperty("mail.smtp.port""" + m_port); // 端口号   
  90.   
  91.         // 认证信息   
  92.         if (m_user != null && m_pass != null && m_user.length() > 0  
  93.                 && m_pass.length() > 0) {   
  94.             // 这样才能通过验证   
  95.             props.setProperty("mail.smtp.auth""true");   
  96.         }   
  97.   
  98.         javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props,   
  99.                 null);   
  100.         MimeMessage msg = new MimeMessage(sess);   
  101.   
  102.         // 发件人   
  103.         msg.setFrom(new InternetAddress(m_from));   
  104.   
  105.         // 收件人、抄送、密送   
  106.         msg.setRecipients(Message.RecipientType.TO, InternetAddress   
  107.                         .parse(m_to));   
  108.         if (m_cc != null && m_cc.length() > 0) {   
  109.             msg.setRecipients(Message.RecipientType.CC, InternetAddress   
  110.                     .parse(m_cc));   
  111.         }   
  112.         if (m_bcc != null && m_bcc.length() > 0) {   
  113.             msg.setRecipients(Message.RecipientType.BCC, InternetAddress   
  114.                     .parse(m_bcc));   
  115.         }   
  116.         // 主题   
  117.         if (m_subject != null) {   
  118.             msg.setSubject(m_subject);   
  119.   
  120.             // 发件日期   
  121.         }   
  122.         msg.setSentDate(new Date());   
  123.   
  124.         // 文本内容   
  125.         MimeMultipart content = new MimeMultipart();   
  126.         if (content == null) {   
  127.             return false;   
  128.         }   
  129.   
  130.         MimeBodyPart part;   
  131.         if (m_body != null && m_body.length() > 0) {   
  132.             part = new MimeBodyPart();   
  133.             String type = "text/plain";   
  134.             if (m_body.startsWith("<html>") || m_body.startsWith("<HTML>")) {   
  135.                 type = "text/html";   
  136.             }   
  137.             part.setText(m_body);   
  138.   
  139.             // 以<html>和<HTML>开始的文本为text/html类型   
  140.             part.setHeader("Content-Type", type);   
  141.   
  142.             content.addBodyPart(part);   
  143.   
  144.         }   
  145.   
  146.         // 添加附件   
  147.         if (m_attach != null) {   
  148.   
  149.             String filename;   
  150.             Iterator it = m_attach.iterator();   
  151.   
  152.             while (it.hasNext()) {   
  153.                 filename = (String) it.next();   
  154.                 if (filename == null || filename.length() <= 0) {   
  155.                     continue;   
  156.                 }   
  157.   
  158.                 part = new MimeBodyPart();   
  159.                 FileDataSource fds = new FileDataSource(filename);   
  160.                 part.setDataHandler(new DataHandler(fds));   
  161.                 part.setFileName(MimeUtility.encodeText(fds.getName()));   
  162.   
  163.                 content.addBodyPart(part);   
  164.             }   
  165.         }   
  166.         // 保存修改   
  167.         msg.setContent(content);   
  168.         msg.saveChanges();   
  169.         // 如果需要验证用户(如:smtp.sina.com.cn),则使用connect并sendMessage   
  170.         // 注意必须设定mail.smtp.auth属性为true   
  171.         if (m_user != null && m_pass != null && m_user.length() > 0  
  172.                 && m_pass.length() > 0) {   
  173.             Transport trans = sess.getTransport();   
  174.             trans.connect(m_server, m_user, m_pass);   
  175.             trans.sendMessage(msg, InternetAddress.parse(m_to));   
  176.             trans.close();   
  177.         }   
  178.         // 否则,不需要用户名和口令使用静态方法发送由件   
  179.         else {   
  180.             Transport.send(msg);   
  181.   
  182.         }   
  183.         return true;   
  184.     }   
  185.     public static void main(String argv[]) throws Exception {   
  186.   
  187.         JavaMail smtp = new JavaMail();   
  188.         smtp.setFrom("");   
  189.         smtp.setTo("");   
  190.         smtp.setCc("");   
  191.   
  192.         smtp.setServer("smtp.126.com");   
  193.         smtp.setUser("");   
  194.         smtp.setPass("");   
  195.   
  196.         smtp.setSubject("你好,测试由件");   
  197.         smtp.setBody("<html>你好啊</html>");   
  198.         smtp.attach("c://test.java");   
  199.   
  200.         boolean ret = smtp.sendMail();   
  201.   
  202.         if (ret) {   
  203.             System.out.println("发送成功");   
  204.         } else {   
  205.             System.out.println("发送失败");   
  206.         }   
  207.   
  208.     }   
  209.   
  210. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值