2012-06-24 20 views
1

我正嘗試使用iOS中的MailCore框架發送郵件。這是我的看法有沒有Load方法:在iOS中使用Mail Core發送郵件時會截斷郵件

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

myMessage = [[CTCoreMessage alloc] init]; 

// Set To 
CTCoreAddress *addrTo = [CTCoreAddress address]; 
[addrTo setEmail:@"[email protected]"]; 
[myMessage setTo:[NSSet setWithObject:addrTo]]; 

// Set From 
CTCoreAddress *addrFrom = [CTCoreAddress address]; 
[addrFrom setEmail:@"[email protected]"]; 
[addrFrom setName:@"bb"]; 
[myMessage setFrom:[NSSet setWithObject:addrFrom]]; 

[myMessage setSubject:@"test"]; 
[myMessage setHTMLBody:@"Отправил это сообщение через SMTP с TSL (используя MailCore) :)"]; 

[CTSMTPConnection sendMessage:myMessage server:@"smtp.gmail.com" username:@"bbbb" 
        password:@"ccc" port:587 useTLS:YES useAuth:YES]; 
[myMessage release]; 
} 

結果我收到一封電子郵件,也就是縮短出於某種原因是這樣的:

Отправил это сообщение через SMTP с T 

可能是什麼原因。正如你所看到的,我使用端口爲587的gmail.com和useTLS = YES。

PS當我使用mail.ru而不是gmail.com時,它是一樣的。看來,這不是服務器問題。

回答

2

這看起來像編碼問題非常可疑。如果你的HTML首先逃避你的非ascii角色呢?

爲了澄清,似乎有人要求HTMLBody的長度(以字符爲單位),然後假設這是正確數量的UTF-8字節發送。

+0

謝謝,就是這樣。有誰知道,我該怎麼做才能發送俄文? – wzbozon

+0

這可能是MailCore中的一個錯誤;也許你可以提交一個錯誤報告。如果它實際上是你發送的HTML,你也可以在傳遞它們之前逃離俄語字符(即「э」將是「&x044D;」) –

+0

Jesse,看看我的下一篇文章。這是非ASC II字符的解決方案。 – wzbozon

0

最後,經過數小時的嘗試,我解決了這個問題。

此方法libEtPan應該改變這樣的:

int mailmime_set_body_text(struct mailmime * build_info, 
       char * data_str, size_t length) 
{ 
    int encoding; 
    struct mailmime_data * data; 

    encoding = mailmime_transfer_encoding_get(build_info->mm_mime_fields); 

    // Added by Dennis !!!Here Russian message was cut off!!! 
    // The reason is that size_t length is a count of chars but used for data length (which is twice as count of chars in UTF-8) 
    // That's why I take the lenght of actual data_str, not length 
    if (encoding == 2) { 
     length = strlen(data_str); 
    } 

    data = mailmime_data_new(MAILMIME_DATA_TEXT, encoding, 
       0, data_str, length, NULL); 
    if (data == NULL) 
    return MAILIMF_ERROR_MEMORY; 

    build_info->mm_data.mm_single = data; 

    return MAILIMF_NO_ERROR; 
} 
+0

有趣!你是否已經向libEtPan人提出這個問題? –

+0

是的,這個問題還有一個解決方案。在這裏,我添加了一些代碼到libEtPan,但它也可以通過MailCore解決它。看我的下一篇文章。 – wzbozon

0

這是libEtPan亭越南安和筆者的解決方案:

的問題是,寧可在這個方法(CTMIME_HtmlPart.m) :

- (struct mailmime *)buildMIMEStruct { 
    struct mailmime_fields *mime_fields; 
    struct mailmime *mime_sub; 
    struct mailmime_content *content; 
    struct mailmime_parameter *param; 
    int r; 

    /* text/html part */ 
    //TODO this needs to be changed, something other than 8BIT should be used 
    mime_fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT); 
    assert(mime_fields != NULL); 

    content = mailmime_content_new_with_str("text/html"); 
    assert(content != NULL); 

    param = mailmime_parameter_new(strdup("charset"), strdup(DEST_CHARSET)); 
    assert(param != NULL); 

    r = clist_append(content->ct_parameters, param); 
    assert(r >= 0); 

    mime_sub = mailmime_new_empty(content, mime_fields); 
    assert(mime_sub != NULL); 
    NSString *str = [self content]; 
    //TODO is strdup necessary? 
    r = mailmime_set_body_text(mime_sub, strdup([str cStringUsingEncoding:NSUTF8StringEncoding]), [str length]); 
    assert(r == MAILIMF_NO_ERROR); 
    return mime_sub; 
} 

你可以看到你傳遞了[str cStringUsingEncoding:NSUTF8StringEncoding]作爲參數。 ,而不是傳遞該數據的大小,而是傳遞該字符串的字符數[str length]。 在這裏,你應該做的:

NSData * data = [str dataUsingEncoding:NSUTF8String]; 
r = mailmime_set_body_text(mime_sub, strdup([data bytes]), [data length]);