如何通过Java应用程序使用GMail,Yahoo或Hotmail发送电子邮件?
是否可以使用GMail帐户从我的Java应用程序发送电子邮件? 我已经configuration了我的公司邮件服务器与Java应用程序发送电子邮件,但是这不会削减当我分发的应用程序。 任何使用Hotmail,Yahoo或GMail的答案都可以接受。
首先下载JavaMail API ,并确保相关的jar文件在您的类path中。
这是一个使用GMail的完整工作示例。
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 = "lizard.bill@myschool.edu"; 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(); } } }
当然,你需要在catch
块中做更多的事情,而不像上面的代码那样打印堆栈跟踪。 (删除catch
块以查看来自JavaMail API的哪些方法调用会抛出exception,以便更好地了解如何正确处理它们。)
感谢@jodonnel和其他人的回答。 我给了他一笔赏金,因为他的回答让我有95%的答案。
像这样的东西(听起来就像你只需要改变你的SMTP服务器):
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作为我的web应用程序的出站SMTP服务器时,Gmail只允许我发送大约10条左右的消息,然后再响应我的垃圾邮件响应,我必须手动重新启用SMTP访问。 我发送的电子邮件不是垃圾邮件,而是当用户在我的系统上注册时,网站“欢迎”电子邮件。 所以,YMMV,我不会依靠Gmail生产webapp。 如果您代表用户发送电子邮件,例如安装的桌面应用程序(用户input自己的Gmail凭据),则可能没有问题。
另外,如果你使用的是Spring,下面是一个使用Gmail作为出站SMTP的工作configuration:
<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>
即使这个问题是封闭的,我想发布一个计数器解决scheme,但现在使用简单的Java邮件 (开源JavaMail SMTP包装):
final Email email = new Email(); String host = "smtp.gmail.com"; Integer port = 587; String from = "username"; String pass = "password"; String[] to = {"to@gmail.com"}; 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);
我的完整代码如下所示:
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 = "test@gmail.com"; String pass ="test123"; // Recipient's email ID needs to be mentioned. String to = "ripon420@yahoo.com"; 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(); } } }
//set CLASSPATH=%CLASSPATH%;activation.jar;mail.jar import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class Mail { String d_email = "iamdvr@gmail.com", d_password = "****", d_host = "smtp.gmail.com", d_port = "465", m_to = "iamdvr@yahoo.com", m_subject = "Testing", m_text = "Hey, this is the testing email using smtp.gmail.com."; public static void main(String[] args) { String[] to={"XXX@yahoo.com"}; String[] cc={"XXX@yahoo.com"}; String[] bcc={"XXX@yahoo.com"}; //This is for google Mail.sendMail("venkatesh@dfdf.com", "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("p_sambasivarao@sutyam.com")); 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; } } }
最低要求:
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 = "a@a.info"; final String from = "b@gmail.com"; 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); } }
当您需要在同一个JVM中的任何地方设置多个SMTP会话时,发布的代码解决scheme可能会导致问题。
JavaMail FAQbuild议使用
Session.getInstance(properties);
代替
Session.getDefaultInstance(properties);
因为getDefault将只使用第一次调用时给定的属性。 所有稍后使用默认实例都将忽略属性更改。
请参阅http://www.oracle.com/technetwork/java/faq-135477.html#getdefaultinstance
这就是我想用附件发送电子邮件时所做的工作,工作正常。 🙂
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("username-gmail@gmail.com")); msg.setSubject("Try attachment gmail"); msg.setRecipient(RecipientType.TO, new InternetAddress("username-gmail@gmail.com")); //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); } } }
一个简单的路线是将Gmail帐户configuration/启用POP3访问。 这将允许你通过普通的SMTP通过gmail服务器发送出去。
然后你只需通过smtp.gmail.com(在端口587)
嗨试试这个代码….
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 = "xxxxxxxxxx@gmail.com"; 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(); } } }
这是一个简单易用的课程,用于通过Gmail
发送电子邮件。 您需要将JavaMail
库添加到您的构buildpath或使用Maven
。
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; } }
用法示例:
GmailSender sender = new GmailSender(); sender.setSender("myEmailNameWithout@gmail.com", "mypassword"); sender.addRecipient("recipient@somehost.com"); sender.setSubject("The subject"); sender.setBody("The body"); sender.addAttachment("TestFile.txt"); sender.send();
如果你想使用Outlook与Javamail API
然后使用
smtp-mail.outlook.com
作为更多和完整的工作代码的主机 看看这个答案 。