How can I send an email by Java application using GMail, Yahoo, or Hotmail?
是否有可能使用Gmail帐户从我的Java应用程序发送电子邮件?我已经用Java应用程序配置了我的公司邮件服务器来发送电子邮件,但是当我分发应用程序时,它不会削减它。任何使用hotmail、yahoo或gmail的回答都是可以接受的。
首先下载Javamail API,并确保相关的JAR文件在您的类路径中。
下面是一个使用gmail的完整工作示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class Main { private static String USER_NAME ="*****"; // GMail user name (just the part before"@gmail.com") private static String PASSWORD ="********"; // GMail password private static String RECIPIENT ="[email protected]"; public static void main(String[] args) { String from = USER_NAME; String pass = PASSWORD; String[] to = { RECIPIENT }; // list of recipient email addresses String subject ="Java send mail example"; String body ="Welcome to JavaMail!"; sendFromGMail(from, pass, to, subject, body); } private static void sendFromGMail(String from, String pass, String[] to, String subject, String body) { Properties props = System.getProperties(); String host ="smtp.gmail.com"; props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.host", host); props.put("mail.smtp.user", from); props.put("mail.smtp.password", pass); props.put("mail.smtp.port","587"); props.put("mail.smtp.auth","true"); Session session = Session.getDefaultInstance(props); MimeMessage message = new MimeMessage(session); try { message.setFrom(new InternetAddress(from)); InternetAddress[] toAddress = new InternetAddress[to.length]; // To get the array of addresses for( int i = 0; i < to.length; i++ ) { toAddress[i] = new InternetAddress(to[i]); } for( int i = 0; i < toAddress.length; i++) { message.addRecipient(Message.RecipientType.TO, toAddress[i]); } message.setSubject(subject); message.setText(body); Transport transport = session.getTransport("smtp"); transport.connect(host, from, pass); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } catch (AddressException ae) { ae.printStackTrace(); } catch (MessagingException me) { me.printStackTrace(); } } } |
号
当然,您需要在
感谢@jodonnel和所有其他回答者。我给了他一笔赏金,因为他的回答让我找到了95%的完整答案。
类似这样(听起来您只需要更改您的SMTP服务器):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | String host ="smtp.gmail.com"; String from ="user name"; Properties props = System.getProperties(); props.put("mail.smtp.host", host); props.put("mail.smtp.user", from); props.put("mail.smtp.password","asdfgh"); props.put("mail.smtp.port","587"); // 587 is the port number of yahoo mail props.put("mail.smtp.auth","true"); Session session = Session.getDefaultInstance(props, null); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); InternetAddress[] to_address = new InternetAddress[to.length]; int i = 0; // To get the array of addresses while (to[i] != null) { to_address[i] = new InternetAddress(to[i]); i++; } System.out.println(Message.RecipientType.TO); i = 0; while (to_address[i] != null) { message.addRecipient(Message.RecipientType.TO, to_address[i]); i++; } message.setSubject("sending in a group"); message.setText("Welcome to JavaMail"); // alternately, to send HTML mail: // message.setContent("<p> Welcome to JavaMail </p>","text/html"); Transport transport = session.getTransport("smtp"); transport.connect("smtp.mail.yahoo.co.in","user name","asdfgh"); transport.sendMessage(message, message.getAllRecipients()); transport.close(); |
其他人在上面有很好的答案,但我想在这里添加一个关于我经验的注释。我发现,当使用gmail作为我的webapp的出站SMTP服务器时,gmail只允许我发送大约10封邮件,然后用反垃圾邮件响应进行响应,我必须手动单步执行才能重新启用SMTP访问。我发送的电子邮件不是垃圾邮件,而是用户在我的系统中注册时的网站"欢迎"电子邮件。所以,YMMV和我不会依赖Gmail来制作webapp。如果你代表一个用户发送电子邮件,比如一个已安装的桌面应用程序(用户在那里输入自己的Gmail凭据),你可能会没事的。
另外,如果您使用的是Spring,那么这里有一个工作配置,可以将gmail用于出站SMTP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="defaultEncoding" value="UTF-8"/> <property name="host" value="smtp.gmail.com"/> <property name="port" value="465"/> <property name="username" value="${mail.username}"/> <property name="password" value="${mail.password}"/> <property name="javaMailProperties"> <value> mail.debug=true mail.smtp.auth=true mail.smtp.socketFactory.class=java.net.SocketFactory mail.smtp.socketFactory.fallback=false </value> </property> </bean> |
即使这个问题已经关闭,我想发布一个计数器的解决方案,但是现在使用简单的Java邮件(开源JavaMail SMTP包装器):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | final Email email = new Email(); String host ="smtp.gmail.com"; Integer port = 587; String from ="username"; String pass ="password"; String[] to = {"[email protected]"}; email.setFromAddress("", from); email.setSubject("sending in a group"); for( int i=0; i < to.length; i++ ) { email.addRecipient("", to[i], RecipientType.TO); } email.setText("Welcome to JavaMail"); new Mailer(host, port, from, pass).sendMail(email); // you could also still use your mail session instead new Mailer(session).sendMail(email); |
我下面的完整代码运行良好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package ripon.java.mail; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendEmail { public static void main(String [] args) { // Sender's email ID needs to be mentioned String from ="[email protected]"; String pass ="test123"; // Recipient's email ID needs to be mentioned. String to ="[email protected]"; String host ="smtp.gmail.com"; // Get system properties Properties properties = System.getProperties(); // Setup mail server properties.put("mail.smtp.starttls.enable","true"); properties.put("mail.smtp.host", host); properties.put("mail.smtp.user", from); properties.put("mail.smtp.password", pass); properties.put("mail.smtp.port","587"); properties.put("mail.smtp.auth","true"); // Get the default Session object. Session session = Session.getDefaultInstance(properties); try{ // Create a default MimeMessage object. MimeMessage message = new MimeMessage(session); // Set From: header field of the header. message.setFrom(new InternetAddress(from)); // Set To: header field of the header. message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set Subject: header field message.setSubject("This is the Subject Line!"); // Now set the actual message message.setText("This is actual message"); // Send message Transport transport = session.getTransport("smtp"); transport.connect(host, from, pass); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("Sent message successfully...."); }catch (MessagingException mex) { mex.printStackTrace(); } } } |
。
最低要求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MessageSender { public static void sendHardCoded() throws AddressException, MessagingException { String to ="[email protected]"; final String from ="[email protected]"; Properties properties = new Properties(); properties.put("mail.smtp.starttls.enable","true"); properties.put("mail.smtp.auth","true"); properties.put("mail.smtp.host","smtp.gmail.com"); properties.put("mail.smtp.port","587"); Session session = Session.getInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from,"BeNice"); } }); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello"); message.setText("What's up?"); Transport.send(message); } } |
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | //set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class Mail { String d_email ="[email protected]", d_password ="****", d_host ="smtp.gmail.com", d_port ="465", m_to ="[email protected]", m_subject ="Testing", m_text ="Hey, this is the testing email using smtp.gmail.com."; public static void main(String[] args) { String[] to={"[email protected]"}; String[] cc={"[email protected]"}; String[] bcc={"[email protected]"}; //This is for google Mail.sendMail("[email protected]","password","smtp.gmail.com", "465","true","true", true,"javax.net.ssl.SSLSocketFactory","false", to, cc, bcc, "hi baba don't send virus mails..", "This is my style...of reply..If u send virus mails.."); } public synchronized static boolean sendMail( String userName, String passWord, String host, String port, String starttls, String auth, boolean debug, String socketFactoryClass, String fallback, String[] to, String[] cc, String[] bcc, String subject, String text) { Properties props = new Properties(); //Properties props=System.getProperties(); props.put("mail.smtp.user", userName); props.put("mail.smtp.host", host); if(!"".equals(port)) props.put("mail.smtp.port", port); if(!"".equals(starttls)) props.put("mail.smtp.starttls.enable",starttls); props.put("mail.smtp.auth", auth); if(debug) { props.put("mail.smtp.debug","true"); } else { props.put("mail.smtp.debug","false"); } if(!"".equals(port)) props.put("mail.smtp.socketFactory.port", port); if(!"".equals(socketFactoryClass)) props.put("mail.smtp.socketFactory.class",socketFactoryClass); if(!"".equals(fallback)) props.put("mail.smtp.socketFactory.fallback", fallback); try { Session session = Session.getDefaultInstance(props, null); session.setDebug(debug); MimeMessage msg = new MimeMessage(session); msg.setText(text); msg.setSubject(subject); msg.setFrom(new InternetAddress("[email protected]")); for(int i=0;i<to.length;i++) { msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to[i])); } for(int i=0;i<cc.length;i++) { msg.addRecipient(Message.RecipientType.CC, new InternetAddress(cc[i])); } for(int i=0;i<bcc.length;i++) { msg.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc[i])); } msg.saveChanges(); Transport transport = session.getTransport("smtp"); transport.connect(host, userName, passWord); transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); return true; } catch (Exception mex) { mex.printStackTrace(); return false; } } } |
。
当需要在同一个JVM中的任意位置设置多个SMTP会话时,发布的代码解决方案可能会导致问题。
Javamail常见问题解答建议使用
1 | Session.getInstance(properties); |
而不是
1 | Session.getDefaultInstance(properties); |
。
因为getdefault将只使用第一次调用时给定的属性。默认实例的所有后续使用都将忽略属性更改。
参见http://www. Oracle .COM/TeaTeWorks/Java/Faq-1354 7.html
这就是我要做的,当我想发送电子邮件附件,工作很好。:)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class NewClass { public static void main(String[] args) { try { Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.host","smtp.gmail.com"); props.put("mail.smtp.auth","true"); props.put("mail.smtp.port","465"); // smtp port Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username-gmail","password-gmail"); } }; Session session = Session.getDefaultInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("[email protected]")); msg.setSubject("Try attachment gmail"); msg.setRecipient(RecipientType.TO, new InternetAddress("[email protected]")); //add atleast simple body MimeBodyPart body = new MimeBodyPart(); body.setText("Try attachment"); //do attachment MimeBodyPart attachMent = new MimeBodyPart(); FileDataSource dataSource = new FileDataSource(new File("file-sent.txt")); attachMent.setDataHandler(new DataHandler(dataSource)); attachMent.setFileName("file-sent.txt"); attachMent.setDisposition(MimeBodyPart.ATTACHMENT); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(body); multipart.addBodyPart(attachMent); msg.setContent(multipart); Transport.send(msg); } catch (AddressException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } catch (MessagingException ex) { Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); } } } |
。
如果您想在
1 | smtp-mail.outlook.com |
号
作为更多和完整工作代码的主机,请查看此答案。
这是一个简单易用的类,用于向
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; 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; public class GmailSender { private static String protocol ="smtp"; private String username; private String password; private Session session; private Message message; private Multipart multipart; public GmailSender() { this.multipart = new MimeMultipart(); } public void setSender(String username, String password) { this.username = username; this.password = password; this.session = getSession(); this.message = new MimeMessage(session); } public void addRecipient(String recipient) throws AddressException, MessagingException { message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient)); } public void setSubject(String subject) throws MessagingException { message.setSubject(subject); } public void setBody(String body) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } public void send() throws MessagingException { Transport transport = session.getTransport(protocol); transport.connect(username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } public void addAttachment(String filePath) throws MessagingException { BodyPart messageBodyPart = getFileBodyPart(filePath); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); } private BodyPart getFileBodyPart(String filePath) throws MessagingException { BodyPart messageBodyPart = new MimeBodyPart(); DataSource dataSource = new FileDataSource(filePath); messageBodyPart.setDataHandler(new DataHandler(dataSource)); messageBodyPart.setFileName(filePath); return messageBodyPart; } private Session getSession() { Properties properties = getMailServerProperties(); Session session = Session.getDefaultInstance(properties); return session; } private Properties getMailServerProperties() { Properties properties = System.getProperties(); properties.put("mail.smtp.starttls.enable","true"); properties.put("mail.smtp.host", protocol +".gmail.com"); properties.put("mail.smtp.user", username); properties.put("mail.smtp.password", password); properties.put("mail.smtp.port","587"); properties.put("mail.smtp.auth","true"); return properties; } } |
号
示例用法:
1 2 3 4 5 6 7 | GmailSender sender = new GmailSender(); sender.setSender("[email protected]","mypassword"); sender.addRecipient("[email protected]"); sender.setSubject("The subject"); sender.setBody("The body"); sender.addAttachment("TestFile.txt"); sender.send(); |
号
嗨,试试这个代码……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package my.test.service; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Message; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Sample { public static void main(String args[]) { final String SMTP_HOST ="smtp.gmail.com"; final String SMTP_PORT ="587"; final String GMAIL_USERNAME ="[email protected]"; final String GMAIL_PASSWORD ="xxxxxxxxxx"; System.out.println("Process Started"); Properties prop = System.getProperties(); prop.setProperty("mail.smtp.starttls.enable","true"); prop.setProperty("mail.smtp.host", SMTP_HOST); prop.setProperty("mail.smtp.user", GMAIL_USERNAME); prop.setProperty("mail.smtp.password", GMAIL_PASSWORD); prop.setProperty("mail.smtp.port", SMTP_PORT); prop.setProperty("mail.smtp.auth","true"); System.out.println("Props :" + prop); Session session = Session.getInstance(prop, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(GMAIL_USERNAME, GMAIL_PASSWORD); } }); System.out.println("Got Session :" + session); MimeMessage message = new MimeMessage(session); try { System.out.println("before sending"); message.setFrom(new InternetAddress(GMAIL_USERNAME)); message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); message.setSubject("My First Email Attempt from Java"); message.setText("Hi, This mail came from Java Application."); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(GMAIL_USERNAME)); Transport transport = session.getTransport("smtp"); System.out.println("Got Transport" + transport); transport.connect(SMTP_HOST, GMAIL_USERNAME, GMAIL_PASSWORD); transport.sendMessage(message, message.getAllRecipients()); System.out.println("message Object :" + message); System.out.println("Email Sent Successfully"); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
一个简单的途径是为pop3访问配置/启用gmail帐户。这将允许您通过Gmail服务器通过普通的SMTP发送出去。
然后通过smtp.gmail.com(端口587)发送。