2013-03-24 153 views
14

这段代码有什么问题?不知怎的,它是在该行Transport.send(message);线,没有错误信息,也不例外获得在一个无限循环,说不定无限循环(我不知道,因为我不等待超过5-10minute)通过gmail发送邮件smtp服务器在JAVA

final String username = "<mail_name>"; 
final String password = "<password>"; 

Properties props = new Properties(); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.host", "smtp.gmail.com"); 
props.put("mail.smtp.port", "465"); 

Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 

try { 

    Message message = new MimeMessage(session); 
    message.setFrom(new InternetAddress("<mail_from>@gmail.com")); 
    message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("<mail_to>@gmail.com")); 
    message.setSubject("Test Subject"); 
    message.setText("Test"); 

    Transport.send(message); 

    System.out.println("Done"); 

} catch (MessagingException e) { 
    throw new RuntimeException(e); 
} 
+0

我建议在MessagingException之后添加一个'catch(Exception e){}'来查看是否有其他类型的异常被抛出。还要添加一个'finally'块。您还可以添加'log4j.xml'并将'javax.mail'类设置为'DEBUG'来查看还有什么可以进行。 – Bizmarck 2013-03-24 11:04:17

+0

好的提示,谢谢!将测试它 – czupe 2013-03-24 11:06:39

+0

不幸的是仍然在Transport.send(消息)行等待...有人可以验证此代码的正确性? – czupe 2013-03-24 11:28:18

回答

18

在这里我给一些变化,这些工作对我罚款:

Session session = Session.getInstance(props,null); 

您实例化的消息对象为你做。最后:

Transport transport = session.getTransport("smtp"); 
String mfrom = "[email protected]"// example laabidiraissi 
transport.connect("smtp.gmail.com", mfrom, "thepassword"); 
transport.sendMessage(message, message.getAllRecipients()); 

编辑,请你给我一个忙,复制/粘贴和尝试这个例子,显示它显示:

我可以重现行为在你的问题中描述
package com.test; 

import java.util.Properties; 

import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import org.junit.Test; 

public class EmailService { 

@Test 
public void test(){ 
    Properties props = System.getProperties(); 
    props.put("mail.smtp.starttls.enable", true); // added this line 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.user", "username"); 
    props.put("mail.smtp.password", "password"); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.auth", true); 



    Session session = Session.getInstance(props,null); 
    MimeMessage message = new MimeMessage(session); 

    System.out.println("Port: "+session.getProperty("mail.smtp.port")); 

    // Create the email addresses involved 
    try { 
     InternetAddress from = new InternetAddress("username"); 
     message.setSubject("Yes we can"); 
     message.setFrom(from); 
     message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail")); 

     // Create a multi-part to combine the parts 
     Multipart multipart = new MimeMultipart("alternative"); 

     // Create your text message part 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("some text to send"); 

     // Add the text part to the multipart 
     multipart.addBodyPart(messageBodyPart); 

     // Create the html part 
     messageBodyPart = new MimeBodyPart(); 
     String htmlMessage = "Our html text"; 
     messageBodyPart.setContent(htmlMessage, "text/html"); 


     // Add html part to multi part 
     multipart.addBodyPart(messageBodyPart); 

     // Associate multi-part with message 
     message.setContent(multipart); 

     // Send message 
     Transport transport = session.getTransport("smtp"); 
     transport.connect("smtp.gmail.com", "username", "password"); 
     System.out.println("Transport: "+transport.toString()); 
     transport.sendMessage(message, message.getAllRecipients()); 


    } catch (AddressException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 
+0

谢谢,但mail.smtp.auth属性已经存在了...而且我也尝试过使用其他端口。 – czupe 2013-03-24 12:07:39

+0

啊对于auth属性感到抱歉,这是我的错,我没有看到它。 – 2013-03-24 12:09:03

+0

如果尝试使用25或587端口,无论如何检查您的解决方案... 线程“主”异常java.lang.RuntimeException:javax.mail.MessagingException:无法连接到SMTP主机:smtp.gmail.com,港口:25; 嵌套的异常是: \t java.net.ConnectException:连接被拒绝:connect – czupe 2013-03-24 12:23:38

1

和修理它。

send方法被卡在

SMTPTransport(Service).connect(String, int, String, String) line: 308 

该连接不会成功,因为你有错误的端口为Gmail的SMTP主机:465

将其更改为587

props.put("mail.smtp.port", "587"); 

它会工作。

+0

对呀,不知道为什么我骑465港口,但无论如何,它仍然没有工作:( – czupe 2013-03-24 12:33:01

+0

你现在得到什么异常/错误?你的java.exe是否允许通过防火墙? – A4L 2013-03-24 12:40:37

+0

This:java.lang.RuntimeException:javax.mail.MessagingException:无法连接到SMTP主机:smtp.gmail.com,端口:25;嵌套的异常是:java.net.ConnectException:连接被拒绝:连接 我忽略了整个Windows防火墙.. – czupe 2013-03-24 12:45:10

3

好的。这是一个稍微复杂一点比我因子评分的第一次...要summorize我得到了什么:

  • 有一个非常有用的命令:session.setDebug(true);。如果你确定这一点,每一个重要的过程都会被控制台击败。我建议使用它。
  • 第二台计算机只能使用安全选项,您可以使用:Transport transport = session.getTransport("smtps");而不是非安全smtp进行切换... JavaMail API传输对象还将处理端口(分别为smtp:587,smtps :465)
  • 您也可以使用Transport类的静态方法来发送消息和(保存之前,非静态sendMessage方法不会保存消息),但是这次您需要使用javax.mail 。创建会话时的验证器,如下所示:

    Session session = Session.getInstance(props,   new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication("login", "password"); 
        } 
    

    });

1.4.2 JavaMailApi还有一个例外比1.4.7版本这个问题...

如果你不使用它,你不能用静态方法验证。如果你使用实例方法,你可以。

  • 一台电脑有maven,并且获得了JavaMail API的1.4.2版本。第二台电脑有一个下载的库,版本为1.4.7,我猜也是这样的东西
  • 第一个comp Netbeans,第二个comp Intellij ... +1)在互联网上有很多旧的和不好的示例代码,这使得更难以正确使用这个API。

那么漂亮搞砸了,但也有一些基本的概念,它应该集中...

1

使用Simple Java Mail它应该是简单的:

Email email = new Email(); 

email.setFromAddress("lollypop", "[email protected]"); 
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO); 
email.setText("We should meet up!"); 
email.setTextHTML("<b>We should meet up!</b>"); 
email.setSubject("hey"); 

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

如果你有两个因素登录开启您需要从您的Google帐户生成application specific password

相关问题