Reputation: 323
I copied the code from "quickstart: Sending Gmail" and modified a bit to my app. The code seems to be working fine except that the sender's name is not getting set no matter how I try it.
Here is my complete code:
import java.util.Arrays;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleOAuthConstants;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.Message;
public class Test{
private static final String SCOPE = "https://www.googleapis.com/auth/gmail.modify";
private static final String APP_NAME = "XYZ";
// Path to the client_secret.json file deloper Console
private static final String CLIENT_SECRET_PATH = "src/testapp/auth_client.json";
private static GoogleClientSecrets clientSecrets;
private static GoogleAuthorizationCodeFlow flow;
private static HttpTransport httpTransport;
private static JsonFactory jsonFactory;
private static Gmail service;
public static String getRequestUrl() throws FileNotFoundException, IOException{
httpTransport = new NetHttpTransport();
jsonFactory = new JacksonFactory();
clientSecrets = GoogleClientSecrets.load(jsonFactory, new FileReader(
CLIENT_SECRET_PATH));
// Allow user to authorize via url.
flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE))
.setAccessType("online").setApprovalPrompt("auto").build();
String url = flow.newAuthorizationUrl()
.setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).build();
return url;
}
public static void sendMail(String to, String sub, String body) throws IOException, MessagingException {
Message message = createMessageWithEmail(createEmail(to, "me", sub, body));
message = service.users().messages().send("me", message).execute();
System.out.println("Message id: " + message.getId());
System.out.println(message.toPrettyString());
}
static void emailCredentialSetup(String code) throws IOException {
// Generate Credential using retrieved code.
GoogleTokenResponse response = flow.newTokenRequest(code)
.setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI)
.execute();
GoogleCredential credential = new GoogleCredential()
.setFromTokenResponse(response);
// Create a new authorized Gmail API client
service = new Gmail.Builder(httpTransport, jsonFactory,
credential).setApplicationName(APP_NAME).build();
}
/**
* Create a MimeMessage using the parameters provided.
*
* @param to Email address of the receiver.
* @param from Email address of the sender, the mailbox account.
* @param subject Subject of the email.
* @param bodyText Body text of the email.
* @return MimeMessage to be used to send email.
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
private static MimeMessage createEmail(String to, String from, String subject,
String bodyText) throws MessagingException, UnsupportedEncodingException {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage email = new MimeMessage(session);
email.setFrom(new InternetAddress(from, "SPecial message"));
email.addRecipient(javax.mail.Message.RecipientType.TO,
new InternetAddress(to));
email.setSubject(subject);
email.setText(bodyText);
return email;
}
/**
* Create a Message from an email
*
* @param email Email to be set to raw of message
* @return Message containing base64 encoded email.
* @throws IOException
* @throws MessagingException
*/
private static Message createMessageWithEmail(MimeMessage email)
throws MessagingException, IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
email.writeTo(baos);
String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
Message message = new Message();
message.setRaw(encodedEmail);
return message;
}
public static void main(String[] args) throws FileNotFoundException, IOException, MessagingException {
System.out.println(getRequestUrl());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
emailCredentialSetup(br.readLine());
sendMail("[email protected]", "TEST1", "Hello");
}
}
Can somebody help me in setting the sender name to a custom string? I tried setting the name to "SPecial message" after some googling but it's not working.
Upvotes: 0
Views: 2328
Reputation: 7159
Seems from you're code you're doing:
email.setFrom(new InternetAddress("me", "SPecial message"));
which is trying to use "me" as the email address in the email headers, that won't work. You need to set that to the user's real email address, or just not supply a From header to get it set automatically. (If the email address in the From header is wrong for the user, it removes the whole header and sets a valid one.)
Upvotes: 2
Reputation: 320
Remove space from your name "Special Message" try sending it this way "SpecialMessage" that should work.
Upvotes: 0